diff options
Diffstat (limited to 'devtools/client')
553 files changed, 3690 insertions, 2338 deletions
diff --git a/devtools/client/.eslintrc.js b/devtools/client/.eslintrc.js index 81eb6568ee..e5e1918b86 100644 --- a/devtools/client/.eslintrc.js +++ b/devtools/client/.eslintrc.js @@ -14,4 +14,13 @@ module.exports = { // content privileged windows, where ownerGlobal doesn't exist. "mozilla/use-ownerGlobal": "off", }, + overrides: [ + { + // Tests verify the exact source code of these functions + files: ["inspector/markup/test/doc_markup_events_*.html"], + rules: { + "no-unused-vars": "off", + }, + }, + ], }; diff --git a/devtools/client/aboutdebugging/src/actions/debug-targets.js b/devtools/client/aboutdebugging/src/actions/debug-targets.js index 9ac3bee3b5..fa768c3d22 100644 --- a/devtools/client/aboutdebugging/src/actions/debug-targets.js +++ b/devtools/client/aboutdebugging/src/actions/debug-targets.js @@ -7,7 +7,7 @@ const { AddonManager } = ChromeUtils.importESModule( "resource://gre/modules/AddonManager.sys.mjs", // AddonManager is a singleton, never create two instances of it. - { loadInDevToolsLoader: false } + { global: "shared" } ); const { remoteClientManager, @@ -133,7 +133,7 @@ function installTemporaryExtension() { const message = l10n.getString( "about-debugging-tmp-extension-install-message" ); - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: TEMPORARY_EXTENSION_INSTALL_START }); const file = await openTemporaryExtension(window, message); try { @@ -146,7 +146,7 @@ function installTemporaryExtension() { } function pushServiceWorker(id, registrationFront) { - return async ({ dispatch, getState }) => { + return async () => { try { // The push button is only available if canDebugServiceWorkers is true. // With this configuration, `push` should always be called on the diff --git a/devtools/client/aboutdebugging/src/actions/runtimes.js b/devtools/client/aboutdebugging/src/actions/runtimes.js index fba620951e..52148f80b2 100644 --- a/devtools/client/aboutdebugging/src/actions/runtimes.js +++ b/devtools/client/aboutdebugging/src/actions/runtimes.js @@ -202,7 +202,7 @@ function connectRuntime(id) { } function createThisFirefoxRuntime() { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { const thisFirefoxRuntime = { id: RUNTIMES.THIS_FIREFOX, isConnecting: false, @@ -488,7 +488,7 @@ function updateRemoteRuntimes(runtimes, type) { * before leaving about:debugging. */ function removeRuntimeListeners() { - return ({ dispatch, getState }) => { + return ({ getState }) => { const allRuntimes = getAllRuntimes(getState().runtimes); const remoteRuntimes = allRuntimes.filter( r => r.type !== RUNTIMES.THIS_FIREFOX diff --git a/devtools/client/aboutdebugging/src/actions/telemetry.js b/devtools/client/aboutdebugging/src/actions/telemetry.js index b418c77a50..d90b5f49e1 100644 --- a/devtools/client/aboutdebugging/src/actions/telemetry.js +++ b/devtools/client/aboutdebugging/src/actions/telemetry.js @@ -13,7 +13,7 @@ const { * be processed by the event recording middleware. */ function recordTelemetryEvent(method, details) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: TELEMETRY_RECORD, method, details }); }; } diff --git a/devtools/client/aboutdebugging/src/actions/ui.js b/devtools/client/aboutdebugging/src/actions/ui.js index fb676cefd6..f8afac8bbd 100644 --- a/devtools/client/aboutdebugging/src/actions/ui.js +++ b/devtools/client/aboutdebugging/src/actions/ui.js @@ -97,13 +97,13 @@ function updateDebugTargetCollapsibility(key, isCollapsed) { } function addNetworkLocation(location) { - return ({ dispatch, getState }) => { + return () => { NetworkLocationsModule.addNetworkLocation(location); }; } function removeNetworkLocation(location) { - return ({ dispatch, getState }) => { + return () => { NetworkLocationsModule.removeNetworkLocation(location); }; } @@ -133,7 +133,7 @@ function updateAdbReady(isAdbReady) { } function updateNetworkLocations(locations) { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: NETWORK_LOCATIONS_UPDATE_START }); try { await dispatch(Actions.updateNetworkRuntimes(locations)); @@ -145,7 +145,7 @@ function updateNetworkLocations(locations) { } function installAdbAddon() { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: ADB_ADDON_INSTALL_START }); try { @@ -160,7 +160,7 @@ function installAdbAddon() { } function uninstallAdbAddon() { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: ADB_ADDON_UNINSTALL_START }); try { diff --git a/devtools/client/aboutdebugging/src/components/debugtarget/DebugTargetPane.js b/devtools/client/aboutdebugging/src/components/debugtarget/DebugTargetPane.js index abfa1042b8..dec9cd792d 100644 --- a/devtools/client/aboutdebugging/src/components/debugtarget/DebugTargetPane.js +++ b/devtools/client/aboutdebugging/src/components/debugtarget/DebugTargetPane.js @@ -106,7 +106,7 @@ class DebugTargetPane extends PureComponent { "undecorated-link debug-target-pane__title " + "qa-debug-target-pane-title", title, - onClick: e => this.toggleCollapsibility(), + onClick: () => this.toggleCollapsibility(), }, dom.h2( { className: "main-subheading debug-target-pane__heading" }, diff --git a/devtools/client/aboutdebugging/src/components/debugtarget/InspectAction.js b/devtools/client/aboutdebugging/src/components/debugtarget/InspectAction.js index f7aff438a4..13370ecdf3 100644 --- a/devtools/client/aboutdebugging/src/components/debugtarget/InspectAction.js +++ b/devtools/client/aboutdebugging/src/components/debugtarget/InspectAction.js @@ -44,7 +44,7 @@ class InspectAction extends PureComponent { }, dom.button( { - onClick: e => this.inspect(), + onClick: () => this.inspect(), className: "default-button qa-debug-target-inspect-button", disabled, title, diff --git a/devtools/client/aboutdebugging/src/components/debugtarget/ServiceWorkerAdditionalActions.js b/devtools/client/aboutdebugging/src/components/debugtarget/ServiceWorkerAdditionalActions.js index 38262ad511..aed0719d1f 100644 --- a/devtools/client/aboutdebugging/src/components/debugtarget/ServiceWorkerAdditionalActions.js +++ b/devtools/client/aboutdebugging/src/components/debugtarget/ServiceWorkerAdditionalActions.js @@ -48,7 +48,7 @@ class _ActionButton extends PureComponent { { className, disabled, - onClick: e => onClick(), + onClick: () => onClick(), title: disabled && disabledTitle ? disabledTitle : undefined, }, this.props.children @@ -102,7 +102,7 @@ class ServiceWorkerAdditionalActions extends PureComponent { { className, disabled, - onClick: e => onClick(), + onClick: () => onClick(), }, labelId ) diff --git a/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionAdditionalActions.js b/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionAdditionalActions.js index 44b7d3e167..806ddb6ac9 100644 --- a/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionAdditionalActions.js +++ b/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionAdditionalActions.js @@ -125,7 +125,7 @@ class TemporaryExtensionAdditionalActions extends PureComponent { className: "default-button default-button--micro " + "qa-temporary-extension-terminate-bgscript-button", - onClick: e => this.terminateBackgroundScript(), + onClick: () => this.terminateBackgroundScript(), }, "Terminate Background Script" ) @@ -142,7 +142,7 @@ class TemporaryExtensionAdditionalActions extends PureComponent { className: "default-button default-button--micro " + "qa-temporary-extension-remove-button", - onClick: e => this.remove(), + onClick: () => this.remove(), }, "Remove" ) @@ -166,7 +166,7 @@ class TemporaryExtensionAdditionalActions extends PureComponent { className: "default-button default-button--micro " + "qa-temporary-extension-reload-button", - onClick: e => this.reload(), + onClick: () => this.reload(), }, "Reload" ) diff --git a/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionInstaller.js b/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionInstaller.js index e515c647ec..fe229d2da6 100644 --- a/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionInstaller.js +++ b/devtools/client/aboutdebugging/src/components/debugtarget/TemporaryExtensionInstaller.js @@ -41,7 +41,7 @@ class TemporaryExtensionInstaller extends PureComponent { dom.button( { className: `${className} default-button qa-temporary-extension-install-button`, - onClick: e => this.install(), + onClick: () => this.install(), }, "Load Temporary Add-on…" ) diff --git a/devtools/client/aboutdebugging/src/middleware/extension-component-data.js b/devtools/client/aboutdebugging/src/middleware/extension-component-data.js index 5987f36398..53e6fd22f1 100644 --- a/devtools/client/aboutdebugging/src/middleware/extension-component-data.js +++ b/devtools/client/aboutdebugging/src/middleware/extension-component-data.js @@ -18,7 +18,7 @@ const { * This middleware converts extensions object that get from DevToolsClient.listAddons() * to data which is used in DebugTargetItem. */ -const extensionComponentDataMiddleware = store => next => action => { +const extensionComponentDataMiddleware = () => next => action => { switch (action.type) { case REQUEST_EXTENSIONS_SUCCESS: { action.installedExtensions = toComponentData(action.installedExtensions); diff --git a/devtools/client/aboutdebugging/src/middleware/process-component-data.js b/devtools/client/aboutdebugging/src/middleware/process-component-data.js index d5cdc6365b..c4947453a0 100644 --- a/devtools/client/aboutdebugging/src/middleware/process-component-data.js +++ b/devtools/client/aboutdebugging/src/middleware/process-component-data.js @@ -17,7 +17,7 @@ const { * This middleware converts tabs object that get from DevToolsClient.listProcesses() to * data which is used in DebugTargetItem. */ -const processComponentDataMiddleware = store => next => action => { +const processComponentDataMiddleware = () => next => action => { switch (action.type) { case REQUEST_PROCESSES_SUCCESS: { const mainProcessComponentData = toMainProcessComponentData( @@ -31,7 +31,7 @@ const processComponentDataMiddleware = store => next => action => { return next(action); }; -function toMainProcessComponentData(process) { +function toMainProcessComponentData() { const type = DEBUG_TARGETS.PROCESS; const icon = "chrome://devtools/skin/images/aboutdebugging-process-icon.svg"; diff --git a/devtools/client/aboutdebugging/src/middleware/tab-component-data.js b/devtools/client/aboutdebugging/src/middleware/tab-component-data.js index f468926f81..2de8dca86f 100644 --- a/devtools/client/aboutdebugging/src/middleware/tab-component-data.js +++ b/devtools/client/aboutdebugging/src/middleware/tab-component-data.js @@ -13,7 +13,7 @@ const { * This middleware converts tabs object that get from DevToolsClient.listTabs() to data * which is used in DebugTargetItem. */ -const tabComponentDataMiddleware = store => next => action => { +const tabComponentDataMiddleware = () => next => action => { switch (action.type) { case REQUEST_TABS_SUCCESS: { action.tabs = toComponentData(action.tabs); diff --git a/devtools/client/aboutdebugging/src/middleware/worker-component-data.js b/devtools/client/aboutdebugging/src/middleware/worker-component-data.js index 178c99e322..cf13eccd5d 100644 --- a/devtools/client/aboutdebugging/src/middleware/worker-component-data.js +++ b/devtools/client/aboutdebugging/src/middleware/worker-component-data.js @@ -15,7 +15,7 @@ const { * This middleware converts workers object that get from DevToolsClient.listAllWorkers() * to data which is used in DebugTargetItem. */ -const workerComponentDataMiddleware = store => next => action => { +const workerComponentDataMiddleware = () => next => action => { switch (action.type) { case REQUEST_WORKERS_SUCCESS: { action.otherWorkers = toComponentData(action.otherWorkers); diff --git a/devtools/client/aboutdebugging/src/modules/extensions-helper.js b/devtools/client/aboutdebugging/src/modules/extensions-helper.js index ec0d7c2661..cf6c7641e9 100644 --- a/devtools/client/aboutdebugging/src/modules/extensions-helper.js +++ b/devtools/client/aboutdebugging/src/modules/extensions-helper.js @@ -51,7 +51,7 @@ exports.getExtensionUuid = function (extension) { exports.openTemporaryExtension = function (win, message) { return new Promise(resolve => { const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); - fp.init(win, message, Ci.nsIFilePicker.modeOpen); + fp.init(win.browsingContext, message, Ci.nsIFilePicker.modeOpen); // Try to set the last directory used as "displayDirectory". try { diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_temporary_install_path.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_temporary_install_path.js index a6f9fde0c1..da2596ef53 100644 --- a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_temporary_install_path.js +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_temporary_install_path.js @@ -45,7 +45,7 @@ add_task(async function testPreferenceRetrievedWhenInstallingExtension() { await selectThisFirefoxPage(document, window.AboutDebugging.store); const MockFilePicker = SpecialPowers.MockFilePicker; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); const onFilePickerShown = new Promise(resolve => { MockFilePicker.showCallback = fp => { resolve(fp); diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js index 742791668d..4fd0b727d6 100644 --- a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js @@ -85,7 +85,7 @@ add_task(async function () { info("Wait for next interupt in the worker thread"); await clickElement(dbg, "pause"); - await waitForState(dbg, state => getIsWaitingOnBreak(getCurrentThread())); + await waitForState(dbg, () => getIsWaitingOnBreak(getCurrentThread())); info("Trigger some code in the worker and wait for pause"); await SpecialPowers.spawn(swTab.linkedBrowser, [], async function () { diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_sidebar_connection_state.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_sidebar_connection_state.js index d4d31a7522..757f596891 100644 --- a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_sidebar_connection_state.js +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_sidebar_connection_state.js @@ -39,7 +39,7 @@ add_task(async function () { usbRuntimeSidebarItem.querySelector(".qa-connect-button"); info("Simulate to happen connection error"); - mocks.runtimeClientFactoryMock.createClientForRuntime = async runtime => { + mocks.runtimeClientFactoryMock.createClientForRuntime = async () => { throw new Error("Dummy connection error"); }; diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_telemetry_connection_attempt.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_telemetry_connection_attempt.js index a5836ad50a..925ab62479 100644 --- a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_telemetry_connection_attempt.js +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_telemetry_connection_attempt.js @@ -54,7 +54,7 @@ add_task(async function testSuccessfulConnectionAttempt() { add_task(async function testFailedConnectionAttempt() { const { doc, mocks, runtimeId, sessionId, tab } = await setupConnectionAttemptTest(); - mocks.runtimeClientFactoryMock.createClientForRuntime = async runtime => { + mocks.runtimeClientFactoryMock.createClientForRuntime = async () => { throw new Error("failed"); }; @@ -168,8 +168,8 @@ add_task(async function testCancelledConnectionAttempt() { await setupConnectionAttemptTest(); info("Simulate a connection timeout"); - mocks.runtimeClientFactoryMock.createClientForRuntime = async runtime => { - await new Promise(r => {}); + mocks.runtimeClientFactoryMock.createClientForRuntime = async () => { + await new Promise(() => {}); }; info("Click on the connect button and wait for the error message"); diff --git a/devtools/client/aboutdebugging/test/browser/helper-addons.js b/devtools/client/aboutdebugging/test/browser/helper-addons.js index e3a8be3761..dd299a3c0f 100644 --- a/devtools/client/aboutdebugging/test/browser/helper-addons.js +++ b/devtools/client/aboutdebugging/test/browser/helper-addons.js @@ -180,7 +180,7 @@ function prepareMockFilePicker(pathOrFile) { // Mock the file picker to select a test addon const MockFilePicker = SpecialPowers.MockFilePicker; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); MockFilePicker.setFiles([file]); } /* exported prepareMockFilePicker */ diff --git a/devtools/client/aboutdebugging/test/browser/helper-mocks.js b/devtools/client/aboutdebugging/test/browser/helper-mocks.js index b1c9c910ff..a8536cf767 100644 --- a/devtools/client/aboutdebugging/test/browser/helper-mocks.js +++ b/devtools/client/aboutdebugging/test/browser/helper-mocks.js @@ -242,9 +242,28 @@ const silenceWorkerUpdates = function () { async function createLocalClientWrapper() { info("Create a local DevToolsClient"); + + // First, instantiate a DevToolsServer, the same way it is being done when running + // firefox --start-debugger-server const { - DevToolsServer, - } = require("resource://devtools/server/devtools-server.js"); + useDistinctSystemPrincipalLoader, + releaseDistinctSystemPrincipalLoader, + } = ChromeUtils.importESModule( + "resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs" + ); + const requester = {}; + const serverLoader = useDistinctSystemPrincipalLoader(requester); + registerCleanupFunction(() => { + releaseDistinctSystemPrincipalLoader(requester); + }); + const { DevToolsServer } = serverLoader.require( + "resource://devtools/server/devtools-server.js" + ); + DevToolsServer.init(); + DevToolsServer.registerAllActors(); + DevToolsServer.allowChromeProcess = true; + + // Then spawn a DevToolsClient connected to this new DevToolsServer const { DevToolsClient, } = require("resource://devtools/client/devtools-client.js"); @@ -252,8 +271,6 @@ async function createLocalClientWrapper() { ClientWrapper, } = require("resource://devtools/client/aboutdebugging/src/modules/client-wrapper.js"); - DevToolsServer.init(); - DevToolsServer.registerAllActors(); const client = new DevToolsClient(DevToolsServer.connectPipe()); await client.connect(); diff --git a/devtools/client/aboutdebugging/test/browser/mocks/helper-adb-mock.js b/devtools/client/aboutdebugging/test/browser/mocks/helper-adb-mock.js index f02ca02ee3..fce594684c 100644 --- a/devtools/client/aboutdebugging/test/browser/mocks/helper-adb-mock.js +++ b/devtools/client/aboutdebugging/test/browser/mocks/helper-adb-mock.js @@ -39,7 +39,7 @@ function disableAdbMock() { */ function createAdbMock() { const adbMock = {}; - adbMock.registerListener = function (listener) { + adbMock.registerListener = function () { console.log("MOCKED METHOD registerListener"); }; @@ -55,7 +55,7 @@ function createAdbMock() { console.log("MOCKED METHOD updateRuntimes"); }; - adbMock.unregisterListener = function (listener) { + adbMock.unregisterListener = function () { console.log("MOCKED METHOD unregisterListener"); }; diff --git a/devtools/client/aboutdebugging/test/browser/mocks/helper-runtime-client-factory-mock.js b/devtools/client/aboutdebugging/test/browser/mocks/helper-runtime-client-factory-mock.js index b74c229fcf..29d7b0ad4d 100644 --- a/devtools/client/aboutdebugging/test/browser/mocks/helper-runtime-client-factory-mock.js +++ b/devtools/client/aboutdebugging/test/browser/mocks/helper-runtime-client-factory-mock.js @@ -67,7 +67,7 @@ function disableRuntimeClientFactoryMock() { */ function createRuntimeClientFactoryMock() { const RuntimeClientFactoryMock = {}; - RuntimeClientFactoryMock.createClientForRuntime = function (runtime) { + RuntimeClientFactoryMock.createClientForRuntime = function () { console.log("MOCKED METHOD createClientForRuntime"); }; diff --git a/devtools/client/aboutdebugging/test/browser/resources/service-workers/fetch-sw.js b/devtools/client/aboutdebugging/test/browser/resources/service-workers/fetch-sw.js index de6ee1fb32..8e71e3b108 100644 --- a/devtools/client/aboutdebugging/test/browser/resources/service-workers/fetch-sw.js +++ b/devtools/client/aboutdebugging/test/browser/resources/service-workers/fetch-sw.js @@ -1,6 +1,6 @@ "use strict"; // Bug 1328293 -self.onfetch = function (event) { +self.onfetch = function () { // do nothing. }; diff --git a/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js b/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js index 637e42e078..465e11a43b 100644 --- a/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js +++ b/devtools/client/aboutdebugging/test/xpcshell/test_runtime_default_preferences.js @@ -194,7 +194,7 @@ add_task(async function test_without_traits_with_error() { function createClientWrapper(preferencesFront) { const clientWrapper = { - getFront: name => { + getFront: () => { return preferencesFront; }, }; diff --git a/devtools/client/accessibility/accessibility-proxy.js b/devtools/client/accessibility/accessibility-proxy.js index 287ea44b71..e96d912593 100644 --- a/devtools/client/accessibility/accessibility-proxy.js +++ b/devtools/client/accessibility/accessibility-proxy.js @@ -518,7 +518,7 @@ class AccessibilityProxy { } } - async onTargetAvailable({ targetFront, isTargetSwitching }) { + async onTargetAvailable({ targetFront }) { targetFront.watchFronts( "accessibility", this.onAccessibilityFrontAvailable, diff --git a/devtools/client/accessibility/components/Accessible.js b/devtools/client/accessibility/components/Accessible.js index 02467ccaab..c679951d1d 100644 --- a/devtools/client/accessibility/components/Accessible.js +++ b/devtools/client/accessibility/components/Accessible.js @@ -285,7 +285,7 @@ class Accessible extends Component { window.emit(EVENTS.NEW_ACCESSIBLE_FRONT_INSPECTED); } - openLink(link, e) { + openLink(link) { openContentLink(link); } diff --git a/devtools/client/accessibility/components/Checks.js b/devtools/client/accessibility/components/Checks.js index f2b4e4835a..7f7bdf1624 100644 --- a/devtools/client/accessibility/components/Checks.js +++ b/devtools/client/accessibility/components/Checks.js @@ -105,7 +105,7 @@ class Checks extends Component { } } -const mapStateToProps = ({ details, ui }) => { +const mapStateToProps = ({ details }) => { const { audit } = details; if (!audit) { return {}; diff --git a/devtools/client/accessibility/panel.js b/devtools/client/accessibility/panel.js index 02c6c8f415..3ebd11afe1 100644 --- a/devtools/client/accessibility/panel.js +++ b/devtools/client/accessibility/panel.js @@ -286,7 +286,7 @@ AccessibilityPanel.prototype = { this._toolbox.component.setToolboxButtons(this._toolbox.toolbarButtons); }, - togglePicker(focus) { + togglePicker() { this.picker && this.picker.toggle(); }, diff --git a/devtools/client/application/initializer.js b/devtools/client/application/initializer.js index fbfcbc1edc..c431945bf0 100644 --- a/devtools/client/application/initializer.js +++ b/devtools/client/application/initializer.js @@ -55,7 +55,7 @@ const { * called to start the UI for the panel. */ window.Application = { - async bootstrap({ toolbox, commands, panel }) { + async bootstrap({ toolbox, commands }) { // bind event handlers to `this` this.updateDomain = this.updateDomain.bind(this); diff --git a/devtools/client/application/src/actions/manifest.js b/devtools/client/application/src/actions/manifest.js index 050fab2b89..ccb62ff13c 100644 --- a/devtools/client/application/src/actions/manifest.js +++ b/devtools/client/application/src/actions/manifest.js @@ -20,7 +20,7 @@ const { } = require("resource://devtools/client/application/src/constants.js"); function fetchManifest() { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: FETCH_MANIFEST_START }); try { const manifest = await services.fetchManifest(); diff --git a/devtools/client/application/src/components/manifest/ManifestIssue.js b/devtools/client/application/src/components/manifest/ManifestIssue.js index 6a9680d604..0ec25734b0 100644 --- a/devtools/client/application/src/components/manifest/ManifestIssue.js +++ b/devtools/client/application/src/components/manifest/ManifestIssue.js @@ -38,7 +38,7 @@ class ManifestIssue extends PureComponent { switch (level) { case MANIFEST_ISSUE_LEVELS.WARNING: return { - src: "chrome://devtools/skin/images/alert-small.svg", + src: "resource://devtools-shared-images/alert-small.svg", localizationId: "icon-warning", }; case MANIFEST_ISSUE_LEVELS.ERROR: diff --git a/devtools/client/application/src/components/service-workers/Worker.js b/devtools/client/application/src/components/service-workers/Worker.js index bc95e084a9..51cb45c1a6 100644 --- a/devtools/client/application/src/components/service-workers/Worker.js +++ b/devtools/client/application/src/components/service-workers/Worker.js @@ -118,7 +118,7 @@ class Worker extends PureComponent { return this.props.worker.stateText; } - getClassNameForStatus(baseClass) { + getClassNameForStatus() { const { state } = this.props.worker; switch (state) { diff --git a/devtools/client/application/src/middleware/event-telemetry.js b/devtools/client/application/src/middleware/event-telemetry.js index 60129d2bde..aa4aa7b62b 100644 --- a/devtools/client/application/src/middleware/event-telemetry.js +++ b/devtools/client/application/src/middleware/event-telemetry.js @@ -15,7 +15,7 @@ function eventTelemetryMiddleware(telemetry) { telemetry.recordEvent(method, "application", null, details); } - return store => next => action => { + return () => next => action => { switch (action.type) { // ui telemetry case UPDATE_SELECTED_PAGE: diff --git a/devtools/client/application/src/reducers/manifest-state.js b/devtools/client/application/src/reducers/manifest-state.js index 61a2fa6759..1f7fbf0bb6 100644 --- a/devtools/client/application/src/reducers/manifest-state.js +++ b/devtools/client/application/src/reducers/manifest-state.js @@ -67,7 +67,7 @@ function _processRawManifestMembers(rawManifest) { // filter out extra metadata members (those with moz_ prefix) and icons const rawMembers = Object.entries(rawManifest).filter( - ([key, value]) => !key.startsWith("moz_") && !(key === "icons") + ([key]) => !key.startsWith("moz_") && !(key === "icons") ); for (const [key, value] of rawMembers) { diff --git a/devtools/client/application/test/browser/browser_application_panel_telemetry-debug-worker.js b/devtools/client/application/test/browser/browser_application_panel_telemetry-debug-worker.js index fe95dabd5e..49f43d47c8 100644 --- a/devtools/client/application/test/browser/browser_application_panel_telemetry-debug-worker.js +++ b/devtools/client/application/test/browser/browser_application_panel_telemetry-debug-worker.js @@ -34,7 +34,11 @@ add_task(async function () { const events = getTelemetryEvents("jsdebugger"); const openToolboxEvent = events.find(event => event.method == "enter"); - ok(openToolboxEvent.session_id > 0, "Event has a valid session id"); + Assert.greater( + Number(openToolboxEvent.session_id), + 0, + "Event has a valid session id" + ); is( openToolboxEvent.start_state, "application", diff --git a/devtools/client/application/test/browser/head.js b/devtools/client/application/test/browser/head.js index 6b7e67ff8d..265fd44bf0 100644 --- a/devtools/client/application/test/browser/head.js +++ b/devtools/client/application/test/browser/head.js @@ -82,7 +82,11 @@ function checkTelemetryEvent(expectedEvent, objectName = "application") { // assert we only got 1 event with a valid session ID is(events.length, 1, "There was only 1 event logged"); const [event] = events; - ok(event.session_id > 0, "There is a valid session_id in the event"); + Assert.greater( + Number(event.session_id), + 0, + "There is a valid session_id in the event" + ); // assert expected data Assert.deepEqual(event, { ...expectedEvent, session_id: event.session_id }); diff --git a/devtools/client/application/test/node/components/manifest/__snapshots__/components_application_panel-ManifestIssue.test.js.snap b/devtools/client/application/test/node/components/manifest/__snapshots__/components_application_panel-ManifestIssue.test.js.snap index 99e83af1f2..25db8bee3c 100644 --- a/devtools/client/application/test/node/components/manifest/__snapshots__/components_application_panel-ManifestIssue.test.js.snap +++ b/devtools/client/application/test/node/components/manifest/__snapshots__/components_application_panel-ManifestIssue.test.js.snap @@ -15,7 +15,7 @@ exports[`ManifestIssue renders the expected snapshot for a warning 1`] = ` > <img className="manifest-issue__icon manifest-issue__icon--warning" - src="chrome://devtools/skin/images/alert-small.svg" + src="resource://devtools-shared-images/alert-small.svg" /> </Localized> <span> diff --git a/devtools/client/bin/devtools-node-test-runner.js b/devtools/client/bin/devtools-node-test-runner.js index e347ee5855..087664b957 100644 --- a/devtools/client/bin/devtools-node-test-runner.js +++ b/devtools/client/bin/devtools-node-test-runner.js @@ -104,7 +104,7 @@ function getErrors(suite, out, err, testPath) { const JEST_ERROR_SUMMARY_REGEX = /\s●\s/; -function getJestErrors(out, err) { +function getJestErrors(out) { // The string out has extra content before the JSON object starts. const jestJsonOut = out.substring(out.indexOf("{"), out.lastIndexOf("}") + 1); const results = JSON.parse(jestJsonOut); diff --git a/devtools/client/debugger/dist/parser-worker.js b/devtools/client/debugger/dist/parser-worker.js index ea014d7529..f120a4753b 100644 --- a/devtools/client/debugger/dist/parser-worker.js +++ b/devtools/client/debugger/dist/parser-worker.js @@ -41012,7 +41012,7 @@ Please specify the "importAttributesKeyword" generator option, whose value can b function hasTopLevelAwait(ast) { const hasAwait = hasNode( ast, - (node, ancestors, b) => libExports$2.isAwaitExpression(node) && isTopLevel(ancestors) + (node, ancestors) => libExports$2.isAwaitExpression(node) && isTopLevel(ancestors) ); return hasAwait; diff --git a/devtools/client/debugger/images/sourcemap-active.svg b/devtools/client/debugger/images/sourcemap-active.svg new file mode 100644 index 0000000000..e86ddc68ec --- /dev/null +++ b/devtools/client/debugger/images/sourcemap-active.svg @@ -0,0 +1,6 @@ +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"> + <path fill="context-fill" fill-rule="evenodd" clip-rule="evenodd" d="M8.17949 1.03333C8.06395 0.988891 7.93604 0.988891 7.82051 1.03333L1.32051 3.53333C1.12741 3.60759 1 3.79311 1 4V12C1 12.2069 1.12741 12.3924 1.32051 12.4667L7.82051 14.9667C7.93604 15.0111 8.06395 15.0111 8.17949 14.9667L14.6795 12.4667C14.8726 12.3924 15 12.2069 15 12V4C15 3.79311 14.8726 3.60759 14.6795 3.53333L8.17949 1.03333ZM8.5 13.772V6.8434L14 4.72801V11.6566L8.5 13.772ZM8 5.96429L13.1072 4L8 2.03571L2.89284 4L8 5.96429Z"/> +</svg> diff --git a/devtools/client/debugger/images/sourcemap-disabled.svg b/devtools/client/debugger/images/sourcemap-disabled.svg new file mode 100644 index 0000000000..15ce9964df --- /dev/null +++ b/devtools/client/debugger/images/sourcemap-disabled.svg @@ -0,0 +1,7 @@ +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> +<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"> + <path fill-rule="evenodd" clip-rule="evenodd" d="M0.146447 14.1464C-0.0488155 14.3417 -0.0488155 14.6583 0.146447 14.8536C0.341709 15.0488 0.658291 15.0488 0.853553 14.8536L14.8536 0.853553C15.0488 0.658291 15.0488 0.341709 14.8536 0.146447C14.6583 -0.0488156 14.3417 -0.0488154 14.1464 0.146447L11.6262 2.66668L8.67949 1.53333C8.56396 1.48889 8.43604 1.48889 8.32051 1.53333L1.82051 4.03333C1.62741 4.10759 1.5 4.29311 1.5 4.5V12.5C1.5 12.5836 1.52082 12.6638 1.55839 12.7345L0.146447 14.1464ZM8.0151 6.27779L10.8524 3.44048L8.5 2.53571L3.39284 4.5L8.0151 6.27779Z" fill="context-fill"/> + <path d="M3.77977 13.7202L9 8.5V14.272L14.5 12.1566V3.77199L15.1795 4.03333C15.3726 4.10759 15.5 4.29311 15.5 4.5V12.5C15.5 12.7069 15.3726 12.8924 15.1795 12.9667L8.67949 15.4667C8.56396 15.5111 8.43604 15.5111 8.32051 15.4667L3.77977 13.7202Z" fill="context-fill"/> +</svg> diff --git a/devtools/client/debugger/images/sourcemap.svg b/devtools/client/debugger/images/sourcemap.svg index a760dc6edc..e53133148c 100644 --- a/devtools/client/debugger/images/sourcemap.svg +++ b/devtools/client/debugger/images/sourcemap.svg @@ -3,4 +3,4 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"> <path fill="context-fill" fill-rule="evenodd" clip-rule="evenodd" d="M8.17949 1.03333C8.06395 0.988891 7.93604 0.988891 7.82051 1.03333L1.32051 3.53333C1.12741 3.60759 1 3.79311 1 4V12C1 12.2069 1.12741 12.3924 1.32051 12.4667L7.82051 14.9667C7.93604 15.0111 8.06395 15.0111 8.17949 14.9667L14.6795 12.4667C14.8726 12.3924 15 12.2069 15 12V4C15 3.79311 14.8726 3.60759 14.6795 3.53333L8.17949 1.03333ZM8.5 13.772V6.8434L14 4.72801V11.6566L8.5 13.772ZM8 5.96429L13.1072 4L11.25 3.28571L6.14284 5.25L8 5.96429ZM8 2.03571L9.85716 2.75L4.75 4.71429L2.89284 4L8 2.03571Z"/> -</svg>
\ No newline at end of file +</svg> diff --git a/devtools/client/debugger/src/.eslintrc.js b/devtools/client/debugger/src/.eslintrc.js index b71126767c..ec6d77b504 100644 --- a/devtools/client/debugger/src/.eslintrc.js +++ b/devtools/client/debugger/src/.eslintrc.js @@ -108,9 +108,6 @@ module.exports = { "global-strict": 0, // Only useful in a node environment. "handle-callback-err": 0, - // Don't enforce the maximum depth that blocks can be nested. The complexity - // rule is a better rule to check this. - "max-depth": 0, // Maximum depth callbacks can be nested. "max-nested-callbacks": [2, 4], // Don't limit the number of parameters that can be used in a function. @@ -133,10 +130,6 @@ module.exports = { "no-catch-shadow": 2, // Disallow assignment in conditional expressions. "no-cond-assign": 2, - // Allow using the console API. - "no-console": 0, - // Allow using constant expressions in conditions like while (true) - "no-constant-condition": 0, // Allow use of the continue statement. "no-continue": 0, // Disallow control characters in regular expressions. @@ -267,10 +260,6 @@ module.exports = { "no-var": 0, // Allow using TODO/FIXME comments. "no-warning-comments": 0, - // Dont require method and property shorthand syntax for object literals. - // We use this in the code a lot, but not consistently, and this seems more - // like something to check at code review time. - "object-shorthand": 0, // Allow more than one variable declaration per function. "one-var": 0, // Require use of the second argument for parseInt(). diff --git a/devtools/client/debugger/src/actions/ast/setInScopeLines.js b/devtools/client/debugger/src/actions/ast/setInScopeLines.js index 72bd33b59f..5a76ab7f65 100644 --- a/devtools/client/debugger/src/actions/ast/setInScopeLines.js +++ b/devtools/client/debugger/src/actions/ast/setInScopeLines.js @@ -27,11 +27,7 @@ function getOutOfScopeLines(outOfScopeLocations) { return uniqueLines; } -async function getInScopeLines( - location, - sourceTextContent, - { dispatch, getState, parserWorker } -) { +async function getInScopeLines(location, sourceTextContent, { parserWorker }) { let locations = null; if (location.line && parserWorker.isLocationSupported(location)) { locations = await parserWorker.findOutOfScopeLocations(location); diff --git a/devtools/client/debugger/src/actions/breakpoints/index.js b/devtools/client/debugger/src/actions/breakpoints/index.js index 2125ec9ec7..94e9028a1b 100644 --- a/devtools/client/debugger/src/actions/breakpoints/index.js +++ b/devtools/client/debugger/src/actions/breakpoints/index.js @@ -44,7 +44,7 @@ export function addHiddenBreakpoint(location) { * @static */ export function disableBreakpointsInSource(source) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { const breakpoints = getBreakpointsForSource(getState(), source); for (const breakpoint of breakpoints) { if (!breakpoint.disabled) { @@ -61,7 +61,7 @@ export function disableBreakpointsInSource(source) { * @static */ export function enableBreakpointsInSource(source) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { const breakpoints = getBreakpointsForSource(getState(), source); for (const breakpoint of breakpoints) { if (breakpoint.disabled) { @@ -78,7 +78,7 @@ export function enableBreakpointsInSource(source) { * @static */ export function toggleAllBreakpoints(shouldDisableBreakpoints) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { const breakpoints = getBreakpointsList(getState()); for (const breakpoint of breakpoints) { @@ -149,7 +149,7 @@ export function removeBreakpoints(breakpoints) { * @static */ export function removeBreakpointsInSource(source) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { const breakpoints = getBreakpointsForSource(getState(), source); for (const breakpoint of breakpoints) { dispatch(removeBreakpoint(breakpoint)); @@ -271,7 +271,7 @@ export function enableBreakpointsAtLine(source, line) { } export function toggleDisabledBreakpoint(breakpoint) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { if (!breakpoint.disabled) { return dispatch(disableBreakpoint(breakpoint)); } @@ -356,7 +356,7 @@ export function togglePauseOnAny() { } export function setXHRBreakpoint(path, method) { - return ({ dispatch, getState, client }) => { + return ({ dispatch, client }) => { const breakpoint = createXHRBreakpoint(path, method); return dispatch({ diff --git a/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js b/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js index b24912de58..aec56664d0 100644 --- a/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js +++ b/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js @@ -14,7 +14,7 @@ import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/ import { getSource } from "../../selectors/index"; import { addBreakpoint, removeBreakpointAtGeneratedLocation } from "./modify"; -async function findBreakpointPosition({ getState, dispatch }, location) { +async function findBreakpointPosition({ dispatch }, location) { const positions = await dispatch(setBreakpointPositions(location)); const position = findPosition(positions, location); diff --git a/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap b/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap index e6abad25d5..69bc4a08b4 100644 --- a/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap +++ b/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap @@ -24,6 +24,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, "sourceActor": null, @@ -48,6 +50,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, "sourceActor": null, @@ -59,7 +63,6 @@ Array [ "thread": undefined, }, ], - "filename": "a", "source": Object { "displayURL": Object { "fileExtension": "", @@ -75,6 +78,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, }, @@ -107,6 +112,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, "sourceActor": null, @@ -131,6 +138,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, "sourceActor": null, @@ -142,7 +151,6 @@ Array [ "thread": undefined, }, ], - "filename": "a", "source": Object { "displayURL": Object { "fileExtension": "", @@ -158,6 +166,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "a", + "shortName": "a", "url": "http://localhost:8000/examples/a", }, }, diff --git a/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js b/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js index 39ec2f1589..999912966b 100644 --- a/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js +++ b/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js @@ -85,7 +85,7 @@ export function showEditorCreateBreakpointContextMenu( location, lineText ) { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { const items = createBreakpointItems(location, lineText, dispatch); showMenu(event, items); diff --git a/devtools/client/debugger/src/actions/context-menus/editor.js b/devtools/client/debugger/src/actions/context-menus/editor.js index 1125790a9b..1cad1e2131 100644 --- a/devtools/client/debugger/src/actions/context-menus/editor.js +++ b/devtools/client/debugger/src/actions/context-menus/editor.js @@ -8,7 +8,6 @@ import { copyToTheClipboard } from "../../utils/clipboard"; import { isPretty, getRawSourceURL, - getFilename, shouldBlackbox, findBlackBoxRange, } from "../../utils/source"; @@ -255,7 +254,7 @@ const blackBoxLinesMenuItem = ( editor, blackboxedRanges, isSourceOnIgnoreList, - clickedLine = null, + clickedLine, dispatch ) => { const { codeMirror } = editor; @@ -321,7 +320,7 @@ const downloadFileItem = (selectedSource, selectedContent) => ({ id: "node-menu-download-file", label: L10N.getStr("downloadFile.label"), accesskey: L10N.getStr("downloadFile.accesskey"), - click: () => downloadFile(selectedContent, getFilename(selectedSource)), + click: () => downloadFile(selectedContent, selectedSource.shortName), }); const inlinePreviewItem = dispatch => ({ diff --git a/devtools/client/debugger/src/actions/context-menus/frame.js b/devtools/client/debugger/src/actions/context-menus/frame.js index 1d287b1028..a517b55e07 100644 --- a/devtools/client/debugger/src/actions/context-menus/frame.js +++ b/devtools/client/debugger/src/actions/context-menus/frame.js @@ -26,7 +26,7 @@ function formatMenuElement(labelString, click, disabled = false) { }; } -function isValidRestartFrame(frame, callbacks) { +function isValidRestartFrame(frame) { // Any frame state than 'on-stack' is either dismissed by the server // or can potentially cause unexpected errors. // Global frame has frame.callee equal to null and can't be restarted. @@ -34,7 +34,7 @@ function isValidRestartFrame(frame, callbacks) { } function copyStackTrace() { - return async ({ dispatch, getState }) => { + return async ({ getState }) => { const frames = getCurrentThreadFrames(getState()); const shouldDisplayOriginalLocation = getShouldSelectOriginalLocation( getState() diff --git a/devtools/client/debugger/src/actions/expressions.js b/devtools/client/debugger/src/actions/expressions.js index 8ccb6013ba..383f191506 100644 --- a/devtools/client/debugger/src/actions/expressions.js +++ b/devtools/client/debugger/src/actions/expressions.js @@ -23,7 +23,7 @@ import { features } from "../utils/prefs"; * @param {string} input */ export function addExpression(input) { - return async ({ dispatch, getState, parserWorker }) => { + return async ({ dispatch, getState }) => { if (!input) { return null; } @@ -64,7 +64,7 @@ export function clearAutocomplete() { } export function updateExpression(input, expression) { - return async ({ getState, dispatch, parserWorker }) => { + return async ({ dispatch }) => { if (!input) { return; } diff --git a/devtools/client/debugger/src/actions/file-search.js b/devtools/client/debugger/src/actions/file-search.js index cc5794d7ab..fb8cfe8475 100644 --- a/devtools/client/debugger/src/actions/file-search.js +++ b/devtools/client/debugger/src/actions/file-search.js @@ -30,7 +30,7 @@ export function querySearchWorker(query, text, modifiers) { } export function searchContentsForHighlight(query, editor, line, ch) { - return async ({ getState, dispatch }) => { + return async ({ getState }) => { const modifiers = getSearchOptions(getState(), "file-search"); const sourceTextContent = getSelectedSourceTextContent(getState()); diff --git a/devtools/client/debugger/src/actions/navigation.js b/devtools/client/debugger/src/actions/navigation.js index 1b437837c2..839d67a31a 100644 --- a/devtools/client/debugger/src/actions/navigation.js +++ b/devtools/client/debugger/src/actions/navigation.js @@ -18,13 +18,7 @@ import { evaluateExpressionsForCurrentContext } from "../actions/expressions"; * @static */ export function willNavigate(event) { - return async function ({ - dispatch, - getState, - client, - sourceMapLoader, - parserWorker, - }) { + return async function ({ dispatch, getState, sourceMapLoader }) { sourceQueue.clear(); sourceMapLoader.clearSourceMaps(); clearWasmStates(); @@ -42,7 +36,7 @@ export function willNavigate(event) { * @static */ export function navigated() { - return async function ({ getState, dispatch, panel }) { + return async function ({ dispatch, panel }) { try { // Update the watched expressions once the page is fully loaded await dispatch(evaluateExpressionsForCurrentContext()); diff --git a/devtools/client/debugger/src/actions/pause/commands.js b/devtools/client/debugger/src/actions/pause/commands.js index 0bb371bf6e..1623add274 100644 --- a/devtools/client/debugger/src/actions/pause/commands.js +++ b/devtools/client/debugger/src/actions/pause/commands.js @@ -17,7 +17,7 @@ import { recordEvent } from "../../utils/telemetry"; import { validateFrame } from "../../utils/context"; export function selectThread(thread) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { if (getCurrentThread(getState()) === thread) { return; } diff --git a/devtools/client/debugger/src/actions/pause/expandScopes.js b/devtools/client/debugger/src/actions/pause/expandScopes.js index af95f16fea..1f7b7caac1 100644 --- a/devtools/client/debugger/src/actions/pause/expandScopes.js +++ b/devtools/client/debugger/src/actions/pause/expandScopes.js @@ -5,7 +5,7 @@ import { getScopeItemPath } from "../../utils/pause/scopes"; export function setExpandedScope(selectedFrame, item, expanded) { - return function ({ dispatch, getState }) { + return function ({ dispatch }) { return dispatch({ type: "SET_EXPANDED_SCOPE", selectedFrame, diff --git a/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js b/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js index 7b2b1d70cb..7d82fd44a8 100644 --- a/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js +++ b/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js @@ -5,7 +5,7 @@ import { PROMISE } from "../utils/middleware/promise"; export function pauseOnDebuggerStatement(shouldPauseOnDebuggerStatement) { - return ({ dispatch, getState, client }) => { + return ({ dispatch, client }) => { return dispatch({ type: "PAUSE_ON_DEBUGGER_STATEMENT", shouldPauseOnDebuggerStatement, diff --git a/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js b/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js index e7c04ded61..fe2f3e882a 100644 --- a/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js +++ b/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js @@ -14,7 +14,7 @@ export function pauseOnExceptions( shouldPauseOnExceptions, shouldPauseOnCaughtExceptions ) { - return ({ dispatch, getState, client }) => { + return ({ dispatch, client }) => { recordEvent("pause_on_exceptions", { exceptions: shouldPauseOnExceptions, // There's no "n" in the key below (#1463117) diff --git a/devtools/client/debugger/src/actions/pause/resumed.js b/devtools/client/debugger/src/actions/pause/resumed.js index 47d55f84ca..2095bacc3b 100644 --- a/devtools/client/debugger/src/actions/pause/resumed.js +++ b/devtools/client/debugger/src/actions/pause/resumed.js @@ -14,7 +14,7 @@ import { inDebuggerEval } from "../../utils/pause/index"; * Debugger has just resumed. */ export function resumed(thread) { - return async ({ dispatch, client, getState }) => { + return async ({ dispatch, getState }) => { const why = getPauseReason(getState(), thread); const wasPausedInEval = inDebuggerEval(why); const wasStepping = isStepping(getState(), thread); diff --git a/devtools/client/debugger/src/actions/pause/tests/pause.spec.js b/devtools/client/debugger/src/actions/pause/tests/pause.spec.js index f8bd87375a..6c69ac4661 100644 --- a/devtools/client/debugger/src/actions/pause/tests/pause.spec.js +++ b/devtools/client/debugger/src/actions/pause/tests/pause.spec.js @@ -25,7 +25,7 @@ const mockCommandClient = { getFrames: async () => [], setBreakpoint: () => new Promise(_resolve => {}), sourceContents: ({ source }) => { - return new Promise((resolve, reject) => { + return new Promise(resolve => { switch (source) { case "foo1": return resolve({ @@ -184,7 +184,7 @@ describe("pause", () => { it("maps frame to original frames", async () => { const sourceMapLoaderMock = { - getOriginalStackFrames: loc => Promise.resolve(originStackFrames), + getOriginalStackFrames: () => Promise.resolve(originStackFrames), getOriginalLocation: () => Promise.resolve(debuggerToSourceMapLocation(originalLocation)), getOriginalLocations: async items => diff --git a/devtools/client/debugger/src/actions/preview.js b/devtools/client/debugger/src/actions/preview.js index c3bc8dbffd..3b3637e2c0 100644 --- a/devtools/client/debugger/src/actions/preview.js +++ b/devtools/client/debugger/src/actions/preview.js @@ -128,7 +128,7 @@ export function getPreview(target, tokenPos, codeMirror) { } export function getExceptionPreview(target, tokenPos, codeMirror) { - return async ({ dispatch, getState, parserWorker }) => { + return async ({ getState, parserWorker }) => { const match = await findExpressionMatch( getState(), parserWorker, diff --git a/devtools/client/debugger/src/actions/sources/loadSourceText.js b/devtools/client/debugger/src/actions/sources/loadSourceText.js index d3bbd53871..b523b1984a 100644 --- a/devtools/client/debugger/src/actions/sources/loadSourceText.js +++ b/devtools/client/debugger/src/actions/sources/loadSourceText.js @@ -43,7 +43,7 @@ async function loadGeneratedSource(sourceActor, { client }) { async function loadOriginalSource( source, - { getState, client, sourceMapLoader, prettyPrintWorker } + { getState, sourceMapLoader, prettyPrintWorker } ) { if (isPretty(source)) { const generatedSource = getGeneratedSource(getState(), source); diff --git a/devtools/client/debugger/src/actions/sources/newSources.js b/devtools/client/debugger/src/actions/sources/newSources.js index 4d9c2cd5f7..44e8595c42 100644 --- a/devtools/client/debugger/src/actions/sources/newSources.js +++ b/devtools/client/debugger/src/actions/sources/newSources.js @@ -36,30 +36,22 @@ import { prefs } from "../../utils/prefs"; import sourceQueue from "../../utils/source-queue"; import { validateSourceActor, ContextError } from "../../utils/context"; -function loadSourceMaps(sources) { +function loadSourceMapsForSourceActors(sourceActors) { return async function ({ dispatch }) { try { - const sourceList = await Promise.all( - sources.map(async sourceActor => { - const originalSourcesInfo = await dispatch( - loadSourceMap(sourceActor) - ); - originalSourcesInfo.forEach( - sourcesInfo => (sourcesInfo.sourceActor = sourceActor) - ); - sourceQueue.queueOriginalSources(originalSourcesInfo); - return originalSourcesInfo; - }) + await Promise.all( + sourceActors.map(sourceActor => dispatch(loadSourceMap(sourceActor))) ); - - await sourceQueue.flush(); - return sourceList.flat(); } catch (error) { + // This may throw a context error if we navigated while processing the source maps if (!(error instanceof ContextError)) { throw error; } } - return []; + + // Once all the source maps, of all the bulk of new source actors are processed, + // flush the SourceQueue. This help aggregate all the original sources in one action. + await sourceQueue.flush(); }; } @@ -70,7 +62,7 @@ function loadSourceMaps(sources) { function loadSourceMap(sourceActor) { return async function ({ dispatch, getState, sourceMapLoader, panel }) { if (!prefs.clientSourceMapsEnabled || !sourceActor.sourceMapURL) { - return []; + return; } let sources, ignoreListUrls, resolvedSourceMapURL, exception; @@ -135,12 +127,20 @@ function loadSourceMap(sourceActor) { type: "CLEAR_SOURCE_ACTOR_MAP_URL", sourceActor, }); - return []; + return; } // Before dispatching this action, ensure that the related sourceActor is still registered validateSourceActor(getState(), sourceActor); - return sources; + + for (const originalSource of sources) { + // The Source Map worker doesn't set the `sourceActor` attribute, + // which is handy to know what is the related bundle. + originalSource.sourceActor = sourceActor; + } + + // Register all the new reported original sources in the queue to be flushed once all new bundles are processed. + sourceQueue.queueOriginalSources(sources); }; } @@ -294,7 +294,7 @@ export function newGeneratedSource(sourceInfo) { } export function newGeneratedSources(sourceResources) { - return async ({ dispatch, getState, client }) => { + return async ({ dispatch, getState }) => { if (!sourceResources.length) { return []; } @@ -341,7 +341,7 @@ export function newGeneratedSources(sourceResources) { await dispatch(checkNewSources(newSources)); (async () => { - await dispatch(loadSourceMaps(newSourceActors)); + await dispatch(loadSourceMapsForSourceActors(newSourceActors)); // We would like to sync breakpoints after we are done // loading source maps as sometimes generated and original @@ -370,7 +370,7 @@ export function newGeneratedSources(sourceResources) { } function checkNewSources(sources) { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { for (const source of sources) { dispatch(checkSelectedSource(source.id)); } diff --git a/devtools/client/debugger/src/actions/sources/prettyPrint.js b/devtools/client/debugger/src/actions/sources/prettyPrint.js index 6a12a34240..d1e46ac949 100644 --- a/devtools/client/debugger/src/actions/sources/prettyPrint.js +++ b/devtools/client/debugger/src/actions/sources/prettyPrint.js @@ -224,7 +224,7 @@ async function prettyPrintHtmlFile({ } function createPrettySource(source, sourceActor) { - return async ({ dispatch, sourceMapLoader, getState }) => { + return async ({ dispatch }) => { const url = getPrettyOriginalSourceURL(source); const id = generatedToOriginalId(source.id, url); const prettySource = createPrettyPrintOriginalSource(id, url); @@ -336,7 +336,7 @@ const memoizedPrettyPrintSource = memoizeableAction("setSymbols", { }); export function prettyPrintAndSelectSource(source) { - return async ({ dispatch, sourceMapLoader, getState }) => { + return async ({ dispatch }) => { const prettySource = await dispatch(memoizedPrettyPrintSource(source)); // Select the pretty/original source based on the location we may diff --git a/devtools/client/debugger/src/actions/sources/select.js b/devtools/client/debugger/src/actions/sources/select.js index 63200a398a..f25267374b 100644 --- a/devtools/client/debugger/src/actions/sources/select.js +++ b/devtools/client/debugger/src/actions/sources/select.js @@ -63,6 +63,11 @@ export const clearSelectedLocation = () => ({ type: "CLEAR_SELECTED_LOCATION", }); +export const setDefaultSelectedLocation = shouldSelectOriginalLocation => ({ + type: "SET_DEFAULT_SELECTED_LOCATION", + shouldSelectOriginalLocation, +}); + /** * Deterministically select a source that has a given URL. This will * work regardless of the connection status or if the source exists @@ -105,6 +110,76 @@ export function selectSource(source, sourceActor) { } /** + * Helper for `selectLocation`. + * Based on `keepContext` argument passed to `selectLocation`, + * this will automatically select the related mapped source (original or generated). + * + * @param {Object} location + * The location to select. + * @param {Boolean} keepContext + * If true, will try to select a mapped source. + * @param {Object} thunkArgs + * @return {Object} + * Object with two attributes: + * - `shouldSelectOriginalLocation`, to know if we should keep trying to select the original location + * - `newLocation`, for the final location to select + */ +async function mayBeSelectMappedSource(location, keepContext, thunkArgs) { + const { getState, dispatch } = thunkArgs; + // Preserve the current source map context (original / generated) + // when navigating to a new location. + // i.e. if keepContext isn't manually overriden to false, + // we will convert the source we want to select to either + // original/generated in order to match the currently selected one. + // If the currently selected source is original, we will + // automatically map `location` to refer to the original source, + // even if that used to refer only to the generated source. + let shouldSelectOriginalLocation = getShouldSelectOriginalLocation( + getState() + ); + if (keepContext) { + // Pretty print source may not be registered yet and getRelatedMapLocation may not return it. + // Wait for the pretty print source to be fully processed. + if ( + !location.source.isOriginal && + shouldSelectOriginalLocation && + hasPrettyTab(getState(), location.source) + ) { + // Note that prettyPrintAndSelectSource has already been called a bit before when this generated source has been added + // but it is a slow operation and is most likely not resolved yet. + // prettyPrintAndSelectSource uses memoization to avoid doing the operation more than once, while waiting from both callsites. + await dispatch(prettyPrintAndSelectSource(location.source)); + } + if (shouldSelectOriginalLocation != location.source.isOriginal) { + // Only try to map if the source is mapped. i.e. is original source or a bundle with a valid source map comment + if ( + location.source.isOriginal || + isSourceActorWithSourceMap(getState(), location.sourceActor.id) + ) { + // getRelatedMapLocation will convert to the related generated/original location. + // i.e if the original location is passed, the related generated location will be returned and vice versa. + location = await getRelatedMapLocation(location, thunkArgs); + } + // Note that getRelatedMapLocation may return the exact same location. + // For example, if the source-map is half broken, it may return a generated location + // while we were selecting original locations. So we may be seeing bundles intermittently + // when stepping through broken source maps. And we will see original sources when stepping + // through functional original sources. + } + } else if ( + location.source.isOriginal || + isSourceActorWithSourceMap(getState(), location.sourceActor.id) + ) { + // Only update this setting if the source is mapped. i.e. don't update if we select a regular source. + // The source is mapped when it is either: + // - an original source, + // - a bundle with a source map comment referencing a source map URL. + shouldSelectOriginalLocation = location.source.isOriginal; + } + return { shouldSelectOriginalLocation, newLocation: location }; +} + +/** * Select a new location. * This will automatically select the source in the source tree (if visible) * and open the source (a new tab and the source editor) @@ -144,47 +219,28 @@ export function selectLocation( return; } - // Preserve the current source map context (original / generated) - // when navigating to a new location. - // i.e. if keepContext isn't manually overriden to false, - // we will convert the source we want to select to either - // original/generated in order to match the currently selected one. - // If the currently selected source is original, we will - // automatically map `location` to refer to the original source, - // even if that used to refer only to the generated source. - let shouldSelectOriginalLocation = getShouldSelectOriginalLocation( - getState() - ); - if (keepContext) { - // Pretty print source may not be registered yet and getRelatedMapLocation may not return it. - // Wait for the pretty print source to be fully processed. - if ( - !location.source.isOriginal && - shouldSelectOriginalLocation && - hasPrettyTab(getState(), location.source) - ) { - // Note that prettyPrintAndSelectSource has already been called a bit before when this generated source has been added - // but it is a slow operation and is most likely not resolved yet. - // prettyPrintAndSelectSource uses memoization to avoid doing the operation more than once, while waiting from both callsites. - await dispatch(prettyPrintAndSelectSource(location.source)); - } - if (shouldSelectOriginalLocation != location.source.isOriginal) { - // getRelatedMapLocation will convert to the related generated/original location. - // i.e if the original location is passed, the related generated location will be returned and vice versa. - location = await getRelatedMapLocation(location, thunkArgs); - // Note that getRelatedMapLocation may return the exact same location. - // For example, if the source-map is half broken, it may return a generated location - // while we were selecting original locations. So we may be seeing bundles intermittently - // when stepping through broken source maps. And we will see original sources when stepping - // through functional original sources. + let sourceActor = location.sourceActor; + if (!sourceActor) { + sourceActor = getFirstSourceActorForGeneratedSource( + getState(), + source.id + ); + location = createLocation({ ...location, sourceActor }); + } - source = location.source; - } - } else { - shouldSelectOriginalLocation = location.source.isOriginal; + const lastSelectedLocation = getSelectedLocation(getState()); + const { shouldSelectOriginalLocation, newLocation } = + await mayBeSelectMappedSource(location, keepContext, thunkArgs); + + // Ignore the request if another location was selected while we were waiting for mayBeSelectMappedSource async completion + if (getSelectedLocation(getState()) != lastSelectedLocation) { + return; } - let sourceActor = location.sourceActor; + // Update all local variables after mapping + location = newLocation; + source = location.source; + sourceActor = location.sourceActor; if (!sourceActor) { sourceActor = getFirstSourceActorForGeneratedSource( getState(), @@ -351,11 +407,16 @@ export function jumpToMappedLocation(location) { // Map to either an original or a generated source location const pairedLocation = await getRelatedMapLocation(location, thunkArgs); + // If we are on a non-mapped source, this will return the same location + // so ignore the request. + if (pairedLocation == location) { + return null; + } + return dispatch(selectSpecificLocation(pairedLocation)); }; } -// This is only used by tests export function jumpToMappedSelectedLocation() { return async function ({ dispatch, getState }) { const location = getSelectedLocation(getState()); diff --git a/devtools/client/debugger/src/actions/sources/symbols.js b/devtools/client/debugger/src/actions/sources/symbols.js index c7b9132c32..e33c3e1036 100644 --- a/devtools/client/debugger/src/actions/sources/symbols.js +++ b/devtools/client/debugger/src/actions/sources/symbols.js @@ -10,7 +10,7 @@ import { loadSourceText } from "./loadSourceText"; import { memoizeableAction } from "../../utils/memoizableAction"; import { fulfilled } from "../../utils/async-value"; -async function doSetSymbols(location, { dispatch, getState, parserWorker }) { +async function doSetSymbols(location, { dispatch, parserWorker }) { await dispatch(loadSourceText(location.source, location.sourceActor)); await dispatch({ diff --git a/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js b/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js index cef9eca31e..19457a4bf5 100644 --- a/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js +++ b/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js @@ -7,10 +7,9 @@ import { selectors, createStore, makeSource, - makeSourceURL, makeOriginalSource, } from "../../../utils/test-head"; -const { getSource, getSourceCount, getSelectedSource } = selectors; +const { getSource, getSourceCount } = selectors; import { mockCommandClient } from "../../tests/helpers/mockCommandClient"; @@ -49,20 +48,6 @@ describe("sources - new sources", () => { expect(getSourceCount(getState())).toEqual(1); }); - it("should automatically select a pending source", async () => { - const { dispatch, getState } = createStore(mockCommandClient); - const baseSourceURL = makeSourceURL("base.js"); - await dispatch(actions.selectSourceURL(baseSourceURL)); - - expect(getSelectedSource(getState())).toBe(undefined); - const baseSource = await dispatch( - actions.newGeneratedSource(makeSource("base.js")) - ); - - const selected = getSelectedSource(getState()); - expect(selected && selected.url).toBe(baseSource.url); - }); - // eslint-disable-next-line it("should not attempt to fetch original sources if it's missing a source map url", async () => { const loadSourceMap = jest.fn(); diff --git a/devtools/client/debugger/src/actions/sources/tests/select.spec.js b/devtools/client/debugger/src/actions/sources/tests/select.spec.js index 5f4feba6c0..4cf0c58c94 100644 --- a/devtools/client/debugger/src/actions/sources/tests/select.spec.js +++ b/devtools/client/debugger/src/actions/sources/tests/select.spec.js @@ -8,7 +8,6 @@ import { createStore, createSourceObject, makeSource, - makeSourceURL, waitForState, makeOriginalSource, } from "../../../utils/test-head"; @@ -23,7 +22,7 @@ import { createLocation } from "../../../utils/location"; import { mockCommandClient } from "../../tests/helpers/mockCommandClient"; -process.on("unhandledRejection", (reason, p) => {}); +process.on("unhandledRejection", () => {}); function initialLocation(sourceId) { return createLocation({ source: createSourceObject(sourceId), line: 1 }); @@ -176,20 +175,4 @@ describe("sources", () => { const selected = getSelectedLocation(getState()); expect(selected && selected.line).toBe(1); }); - - describe("selectSourceURL", () => { - it("should automatically select a pending source", async () => { - const { dispatch, getState } = createStore(mockCommandClient); - const baseSourceURL = makeSourceURL("base.js"); - await dispatch(actions.selectSourceURL(baseSourceURL)); - - expect(getSelectedSource(getState())).toBe(undefined); - const baseSource = await dispatch( - actions.newGeneratedSource(makeSource("base.js")) - ); - - const selected = getSelectedSource(getState()); - expect(selected && selected.url).toBe(baseSource.url); - }); - }); }); diff --git a/devtools/client/debugger/src/actions/tests/expressions.spec.js b/devtools/client/debugger/src/actions/tests/expressions.spec.js index c69276fa40..093f99e228 100644 --- a/devtools/client/debugger/src/actions/tests/expressions.spec.js +++ b/devtools/client/debugger/src/actions/tests/expressions.spec.js @@ -6,7 +6,7 @@ import { actions, selectors, createStore } from "../../utils/test-head"; const mockThreadFront = { evaluate: (script, { frameId }) => - new Promise((resolve, reject) => { + new Promise(resolve => { if (!frameId) { resolve("bla"); } else { @@ -16,8 +16,8 @@ const mockThreadFront = { evaluateExpressions: (inputs, { frameId }) => Promise.all( inputs.map( - input => - new Promise((resolve, reject) => { + () => + new Promise(resolve => { if (!frameId) { resolve("bla"); } else { diff --git a/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js b/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js index 38dd55c274..2e0333fc99 100644 --- a/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js +++ b/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js @@ -29,7 +29,7 @@ const sources = [ ]; export const mockCommandClient = { - sourceContents: function ({ source }) { + sourceContents({ source }) { return new Promise((resolve, reject) => { if (sources.includes(source)) { resolve(createSource(source)); diff --git a/devtools/client/debugger/src/actions/toolbox.js b/devtools/client/debugger/src/actions/toolbox.js index a343c92863..4c88ec6d24 100644 --- a/devtools/client/debugger/src/actions/toolbox.js +++ b/devtools/client/debugger/src/actions/toolbox.js @@ -12,6 +12,12 @@ export function openLink(url) { }; } +export function openSourceMap(url, line, column) { + return async function ({ panel }) { + return panel.toolbox.viewSource(url, line, column); + }; +} + export function evaluateInConsole(inputString) { return async ({ panel }) => { return panel.openConsoleAndEvaluate(inputString); @@ -24,7 +30,7 @@ export function openElementInInspectorCommand(grip) { }; } -export function openInspector(grip) { +export function openInspector() { return async ({ panel }) => { return panel.openInspector(); }; diff --git a/devtools/client/debugger/src/actions/ui.js b/devtools/client/debugger/src/actions/ui.js index 2424c658b8..8d4d62307a 100644 --- a/devtools/client/debugger/src/actions/ui.js +++ b/devtools/client/debugger/src/actions/ui.js @@ -16,7 +16,7 @@ import { selectSource } from "../actions/sources/select"; import { getEditor, getLocationsInViewport, - updateDocuments, + updateEditorLineWrapping, } from "../utils/editor/index"; import { blackboxSourceActorsForSource } from "./sources/blackbox"; import { toggleBreakpoints } from "./breakpoints/index"; @@ -66,7 +66,7 @@ export function setActiveSearch(activeSearch) { } export function toggleFrameworkGrouping(toggleValue) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: "TOGGLE_FRAMEWORK_GROUPING", value: toggleValue, @@ -75,7 +75,7 @@ export function toggleFrameworkGrouping(toggleValue) { } export function toggleInlinePreview(toggleValue) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: "TOGGLE_INLINE_PREVIEW", value: toggleValue, @@ -84,8 +84,8 @@ export function toggleInlinePreview(toggleValue) { } export function toggleEditorWrapping(toggleValue) { - return ({ dispatch, getState }) => { - updateDocuments(doc => doc.cm.setOption("lineWrapping", toggleValue)); + return ({ dispatch }) => { + updateEditorLineWrapping(toggleValue); dispatch({ type: "TOGGLE_EDITOR_WRAPPING", @@ -95,7 +95,7 @@ export function toggleEditorWrapping(toggleValue) { } export function toggleSourceMapsEnabled(toggleValue) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: "TOGGLE_SOURCE_MAPS_ENABLED", value: toggleValue, @@ -217,7 +217,7 @@ export function setSearchOptions(searchKey, searchOptions) { } export function copyToClipboard(location) { - return ({ dispatch, getState }) => { + return ({ getState }) => { const content = getSourceTextContent(getState(), location); if (content && isFulfilled(content) && content.value.type === "text") { copyToTheClipboard(content.value.value); @@ -257,7 +257,7 @@ export function toggleJavascriptTracingOnNextLoad() { } export function setHideOrShowIgnoredSources(shouldHide) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: "HIDE_IGNORED_SOURCES", shouldHide }); }; } diff --git a/devtools/client/debugger/src/actions/utils/middleware/context.js b/devtools/client/debugger/src/actions/utils/middleware/context.js index 00711a8c3f..350a90d66e 100644 --- a/devtools/client/debugger/src/actions/utils/middleware/context.js +++ b/devtools/client/debugger/src/actions/utils/middleware/context.js @@ -27,7 +27,7 @@ function validateActionContext(getState, action) { // Middleware which looks for actions that have a cx property and ignores // them if the context is no longer valid. -function context({ dispatch, getState }) { +function context({ getState }) { return next => action => { if ("cx" in action) { validateActionContext(getState, action); diff --git a/devtools/client/debugger/src/actions/utils/middleware/log.js b/devtools/client/debugger/src/actions/utils/middleware/log.js index b9592ce22c..d228669dd4 100644 --- a/devtools/client/debugger/src/actions/utils/middleware/log.js +++ b/devtools/client/debugger/src/actions/utils/middleware/log.js @@ -92,7 +92,7 @@ function serializeAction(action) { * A middleware that logs all actions coming through the system * to the console. */ -export function log({ dispatch, getState }) { +export function log() { return next => action => { const asyncMsg = !action.status ? "" : `[${action.status}]`; diff --git a/devtools/client/debugger/src/actions/utils/middleware/promise.js b/devtools/client/debugger/src/actions/utils/middleware/promise.js index 52054a1fcc..2b88bb8ca9 100644 --- a/devtools/client/debugger/src/actions/utils/middleware/promise.js +++ b/devtools/client/debugger/src/actions/utils/middleware/promise.js @@ -21,7 +21,7 @@ function seqIdGen() { return seqIdVal++; } -function promiseMiddleware({ dispatch, getState }) { +function promiseMiddleware({ dispatch }) { return next => action => { if (!(PROMISE in action)) { return next(action); @@ -42,7 +42,7 @@ function promiseMiddleware({ dispatch, getState }) { .finally(() => new Promise(resolve => executeSoon(resolve))) .then( value => { - dispatch({ ...action, status: "done", value: value }); + dispatch({ ...action, status: "done", value }); return value; }, error => { diff --git a/devtools/client/debugger/src/actions/utils/middleware/timing.js b/devtools/client/debugger/src/actions/utils/middleware/timing.js index d0bfa05977..8b6b7baf5e 100644 --- a/devtools/client/debugger/src/actions/utils/middleware/timing.js +++ b/devtools/client/debugger/src/actions/utils/middleware/timing.js @@ -9,13 +9,13 @@ const mark = window.performance?.mark ? window.performance.mark.bind(window.performance) - : a => {}; + : () => {}; const measure = window.performance?.measure ? window.performance.measure.bind(window.performance) - : (a, b, c) => {}; + : () => {}; -export function timing(store) { +export function timing() { return next => action => { mark(`${action.type}_start`); const result = next(action); diff --git a/devtools/client/debugger/src/client/firefox.js b/devtools/client/debugger/src/client/firefox.js index 6b76d6d175..8705bf3490 100644 --- a/devtools/client/debugger/src/client/firefox.js +++ b/devtools/client/debugger/src/client/firefox.js @@ -110,7 +110,7 @@ export function onDisconnect() { sourceQueue.clear(); } -async function onTargetAvailable({ targetFront, isTargetSwitching }) { +async function onTargetAvailable({ targetFront }) { const isBrowserToolbox = commands.descriptorFront.isBrowserProcessDescriptor; const isNonTopLevelFrameTarget = !targetFront.isTopLevel && diff --git a/devtools/client/debugger/src/client/firefox/commands.js b/devtools/client/debugger/src/client/firefox/commands.js index 5ef3ba27d0..3f8f62c8fb 100644 --- a/devtools/client/debugger/src/client/firefox/commands.js +++ b/devtools/client/debugger/src/client/firefox/commands.js @@ -115,7 +115,7 @@ async function toggleTracing() { return commands.tracerCommand.toggle(); } -function resume(thread, frameId) { +function resume(thread) { return lookupThreadFront(thread).resume(); } diff --git a/devtools/client/debugger/src/client/firefox/create.js b/devtools/client/debugger/src/client/firefox/create.js index 9c610a08dd..c78e0fb273 100644 --- a/devtools/client/debugger/src/client/firefox/create.js +++ b/devtools/client/debugger/src/client/firefox/create.js @@ -11,7 +11,11 @@ import { getSourceCount, } from "../../selectors/index"; import { features } from "../../utils/prefs"; -import { isUrlExtension } from "../../utils/source"; +import { + isUrlExtension, + getRawSourceURL, + getFormattedSourceId, +} from "../../utils/source"; import { createLocation } from "../../utils/location"; import { getDisplayURL } from "../../utils/sources-tree/getURL"; @@ -242,6 +246,7 @@ function createSourceObject({ isOriginal = false, isHTML = false, }) { + const displayURL = getDisplayURL(url, extensionName); return { // The ID, computed by: // * `makeSourceId` for generated, @@ -254,7 +259,23 @@ function createSourceObject({ // A (slightly tweaked) URL object to represent the source URL. // The URL object is augmented of a "group" attribute and some other standard attributes // are modified from their typical value. See getDisplayURL implementation. - displayURL: getDisplayURL(url, extensionName), + displayURL, + + // Short label for this source. + // + // * For inlined/eval sources without a URL, the name will refer to the internal source ID, + // * For pretty printed source, we take care to ignore the internal ":formatted" suffix used in the URL, + // * For index files, i.e. sources loaded without a filename, they will be named "(index)". + // * Special characters are decoded from the URL string. + // (most of this is done by getDisplayURL) + shortName: url + ? getRawSourceURL(displayURL.filename) + : getFormattedSourceId(id), + + // Same as short name, but with the query parameters. + longName: url + ? getRawSourceURL(displayURL.filename + displayURL.search) + : getFormattedSourceId(id), // Only set for generated sources that are WebExtension sources. // This is especially useful to display the extension name for content scripts diff --git a/devtools/client/debugger/src/components/App.css b/devtools/client/debugger/src/components/App.css index 796bf84574..64a899d047 100644 --- a/devtools/client/debugger/src/components/App.css +++ b/devtools/client/debugger/src/components/App.css @@ -79,6 +79,29 @@ button:hover { gap: 8px; grid-area: notification; display: flex; + /* center text within the notification */ + align-items: center; + + .info.icon { + align-self: normal; + } + + .close-button { + /* set a fixed height in order to avoid having it flexed to full height */ + height: 16px; + padding: 0; + /* put in top-right corner */ + margin-inline-start: auto; + align-self: normal; + + &::before { + display: block; + width: 16px; + height: 16px; + content: ""; + background-image: url("chrome://devtools/skin/images/close.svg"); + } + } } /* Utils */ diff --git a/devtools/client/debugger/src/components/App.js b/devtools/client/debugger/src/components/App.js index 40911e5167..1642a212ef 100644 --- a/devtools/client/debugger/src/components/App.js +++ b/devtools/client/debugger/src/components/App.js @@ -4,6 +4,7 @@ import React, { Component } from "devtools/client/shared/vendor/react"; import { + button, div, main, span, @@ -208,15 +209,23 @@ class App extends Component { } } + closeSourceMapError = () => { + this.setState({ hiddenSourceMapError: this.props.sourceMapError }); + }; + renderEditorNotificationBar() { - if (this.props.sourceMapError) { + if ( + this.props.sourceMapError && + this.state.hiddenSourceMapError != this.props.sourceMapError + ) { return div( { className: "editor-notification-footer", "aria-role": "status" }, span( { className: "info icon" }, React.createElement(AccessibleImage, { className: "sourcemap" }) ), - `Source Map Error: ${this.props.sourceMapError}` + `Source Map Error: ${this.props.sourceMapError}`, + button({ className: "close-button", onClick: this.closeSourceMapError }) ); } if (this.props.showOriginalVariableMappingWarning) { @@ -248,13 +257,13 @@ class App extends Component { className: "editor-container", }, React.createElement(EditorTabs, { - startPanelCollapsed: startPanelCollapsed, - endPanelCollapsed: endPanelCollapsed, - horizontal: horizontal, + startPanelCollapsed, + endPanelCollapsed, + horizontal, }), React.createElement(Editor, { - startPanelSize: startPanelSize, - endPanelSize: endPanelSize, + startPanelSize, + endPanelSize, }), !this.props.selectedLocation ? React.createElement(WelcomeBox, { @@ -313,7 +322,7 @@ class App extends Component { prefs.startPanelSize = num; this.triggerEditorPaneResize(); }, - startPanelCollapsed: startPanelCollapsed, + startPanelCollapsed, startPanel: React.createElement(PrimaryPanes, { horizontal, }), @@ -323,7 +332,7 @@ class App extends Component { endPanel: React.createElement(SecondaryPanes, { horizontal, }), - endPanelCollapsed: endPanelCollapsed, + endPanelCollapsed, }); }; diff --git a/devtools/client/debugger/src/components/Editor/ConditionalPanel.js b/devtools/client/debugger/src/components/Editor/ConditionalPanel.js index 8ff84c287a..97876f2f00 100644 --- a/devtools/client/debugger/src/components/Editor/ConditionalPanel.js +++ b/devtools/client/debugger/src/components/Editor/ConditionalPanel.js @@ -121,7 +121,7 @@ export class ConditionalPanel extends PureComponent { return this.clearConditionalPanel(); } - componentDidUpdate(prevProps) { + componentDidUpdate() { this.keepFocusOnInput(); } diff --git a/devtools/client/debugger/src/components/Editor/Footer.css b/devtools/client/debugger/src/components/Editor/Footer.css index 4a3272879b..f3382e94b5 100644 --- a/devtools/client/debugger/src/components/Editor/Footer.css +++ b/devtools/client/debugger/src/components/Editor/Footer.css @@ -67,6 +67,45 @@ opacity: 0.6; } +.devtools-button.debugger-source-map-button { + display: inline-flex; + align-items: center; + margin: 0; + --menuitem-icon-image: url("chrome://devtools/content/debugger/images/sourcemap.svg"); + + &.not-mapped { + --icon-color: var(--theme-icon-dimmed-color); + } + + &.original { + --icon-color: var(--theme-icon-checked-color); + --menuitem-icon-image: url("chrome://devtools/content/debugger/images/sourcemap-active.svg"); + } + + &.error { + --icon-color: var(--theme-icon-warning-color); + } + + &.disabled { + --icon-color: var(--theme-icon-dimmed-color); + --menuitem-icon-image: url("chrome://devtools/content/debugger/images/sourcemap-disabled.svg"); + } + + &.loading { + --menuitem-icon-image: url("chrome://devtools/content/debugger/images/loader.svg"); + } + + &::before { + /* override default style to have similar left and right margins */ + margin-inline-end: 3px; + color: var(--icon-color, currentColor); + } + + &.loading::before { + animation: spin 2s linear infinite; + } +} + .source-footer .mapped-source, .source-footer .cursor-position { color: var(--theme-body-color); diff --git a/devtools/client/debugger/src/components/Editor/Footer.js b/devtools/client/debugger/src/components/Editor/Footer.js index c4ff02caf4..69c7b52b68 100644 --- a/devtools/client/debugger/src/components/Editor/Footer.js +++ b/devtools/client/debugger/src/components/Editor/Footer.js @@ -7,6 +7,7 @@ import { div, button, span, + hr, } from "devtools/client/shared/vendor/react-dom-factories"; import PropTypes from "devtools/client/shared/vendor/react-prop-types"; import { connect } from "devtools/client/shared/vendor/react-redux"; @@ -23,14 +24,23 @@ import { isSourceOnSourceMapIgnoreList, isSourceMapIgnoreListEnabled, getSelectedMappedSource, + getSourceMapErrorForSourceActor, + areSourceMapsEnabled, + getShouldSelectOriginalLocation, + isSourceActorWithSourceMap, + getSourceMapResolvedURL, + isSelectedMappedSourceLoading, } from "../../selectors/index"; -import { isPretty, getFilename, shouldBlackbox } from "../../utils/source"; +import { isPretty, shouldBlackbox } from "../../utils/source"; import { PaneToggleButton } from "../shared/Button/index"; import AccessibleImage from "../shared/AccessibleImage"; const classnames = require("resource://devtools/client/shared/classnames.js"); +const MenuButton = require("resource://devtools/client/shared/components/menu/MenuButton.js"); +const MenuItem = require("resource://devtools/client/shared/components/menu/MenuItem.js"); +const MenuList = require("resource://devtools/client/shared/components/menu/MenuList.js"); class SourceFooter extends PureComponent { static get propTypes() { @@ -155,9 +165,11 @@ class SourceFooter extends PureComponent { } renderCommands() { - const commands = [this.blackBoxButton(), this.prettyPrintButton()].filter( - Boolean - ); + const commands = [ + this.blackBoxButton(), + this.prettyPrintButton(), + this.renderSourceMapButton(), + ].filter(Boolean); return commands.length ? div( @@ -169,7 +181,7 @@ class SourceFooter extends PureComponent { : null; } - renderSourceSummary() { + renderMappedSource() { const { mappedSource, jumpToMappedLocation, selectedLocation } = this.props; if (!mappedSource) { @@ -182,12 +194,11 @@ class SourceFooter extends PureComponent { : "sourceFooter.mappedGeneratedSource.tooltip", mappedSource.url ); - const filename = getFilename(mappedSource); const label = L10N.getFormatStr( mappedSource.isOriginal ? "sourceFooter.mappedOriginalSource.title" : "sourceFooter.mappedGeneratedSource.title", - filename + mappedSource.shortName ); return button( { @@ -227,6 +238,148 @@ class SourceFooter extends PureComponent { ); } + getSourceMapLabel() { + if (!this.props.selectedLocation) { + return undefined; + } + if (!this.props.areSourceMapsEnabled) { + return L10N.getStr("sourceFooter.sourceMapButton.disabled"); + } + if (this.props.sourceMapError) { + return undefined; + } + if (!this.props.isSourceActorWithSourceMap) { + return L10N.getStr("sourceFooter.sourceMapButton.sourceNotMapped"); + } + if (this.props.selectedLocation.source.isOriginal) { + return L10N.getStr("sourceFooter.sourceMapButton.isOriginalSource"); + } + return L10N.getStr("sourceFooter.sourceMapButton.isBundleSource"); + } + + getSourceMapTitle() { + if (this.props.sourceMapError) { + return L10N.getFormatStr( + "sourceFooter.sourceMapButton.errorTitle", + this.props.sourceMapError + ); + } + if (this.props.isSourceMapLoading) { + return L10N.getStr("sourceFooter.sourceMapButton.loadingTitle"); + } + return L10N.getStr("sourceFooter.sourceMapButton.title"); + } + + renderSourceMapButton() { + const { toolboxDoc } = this.context; + + return React.createElement( + MenuButton, + { + menuId: "debugger-source-map-button", + toolboxDoc, + className: classnames("devtools-button", "debugger-source-map-button", { + error: !!this.props.sourceMapError, + loading: this.props.isSourceMapLoading, + disabled: !this.props.areSourceMapsEnabled, + "not-mapped": + !this.props.selectedLocation?.source.isOriginal && + !this.props.isSourceActorWithSourceMap, + original: this.props.selectedLocation?.source.isOriginal, + }), + title: this.getSourceMapTitle(), + label: this.getSourceMapLabel(), + icon: true, + }, + () => this.renderSourceMapMenuItems() + ); + } + + renderSourceMapMenuItems() { + const items = [ + React.createElement(MenuItem, { + className: "menu-item debugger-source-map-enabled", + checked: this.props.areSourceMapsEnabled, + label: L10N.getStr("sourceFooter.sourceMapButton.enable"), + onClick: this.toggleSourceMaps, + }), + hr(), + React.createElement(MenuItem, { + className: "menu-item debugger-source-map-open-original", + checked: this.props.shouldSelectOriginalLocation, + label: L10N.getStr( + "sourceFooter.sourceMapButton.showOriginalSourceByDefault" + ), + onClick: this.toggleSelectOriginalByDefault, + }), + ]; + + if (this.props.mappedSource) { + items.push( + React.createElement(MenuItem, { + className: "menu-item debugger-jump-mapped-source", + label: this.props.mappedSource.isOriginal + ? L10N.getStr("sourceFooter.sourceMapButton.jumpToGeneratedSource") + : L10N.getStr("sourceFooter.sourceMapButton.jumpToOriginalSource"), + tooltip: this.props.mappedSource.url, + onClick: () => + this.props.jumpToMappedLocation(this.props.selectedLocation), + }) + ); + } + + if (this.props.resolvedSourceMapURL) { + items.push( + React.createElement(MenuItem, { + className: "menu-item debugger-source-map-link", + label: L10N.getStr( + "sourceFooter.sourceMapButton.openSourceMapInNewTab" + ), + onClick: this.openSourceMap, + }) + ); + } + return React.createElement( + MenuList, + { + id: "debugger-source-map-list", + }, + items + ); + } + + openSourceMap = () => { + let line, column; + if ( + this.props.sourceMapError && + this.props.sourceMapError.includes("JSON.parse") + ) { + const match = this.props.sourceMapError.match( + /at line (\d+) column (\d+)/ + ); + if (match) { + line = match[1]; + column = match[2]; + } + } + this.props.openSourceMap( + this.props.resolvedSourceMapURL || this.props.selectedLocation.source.url, + line, + column + ); + }; + + toggleSourceMaps = () => { + this.props.toggleSourceMapsEnabled(!this.props.areSourceMapsEnabled); + }; + + toggleSelectOriginalByDefault = () => { + this.props.setDefaultSelectedLocation( + !this.props.shouldSelectOriginalLocation + ); + this.props.jumpToMappedSelectedLocation(); + }; + render() { return div( { @@ -242,19 +395,40 @@ class SourceFooter extends PureComponent { { className: "source-footer-end", }, - this.renderSourceSummary(), + this.renderMappedSource(), this.renderCursorPosition(), this.renderToggleButton() ) ); } } +SourceFooter.contextTypes = { + toolboxDoc: PropTypes.object, +}; const mapStateToProps = state => { const selectedSource = getSelectedSource(state); const selectedLocation = getSelectedLocation(state); const sourceTextContent = getSelectedSourceTextContent(state); + const areSourceMapsEnabledProp = areSourceMapsEnabled(state); + const isSourceActorWithSourceMapProp = isSourceActorWithSourceMap( + state, + selectedLocation?.sourceActor.id + ); + const sourceMapError = selectedLocation?.sourceActor + ? getSourceMapErrorForSourceActor(state, selectedLocation.sourceActor.id) + : null; + const mappedSource = getSelectedMappedSource(state); + + const isSourceMapLoading = + areSourceMapsEnabledProp && + isSourceActorWithSourceMapProp && + // `mappedSource` will be null while loading, we need another way to know when it is done computing + !mappedSource && + isSelectedMappedSourceLoading(state) && + !sourceMapError; + return { selectedSource, selectedLocation, @@ -265,7 +439,8 @@ const mapStateToProps = state => { isSourceMapIgnoreListEnabled(state) && isSourceOnSourceMapIgnoreList(state, selectedSource), sourceLoaded: !!sourceTextContent, - mappedSource: getSelectedMappedSource(state), + mappedSource, + isSourceMapLoading, prettySource: getPrettySource( state, selectedSource ? selectedSource.id : null @@ -277,6 +452,17 @@ const mapStateToProps = state => { prettyPrintMessage: selectedLocation ? getPrettyPrintMessage(state, selectedLocation) : null, + + sourceMapError, + resolvedSourceMapURL: selectedLocation?.sourceActor + ? getSourceMapResolvedURL(state, selectedLocation.sourceActor.id) + : null, + isSourceActorWithSourceMap: isSourceActorWithSourceMapProp, + + sourceMapURL: selectedLocation?.sourceActor.sourceMapURL, + + areSourceMapsEnabled: areSourceMapsEnabledProp, + shouldSelectOriginalLocation: getShouldSelectOriginalLocation(state), }; }; @@ -285,4 +471,8 @@ export default connect(mapStateToProps, { toggleBlackBox: actions.toggleBlackBox, jumpToMappedLocation: actions.jumpToMappedLocation, togglePaneCollapse: actions.togglePaneCollapse, + toggleSourceMapsEnabled: actions.toggleSourceMapsEnabled, + setDefaultSelectedLocation: actions.setDefaultSelectedLocation, + jumpToMappedSelectedLocation: actions.jumpToMappedSelectedLocation, + openSourceMap: actions.openSourceMap, })(SourceFooter); diff --git a/devtools/client/debugger/src/components/Editor/InlinePreview.js b/devtools/client/debugger/src/components/Editor/InlinePreview.js index 552143dcf2..60303e38b5 100644 --- a/devtools/client/debugger/src/components/Editor/InlinePreview.js +++ b/devtools/client/debugger/src/components/Editor/InlinePreview.js @@ -27,7 +27,7 @@ class InlinePreview extends PureComponent { }; } - showInScopes(variable) { + showInScopes() { // TODO: focus on variable value in the scopes sidepanel // we will need more info from parent comp } diff --git a/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js b/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js index bc54fc5b4d..18fe98ff17 100644 --- a/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js +++ b/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js @@ -67,13 +67,13 @@ class InlinePreviewRow extends PureComponent { null, previews.map(preview => React.createElement(InlinePreview, { - line: line, + line, key: `${line}-${preview.name}`, variable: preview.name, value: preview.value, - openElementInInspector: openElementInInspector, - highlightDomElement: highlightDomElement, - unHighlightDomElement: unHighlightDomElement, + openElementInInspector, + highlightDomElement, + unHighlightDomElement, }) ) ), diff --git a/devtools/client/debugger/src/components/Editor/InlinePreviews.js b/devtools/client/debugger/src/components/Editor/InlinePreviews.js index 18616ae3ed..ba8b08669a 100644 --- a/devtools/client/debugger/src/components/Editor/InlinePreviews.js +++ b/devtools/client/debugger/src/components/Editor/InlinePreviews.js @@ -49,7 +49,7 @@ class InlinePreviews extends Component { inlinePreviewRows = Object.keys(previewsObj).map(line => { const lineNum = parseInt(line, 10); return React.createElement(InlinePreviewRow, { - editor: editor, + editor, key: line, line: lineNum, previews: previewsObj[line], diff --git a/devtools/client/debugger/src/components/Editor/Preview/Popup.js b/devtools/client/debugger/src/components/Editor/Preview/Popup.js index a010358dc1..431cb52729 100644 --- a/devtools/client/debugger/src/components/Editor/Preview/Popup.js +++ b/devtools/client/debugger/src/components/Editor/Preview/Popup.js @@ -100,7 +100,7 @@ export class Popup extends Component { renderExceptionPreview(exception) { return React.createElement(ExceptionPopup, { - exception: exception, + exception, clearPreview: this.props.clearPreview, }); } @@ -182,8 +182,8 @@ export class Popup extends Component { Popover, { targetPosition: cursorPos, - type: type, - editorRef: editorRef, + type, + editorRef, target: this.props.preview.target, mouseout: this.props.clearPreview, }, diff --git a/devtools/client/debugger/src/components/Editor/Preview/index.js b/devtools/client/debugger/src/components/Editor/Preview/index.js index 218d33007f..10c600670e 100644 --- a/devtools/client/debugger/src/components/Editor/Preview/index.js +++ b/devtools/client/debugger/src/components/Editor/Preview/index.js @@ -44,7 +44,7 @@ class Preview extends PureComponent { codeMirrorWrapper.removeEventListener("mousedown", this.onMouseDown); } - updateListeners(prevProps) { + updateListeners() { const { codeMirror } = this.props.editor; const codeMirrorWrapper = codeMirror.getWrapperElement(); codeMirror.on("tokenenter", this.onTokenEnter); @@ -107,7 +107,7 @@ class Preview extends PureComponent { return null; } return React.createElement(Popup, { - preview: preview, + preview, editor: this.props.editor, editorRef: this.props.editorRef, clearPreview: this.clearPreview, diff --git a/devtools/client/debugger/src/components/Editor/SearchInFileBar.js b/devtools/client/debugger/src/components/Editor/SearchInFileBar.js index a3491a3fef..26f95ce75d 100644 --- a/devtools/client/debugger/src/components/Editor/SearchInFileBar.js +++ b/devtools/client/debugger/src/components/Editor/SearchInFileBar.js @@ -97,7 +97,7 @@ class SearchInFileBar extends Component { shortcuts.on("Escape", this.onEscape); } - componentDidUpdate(prevProps, prevState) { + componentDidUpdate() { if (this.refs.resultList && this.refs.resultList.refs) { scrollList(this.refs.resultList.refs, this.state.selectedResultIndex); } @@ -111,7 +111,7 @@ class SearchInFileBar extends Component { const { editor: ed } = this.props; if (ed) { const ctx = { ed, cm: ed.codeMirror }; - removeOverlay(ctx, this.state.query); + removeOverlay(ctx); } }; @@ -165,7 +165,7 @@ class SearchInFileBar extends Component { const ctx = { ed: editor, cm: editor.codeMirror }; if (!query) { - clearSearch(ctx.cm, query); + clearSearch(ctx.cm); return; } @@ -249,11 +249,11 @@ class SearchInFileBar extends Component { return this.doSearch(e.target.value); }; - onFocus = e => { + onFocus = () => { this.setState({ inputFocused: true }); }; - onBlur = e => { + onBlur = () => { this.setState({ inputFocused: false }); }; @@ -321,7 +321,7 @@ class SearchInFileBar extends Component { }, React.createElement(SearchInput, { query: this.state.query, - count: count, + count, placeholder: L10N.getStr("sourceSearch.search.placeholder2"), summaryMsg: this.buildSummaryMsg(), isLoading: false, @@ -349,7 +349,7 @@ SearchInFileBar.contextTypes = { shortcuts: PropTypes.object, }; -const mapStateToProps = (state, p) => { +const mapStateToProps = state => { const selectedSource = getSelectedSource(state); return { diff --git a/devtools/client/debugger/src/components/Editor/Tab.js b/devtools/client/debugger/src/components/Editor/Tab.js index ba5e1c1934..98aca90cd2 100644 --- a/devtools/client/debugger/src/components/Editor/Tab.js +++ b/devtools/client/debugger/src/components/Editor/Tab.js @@ -15,7 +15,6 @@ import actions from "../../actions/index"; import { getDisplayPath, getFileURL, - getSourceQueryString, getTruncatedFileName, isPretty, } from "../../utils/source"; @@ -87,14 +86,13 @@ class Tab extends PureComponent { }); const path = getDisplayPath(source, tabSources); - const query = getSourceQueryString(source); return div( { draggable: true, - onDragOver: onDragOver, - onDragStart: onDragStart, - onDragEnd: onDragEnd, - className: className, + onDragOver, + onDragStart, + onDragEnd, + className, "data-index": index, "data-source-id": sourceId, onClick: handleTabClick, @@ -115,7 +113,7 @@ class Tab extends PureComponent { { className: "filename", }, - getTruncatedFileName(source, query), + getTruncatedFileName(source), path && span(null, `../${path}/..`) ), React.createElement(CloseButton, { diff --git a/devtools/client/debugger/src/components/Editor/Tabs.js b/devtools/client/debugger/src/components/Editor/Tabs.js index 3577a4909c..d93f7d3b18 100644 --- a/devtools/client/debugger/src/components/Editor/Tabs.js +++ b/devtools/client/debugger/src/components/Editor/Tabs.js @@ -23,7 +23,7 @@ import { import { isVisible } from "../../utils/ui"; import { getHiddenTabs } from "../../utils/tabs"; -import { getFilename, isPretty, getFileURL } from "../../utils/source"; +import { isPretty, getFileURL } from "../../utils/source"; import actions from "../../actions/index"; import Tab from "./Tab"; @@ -144,13 +144,12 @@ class Tabs extends PureComponent { renderDropdownSource = source => { const { selectSource } = this.props; - const filename = getFilename(source); const onClick = () => selectSource(source); return li( { key: source.id, - onClick: onClick, + onClick, title: getFileURL(source, false), }, React.createElement(AccessibleImage, { @@ -160,7 +159,7 @@ class Tabs extends PureComponent { { className: "dropdown-label", }, - filename + source.shortName ) ); }; diff --git a/devtools/client/debugger/src/components/Editor/index.js b/devtools/client/debugger/src/components/Editor/index.js index c659de77d2..ae9bde7657 100644 --- a/devtools/client/debugger/src/components/Editor/index.js +++ b/devtools/client/debugger/src/components/Editor/index.js @@ -12,6 +12,7 @@ import { connect } from "devtools/client/shared/vendor/react-redux"; import { getLineText, isLineBlackboxed } from "./../../utils/source"; import { createLocation } from "./../../utils/location"; import { getIndentation } from "../../utils/indentation"; +import { features } from "../../utils/prefs"; import { getActiveSearch, @@ -50,10 +51,9 @@ import BlackboxLines from "./BlackboxLines"; import { showSourceText, - showLoading, - showErrorMessage, + setDocument, + resetLineNumberFormat, getEditor, - clearEditor, getCursorLine, getCursorColumn, lineAtHeight, @@ -143,37 +143,45 @@ class Editor extends PureComponent { this.props.selectedSourceTextContent?.value || nextProps.symbols !== this.props.symbols; - const shouldUpdateSize = - nextProps.startPanelSize !== this.props.startPanelSize || - nextProps.endPanelSize !== this.props.endPanelSize; - - const shouldScroll = - nextProps.selectedLocation && - this.shouldScrollToLocation(nextProps, editor); + if (!features.codemirrorNext) { + const shouldUpdateSize = + nextProps.startPanelSize !== this.props.startPanelSize || + nextProps.endPanelSize !== this.props.endPanelSize; + + const shouldScroll = + nextProps.selectedLocation && + this.shouldScrollToLocation(nextProps, editor); + + if (shouldUpdateText || shouldUpdateSize || shouldScroll) { + startOperation(); + if (shouldUpdateText) { + this.setText(nextProps, editor); + } + if (shouldUpdateSize) { + editor.codeMirror.setSize(); + } + if (shouldScroll) { + this.scrollToLocation(nextProps, editor); + } + endOperation(); + } - if (shouldUpdateText || shouldUpdateSize || shouldScroll) { - startOperation(); + if (this.props.selectedSource != nextProps.selectedSource) { + this.props.updateViewport(); + resizeBreakpointGutter(editor.codeMirror); + resizeToggleButton(editor.codeMirror); + } + } else { + // For codemirror 6 + // eslint-disable-next-line no-lonely-if if (shouldUpdateText) { this.setText(nextProps, editor); } - if (shouldUpdateSize) { - editor.codeMirror.setSize(); - } - if (shouldScroll) { - this.scrollToLocation(nextProps, editor); - } - endOperation(); - } - - if (this.props.selectedSource != nextProps.selectedSource) { - this.props.updateViewport(); - resizeBreakpointGutter(editor.codeMirror); - resizeToggleButton(editor.codeMirror); } } setupEditor() { - const editor = getEditor(); + const editor = getEditor(features.codemirrorNext); // disables the default search shortcuts editor._initShortcuts = () => {}; @@ -183,71 +191,84 @@ class Editor extends PureComponent { editor.appendToLocalElement(node.querySelector(".editor-mount")); } - const { codeMirror } = editor; - - this.abortController = new window.AbortController(); - - // CodeMirror refreshes its internal state on window resize, but we need to also - // refresh it when the side panels are resized. - // We could have a ResizeObserver instead, but we wouldn't be able to differentiate - // between window resize and side panel resize and as a result, might refresh - // codeMirror twice, which is wasteful. - window.document - .querySelector(".editor-pane") - .addEventListener("resizeend", () => codeMirror.refresh(), { - signal: this.abortController.signal, - }); - - codeMirror.on("gutterClick", this.onGutterClick); - codeMirror.on("cursorActivity", this.onCursorChange); - - const codeMirrorWrapper = codeMirror.getWrapperElement(); - // Set code editor wrapper to be focusable - codeMirrorWrapper.tabIndex = 0; - codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e)); - codeMirrorWrapper.addEventListener("click", e => this.onClick(e)); - codeMirrorWrapper.addEventListener("mouseover", onMouseOver(codeMirror)); - - const toggleFoldMarkerVisibility = e => { - if (node instanceof HTMLElement) { - node - .querySelectorAll(".CodeMirror-guttermarker-subtle") - .forEach(elem => { - elem.classList.toggle("visible"); - }); - } - }; + if (!features.codemirrorNext) { + const { codeMirror } = editor; + + this.abortController = new window.AbortController(); + + // CodeMirror refreshes its internal state on window resize, but we need to also + // refresh it when the side panels are resized. + // We could have a ResizeObserver instead, but we wouldn't be able to differentiate + // between window resize and side panel resize and as a result, might refresh + // codeMirror twice, which is wasteful. + window.document + .querySelector(".editor-pane") + .addEventListener("resizeend", () => codeMirror.refresh(), { + signal: this.abortController.signal, + }); + + codeMirror.on("gutterClick", this.onGutterClick); + codeMirror.on("cursorActivity", this.onCursorChange); + + const codeMirrorWrapper = codeMirror.getWrapperElement(); + // Set code editor wrapper to be focusable + codeMirrorWrapper.tabIndex = 0; + codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e)); + codeMirrorWrapper.addEventListener("click", e => this.onClick(e)); + codeMirrorWrapper.addEventListener("mouseover", onMouseOver(codeMirror)); + + const toggleFoldMarkerVisibility = () => { + if (node instanceof HTMLElement) { + node + .querySelectorAll(".CodeMirror-guttermarker-subtle") + .forEach(elem => { + elem.classList.toggle("visible"); + }); + } + }; - const codeMirrorGutter = codeMirror.getGutterElement(); - codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility); - codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility); - codeMirrorWrapper.addEventListener("contextmenu", event => - this.openMenu(event) - ); + const codeMirrorGutter = codeMirror.getGutterElement(); + codeMirrorGutter.addEventListener( + "mouseleave", + toggleFoldMarkerVisibility + ); + codeMirrorGutter.addEventListener( + "mouseenter", + toggleFoldMarkerVisibility + ); + codeMirrorWrapper.addEventListener("contextmenu", event => + this.openMenu(event) + ); - codeMirror.on("scroll", this.onEditorScroll); - this.onEditorScroll(); + codeMirror.on("scroll", this.onEditorScroll); + this.onEditorScroll(); + } this.setState({ editor }); return editor; } componentDidMount() { - const { shortcuts } = this.context; + if (!features.codemirrorNext) { + const { shortcuts } = this.context; - shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint); - shortcuts.on( - L10N.getStr("toggleCondPanel.breakpoint.key"), - this.onToggleConditionalPanel - ); - shortcuts.on( - L10N.getStr("toggleCondPanel.logPoint.key"), - this.onToggleConditionalPanel - ); - shortcuts.on( - L10N.getStr("sourceTabs.closeTab.key"), - this.onCloseShortcutPress - ); - shortcuts.on("Esc", this.onEscape); + shortcuts.on( + L10N.getStr("toggleBreakpoint.key"), + this.onToggleBreakpoint + ); + shortcuts.on( + L10N.getStr("toggleCondPanel.breakpoint.key"), + this.onToggleConditionalPanel + ); + shortcuts.on( + L10N.getStr("toggleCondPanel.logPoint.key"), + this.onToggleConditionalPanel + ); + shortcuts.on( + L10N.getStr("sourceTabs.closeTab.key"), + this.onCloseShortcutPress + ); + shortcuts.on("Esc", this.onEscape); + } } onCloseShortcutPress = e => { @@ -260,22 +281,24 @@ class Editor extends PureComponent { }; componentWillUnmount() { - const { editor } = this.state; - if (editor) { - editor.destroy(); - editor.codeMirror.off("scroll", this.onEditorScroll); - this.setState({ editor: null }); - } + if (!features.codemirrorNext) { + const { editor } = this.state; + if (editor) { + editor.destroy(); + editor.codeMirror.off("scroll", this.onEditorScroll); + this.setState({ editor: null }); + } - const { shortcuts } = this.context; - shortcuts.off(L10N.getStr("sourceTabs.closeTab.key")); - shortcuts.off(L10N.getStr("toggleBreakpoint.key")); - shortcuts.off(L10N.getStr("toggleCondPanel.breakpoint.key")); - shortcuts.off(L10N.getStr("toggleCondPanel.logPoint.key")); + const { shortcuts } = this.context; + shortcuts.off(L10N.getStr("sourceTabs.closeTab.key")); + shortcuts.off(L10N.getStr("toggleBreakpoint.key")); + shortcuts.off(L10N.getStr("toggleCondPanel.breakpoint.key")); + shortcuts.off(L10N.getStr("toggleCondPanel.logPoint.key")); - if (this.abortController) { - this.abortController.abort(); - this.abortController = null; + if (this.abortController) { + this.abortController.abort(); + this.abortController = null; + } } } @@ -542,7 +565,7 @@ class Editor extends PureComponent { } } - shouldScrollToLocation(nextProps, editor) { + shouldScrollToLocation(nextProps) { if ( !nextProps.selectedLocation?.line || !nextProps.selectedSourceTextContent @@ -583,12 +606,14 @@ class Editor extends PureComponent { // check if we previously had a selected source if (!selectedSource) { - this.clearEditor(); + if (!features.codemirrorNext) { + this.clearEditor(); + } return; } if (!selectedSourceTextContent?.value) { - showLoading(editor); + this.showLoadingMessage(editor); return; } @@ -602,7 +627,16 @@ class Editor extends PureComponent { return; } - showSourceText(editor, selectedSource, selectedSourceTextContent, symbols); + if (!features.codemirrorNext) { + showSourceText( + editor, + selectedSource, + selectedSourceTextContent, + symbols + ); + } else { + editor.setText(selectedSourceTextContent.value.value); + } } clearEditor() { @@ -611,7 +645,9 @@ class Editor extends PureComponent { return; } - clearEditor(editor); + const doc = editor.createDocument("", { name: "text" }); + editor.replaceDocument(doc); + resetLineNumberFormat(editor); } showErrorMessage(msg) { @@ -620,7 +656,37 @@ class Editor extends PureComponent { return; } - showErrorMessage(editor, msg); + let error; + if (msg.includes("WebAssembly binary source is not available")) { + error = L10N.getStr("wasmIsNotAvailable"); + } else { + error = L10N.getFormatStr("errorLoadingText3", msg); + } + if (!features.codemirrorNext) { + const doc = editor.createDocument(error, { name: "text" }); + editor.replaceDocument(doc); + resetLineNumberFormat(editor); + } else { + editor.setText(error); + } + } + + showLoadingMessage(editor) { + if (!features.codemirrorNext) { + // Create the "loading message" document only once + let doc = getDocument("loading"); + if (!doc) { + doc = editor.createDocument(L10N.getStr("loadingText"), { + name: "text", + }); + setDocument("loading", doc); + } + // `createDocument` won't be used right away in the editor, we still need to + // explicitely update it + editor.replaceDocument(doc); + } else { + editor.setText(L10N.getStr("loadingText")); + } } getInlineEditorStyles() { diff --git a/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js b/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js index 767dde9e6d..38bb318611 100644 --- a/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js +++ b/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js @@ -15,7 +15,7 @@ function createMockDocument(clear) { addLineClass: jest.fn(), removeLineClass: jest.fn(), markText: jest.fn(() => ({ clear })), - getLine: line => "", + getLine: () => "", }; return doc; diff --git a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap index 58e86f5009..86d848ec3e 100644 --- a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap +++ b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap @@ -22,6 +22,8 @@ exports[`ConditionalPanel should render at location of selected breakpoint 1`] = "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -44,6 +46,8 @@ exports[`ConditionalPanel should render at location of selected breakpoint 1`] = "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -217,6 +221,8 @@ exports[`ConditionalPanel should render at location of selected breakpoint 1`] = "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -239,6 +245,8 @@ exports[`ConditionalPanel should render at location of selected breakpoint 1`] = "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", } @@ -268,6 +276,8 @@ exports[`ConditionalPanel should render with condition at selected breakpoint lo "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -290,6 +300,8 @@ exports[`ConditionalPanel should render with condition at selected breakpoint lo "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -467,6 +479,8 @@ exports[`ConditionalPanel should render with condition at selected breakpoint lo "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -489,6 +503,8 @@ exports[`ConditionalPanel should render with condition at selected breakpoint lo "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", } @@ -518,6 +534,8 @@ exports[`ConditionalPanel should render with logpoint at selected breakpoint loc "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -540,6 +558,8 @@ exports[`ConditionalPanel should render with logpoint at selected breakpoint loc "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -717,6 +737,8 @@ exports[`ConditionalPanel should render with logpoint at selected breakpoint loc "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -739,6 +761,8 @@ exports[`ConditionalPanel should render with logpoint at selected breakpoint loc "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", } diff --git a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap index a453b034ff..6c56ad33e7 100644 --- a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap +++ b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap @@ -31,6 +31,16 @@ exports[`SourceFooter Component default case should render 1`] = ` className="prettyPrint" /> </button> + <MenuButton + className="devtools-button debugger-source-map-button disabled not-mapped" + icon={true} + menuId="debugger-source-map-button" + menuOffset={-5} + menuPosition="bottom" + title="Source Map status" + > + <Component /> + </MenuButton> </div> </div> <div @@ -77,6 +87,16 @@ exports[`SourceFooter Component move cursor should render new cursor position 1` className="prettyPrint" /> </button> + <MenuButton + className="devtools-button debugger-source-map-button disabled not-mapped" + icon={true} + menuId="debugger-source-map-button" + menuOffset={-5} + menuPosition="bottom" + title="Source Map status" + > + <Component /> + </MenuButton> </div> </div> <div diff --git a/devtools/client/debugger/src/components/PrimaryPanes/Outline.js b/devtools/client/debugger/src/components/PrimaryPanes/Outline.js index 79ebf7a38e..d52ed8ff40 100644 --- a/devtools/client/debugger/src/components/PrimaryPanes/Outline.js +++ b/devtools/client/debugger/src/components/PrimaryPanes/Outline.js @@ -82,6 +82,7 @@ export class Outline extends Component { selectedLocation: PropTypes.object.isRequired, getFunctionSymbols: PropTypes.func.isRequired, getClassSymbols: PropTypes.func.isRequired, + selectedSourceTextContent: PropTypes.object, canFetchSymbols: PropTypes.bool, }; } @@ -94,7 +95,8 @@ export class Outline extends Component { } componentDidUpdate(prevProps) { - const { cursorPosition, selectedLocation, canFetchSymbols } = this.props; + const { cursorPosition, selectedSourceTextContent, canFetchSymbols } = + this.props; if (cursorPosition && cursorPosition !== prevProps.cursorPosition) { this.setFocus(cursorPosition); } @@ -106,8 +108,11 @@ export class Outline extends Component { this.focusedElRef.scrollIntoView({ block: "center" }); } - // Lets make sure the source text has been loaded and is different - if (canFetchSymbols && prevProps.selectedLocation !== selectedLocation) { + // Lets make sure the source text has been loaded and it is different + if ( + canFetchSymbols && + prevProps.selectedSourceTextContent !== selectedSourceTextContent + ) { this.getClassAndFunctionSymbols(); } } @@ -133,8 +138,8 @@ export class Outline extends Component { } // Find items that enclose the selected location - const enclosedItems = [...classes, ...functions].filter( - ({ name, location }) => containsPosition(location, cursorPosition) + const enclosedItems = [...classes, ...functions].filter(({ location }) => + containsPosition(location, cursorPosition) ); if (!enclosedItems.length) { @@ -360,7 +365,7 @@ export class Outline extends Component { div( null, React.createElement(OutlineFilter, { - filter: filter, + filter, updateFilter: this.updateFilter, }), this.renderFunctions(functions), @@ -373,6 +378,7 @@ export class Outline extends Component { const mapStateToProps = state => { const selectedSourceTextContent = getSelectedSourceTextContent(state); return { + selectedSourceTextContent, selectedLocation: getSelectedLocation(state), canFetchSymbols: selectedSourceTextContent && isFulfilled(selectedSourceTextContent), diff --git a/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js index 68b08aed2b..b5a99316f8 100644 --- a/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js +++ b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js @@ -16,7 +16,6 @@ import { getEditor } from "../../utils/editor/index"; import { searchKeys } from "../../constants"; import { getRelativePath } from "../../utils/sources-tree/utils"; -import { getFormattedSourceId } from "../../utils/source"; import { getProjectSearchQuery, getNavigateCounter, @@ -265,7 +264,7 @@ export class ProjectSearch extends Component { }, file.location.source.url ? getRelativePath(file.location.source.url) - : getFormattedSourceId(file.location.source.id) + : file.location.source.shortName ), span( { @@ -353,7 +352,7 @@ export class ProjectSearch extends Component { autoExpandAll: true, autoExpandDepth: 1, autoExpandNodeChildrenLimit: 100, - getParent: item => null, + getParent: () => null, getPath: getFilePath, renderItem: this.renderItem, focused: this.state.focusedItem, diff --git a/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js index fd5ceca46d..575d714ba5 100644 --- a/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js +++ b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js @@ -19,7 +19,6 @@ import actions from "../../actions/index"; import { sourceTypes } from "../../utils/source"; import { createLocation } from "../../utils/location"; -import { safeDecodeItemName } from "../../utils/sources-tree/utils"; const classnames = require("resource://devtools/client/shared/classnames.js"); @@ -48,7 +47,7 @@ class SourceTreeItem extends Component { } } - onClick = e => { + onClick = () => { const { item, focusItem, selectSourceItem } = this.props; focusItem(item); @@ -147,19 +146,14 @@ class SourceTreeItem extends Component { ); } if (item.type == "group") { - return safeDecodeItemName(item.groupName); + return item.groupName; } if (item.type == "directory") { const parentItem = this.props.getParent(item); - return safeDecodeItemName( - item.path.replace(parentItem.path, "").replace(/^\//, "") - ); + return item.path.replace(parentItem.path, "").replace(/^\//, ""); } if (item.type == "source") { - const { displayURL } = item.source; - const name = - displayURL.filename + (displayURL.search ? displayURL.search : ""); - return safeDecodeItemName(name); + return item.source.longName; } return null; diff --git a/devtools/client/debugger/src/components/QuickOpenModal.js b/devtools/client/debugger/src/components/QuickOpenModal.js index aa3d4f73b6..438592296d 100644 --- a/devtools/client/debugger/src/components/QuickOpenModal.js +++ b/devtools/client/debugger/src/components/QuickOpenModal.js @@ -377,7 +377,7 @@ export class QuickOpenModal extends Component { isSourceSearch = () => this.isSourcesQuery() || this.isGotoSourceQuery(); /* eslint-disable react/no-danger */ - renderHighlight(candidateString, query, name) { + renderHighlight(candidateString, query) { const options = { wrap: { tagOpen: '<mark class="highlight">', @@ -444,7 +444,7 @@ export class QuickOpenModal extends Component { handleClose: this.closeModal, }, React.createElement(SearchInput, { - query: query, + query, hasPrefix: true, count: this.getResultCount(), placeholder: L10N.getStr("sourceSearch.search2"), @@ -454,7 +454,7 @@ export class QuickOpenModal extends Component { onChange: this.onChange, onKeyDown: this.onKeyDown, handleClose: this.closeModal, - expanded: expanded, + expanded, showClose: false, searchKey: searchKeys.QUICKOPEN_SEARCH, showExcludePatterns: false, @@ -466,11 +466,11 @@ export class QuickOpenModal extends Component { results && React.createElement(ResultList, { key: "results", - items: items, + items, selected: selectedIndex, selectItem: this.selectResultItem, ref: "resultList", - expanded: expanded, + expanded, ...(this.isSourceSearch() ? SIZE_BIG : SIZE_DEFAULT), }) ); diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js index 78cc530cff..a4a5010c48 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js @@ -12,7 +12,6 @@ import actions from "../../../actions/index"; import { getTruncatedFileName, getDisplayPath, - getSourceQueryString, getFileURL, } from "../../../utils/source"; import { createLocation } from "../../../utils/location"; @@ -40,7 +39,6 @@ class BreakpointHeading extends PureComponent { const { sources, source, selectSource } = this.props; const path = getDisplayPath(source, sources); - const query = getSourceQueryString(source); return div( { className: "breakpoint-heading", @@ -67,7 +65,7 @@ class BreakpointHeading extends PureComponent { { className: "filename", }, - getTruncatedFileName(source, query), + getTruncatedFileName(source), path && span(null, `../${path}/..`) ) ); diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js index 31ff3f44a3..caec23b848 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js @@ -21,7 +21,7 @@ export default function ExceptionOption({ input({ type: "checkbox", checked: isChecked, - onChange: onChange, + onChange, }), div( { diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js index 0f5d6f7ae3..1f5e08cd7e 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js @@ -17,6 +17,7 @@ import { getSelectedLocation } from "../../../utils/selected-location"; import { createHeadlessEditor } from "../../../utils/editor/create-editor"; import { makeBreakpointId } from "../../../utils/breakpoint/index"; +import { features } from "../../../utils/prefs"; import { getSelectedSource, @@ -44,7 +45,7 @@ class Breakpoints extends Component { this.removeEditor(); } - getEditor() { + getHeadlessEditor() { if (!this.headlessEditor) { this.headlessEditor = createHeadlessEditor(); } @@ -119,7 +120,7 @@ class Breakpoints extends Component { return null; } - const editor = this.getEditor(); + const editor = this.getHeadlessEditor(); const sources = breakpointSources.map(({ source }) => source); return div( { @@ -153,7 +154,7 @@ class Breakpoints extends Component { className: "pane", }, this.renderExceptionsOptions(), - this.renderBreakpoints() + !features.codemirrorNext ? this.renderBreakpoints() : null ); } } diff --git a/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js index deae156a40..3dca62d48a 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js @@ -231,7 +231,7 @@ class CommandBar extends Component { formatKey("trace"), this.props.logMethod ), - onClick: event => { + onClick: () => { this.props.toggleTracing(); }, onContextMenu: event => { @@ -362,7 +362,7 @@ class CommandBar extends Component { MenuButton, { menuId: "debugger-settings-menu-button", - toolboxDoc: toolboxDoc, + toolboxDoc, className: "devtools-button command-bar-button debugger-settings-menu-button", title: L10N.getStr("settings.button.label"), diff --git a/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js index ce7eabf89d..00c885ec16 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js @@ -116,11 +116,11 @@ class EventListeners extends Component { } }; - onFocus = event => { + onFocus = () => { this.setState({ focused: true }); }; - onBlur = event => { + onBlur = () => { this.setState({ focused: false }); }; @@ -136,7 +136,7 @@ class EventListeners extends Component { className: classnames("event-search-input", { focused, }), - placeholder: placeholder, + placeholder, value: searchText, onChange: this.onInputChange, onKeyDown: this.onKeyDown, @@ -233,7 +233,7 @@ class EventListeners extends Component { indeterminate ? false : e.target.checked ); }, - checked: checked, + checked, ref: el => el && (el.indeterminate = indeterminate), }), span( diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js index be05c7327c..89b1f651ce 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js @@ -296,7 +296,7 @@ class Expressions extends Component { roots: [root], autoExpandDepth: 0, disableWrap: true, - openLink: openLink, + openLink, createElement: this.createElement, onDoubleClick: (items, { depth }) => { if (depth === 0) { @@ -374,7 +374,7 @@ class Expressions extends Component { input({ className: "input-expression", type: "text", - placeholder: L10N.getStr("expressions.placeholder"), + placeholder: L10N.getStr("expressions.placeholder2"), onChange: this.handleChange, onBlur: this.hideInput, onKeyDown: this.handleKeyDown, diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js index 0c81d8afb4..2c5cc679bf 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js @@ -7,7 +7,7 @@ import PropTypes from "devtools/client/shared/vendor/react-prop-types"; import AccessibleImage from "../../shared/AccessibleImage"; import { formatDisplayName } from "../../../utils/pause/frames/index"; -import { getFilename, getFileURL } from "../../../utils/source"; +import { getFileURL } from "../../../utils/source"; import FrameIndent from "./FrameIndent"; const classnames = require("resource://devtools/client/shared/classnames.js"); @@ -52,7 +52,7 @@ const FrameLocation = memo( const location = getFrameLocation(frame, shouldDisplayOriginalLocation); const filename = displayFullUrl ? getFileURL(location.source, false) - : getFilename(location.source); + : location.source.shortName; return React.createElement( "span", { @@ -124,7 +124,7 @@ export default class FrameComponent extends Component { this.props.showFrameContextMenu(event, frame); } - onMouseDown(e, frame, selectedFrame) { + onMouseDown(e, frame) { if (e.button !== 0) { return; } @@ -132,7 +132,7 @@ export default class FrameComponent extends Component { this.props.selectFrame(frame); } - onKeyUp(event, frame, selectedFrame) { + onKeyUp(event, frame) { if (event.key != "Enter") { return; } @@ -167,12 +167,12 @@ export default class FrameComponent extends Component { { role: "listitem", key: frame.id, - className: className, + className, onMouseDown: e => this.onMouseDown(e, frame, selectedFrame), onKeyUp: e => this.onKeyUp(e, frame, selectedFrame), onContextMenu: disableContextMenu ? null : e => this.onContextMenu(e), tabIndex: 0, - title: title, + title, }, frame.asyncCause && React.createElement( diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js index ab9f7073a7..a4ec7f72da 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js @@ -110,18 +110,18 @@ export default class Group extends Component { }, group.map(frame => React.createElement(FrameComponent, { - frame: frame, - showFrameContextMenu: showFrameContextMenu, + frame, + showFrameContextMenu, hideLocation: true, key: frame.id, - selectedFrame: selectedFrame, - selectFrame: selectFrame, - selectLocation: selectLocation, + selectedFrame, + selectFrame, + selectLocation, shouldMapDisplayName: false, - displayFullUrl: displayFullUrl, - getFrameTitle: getFrameTitle, - disableContextMenu: disableContextMenu, - panel: panel, + displayFullUrl, + getFrameTitle, + disableContextMenu, + panel, isInGroup: true, }) ) diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js index d83b413a01..ff60270024 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js @@ -115,28 +115,28 @@ class Frames extends Component { frameOrGroup.id ? React.createElement(FrameComponent, { frame: frameOrGroup, - showFrameContextMenu: showFrameContextMenu, - selectFrame: selectFrame, - selectLocation: selectLocation, - selectedFrame: selectedFrame, - shouldDisplayOriginalLocation: shouldDisplayOriginalLocation, + showFrameContextMenu, + selectFrame, + selectLocation, + selectedFrame, + shouldDisplayOriginalLocation, key: String(frameOrGroup.id), - displayFullUrl: displayFullUrl, - getFrameTitle: getFrameTitle, - disableContextMenu: disableContextMenu, - panel: panel, + displayFullUrl, + getFrameTitle, + disableContextMenu, + panel, }) : React.createElement(Group, { group: frameOrGroup, - showFrameContextMenu: showFrameContextMenu, - selectFrame: selectFrame, - selectLocation: selectLocation, - selectedFrame: selectedFrame, + showFrameContextMenu, + selectFrame, + selectLocation, + selectedFrame, key: frameOrGroup[0].id, - displayFullUrl: displayFullUrl, - getFrameTitle: getFrameTitle, - disableContextMenu: disableContextMenu, - panel: panel, + displayFullUrl, + getFrameTitle, + disableContextMenu, + panel, }) ) ); diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap index 90a5b1f906..c4e6722629 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap +++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap @@ -36,6 +36,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -57,6 +59,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -82,6 +86,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -103,6 +109,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -135,6 +143,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -178,6 +188,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -199,6 +211,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -224,6 +238,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -245,6 +261,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -277,6 +295,8 @@ exports[`Frame getFrameTitle 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js", }, @@ -328,6 +348,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -349,6 +371,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -375,6 +399,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -396,6 +422,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -428,6 +456,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -471,6 +501,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -492,6 +524,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -518,6 +552,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -539,6 +575,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -571,6 +609,8 @@ exports[`Frame library frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "backbone.js", + "shortName": "backbone.js", "thread": "FakeThread", "url": "backbone.js", }, @@ -622,6 +662,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -643,6 +685,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -668,6 +712,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -689,6 +735,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -721,6 +769,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -764,6 +814,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -785,6 +837,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -810,6 +864,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -831,6 +887,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -863,6 +921,8 @@ exports[`Frame user frame (not selected) 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -914,6 +974,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -935,6 +997,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -960,6 +1024,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -981,6 +1047,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1013,6 +1081,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1056,6 +1126,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1077,6 +1149,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1102,6 +1176,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1123,6 +1199,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, @@ -1155,6 +1233,8 @@ exports[`Frame user frame 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "foo-view.js", + "shortName": "foo-view.js", "thread": "FakeThread", "url": "foo-view.js", }, diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap index 97c4c2ad1a..21a5321ba1 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap +++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap @@ -37,6 +37,8 @@ exports[`Group displays a group 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -58,6 +60,8 @@ exports[`Group displays a group 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -84,6 +88,8 @@ exports[`Group displays a group 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -105,6 +111,8 @@ exports[`Group displays a group 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -137,6 +145,8 @@ exports[`Group displays a group 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -199,6 +209,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -220,6 +232,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -246,6 +260,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -267,6 +283,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -299,6 +317,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -348,6 +368,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -369,6 +391,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -395,6 +419,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -416,6 +442,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -448,6 +476,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -485,6 +515,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -506,6 +538,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -532,6 +566,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -553,6 +589,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -585,6 +623,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -620,6 +660,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -641,6 +683,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -667,6 +711,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -688,6 +734,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -720,6 +768,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -757,6 +807,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -778,6 +830,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -804,6 +858,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -825,6 +881,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -857,6 +915,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -892,6 +952,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -913,6 +975,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -939,6 +1003,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -960,6 +1026,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -992,6 +1060,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1029,6 +1099,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1050,6 +1122,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1076,6 +1150,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1097,6 +1173,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1129,6 +1207,8 @@ exports[`Group passes the getFrameTitle prop to the Frame components 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1181,6 +1261,8 @@ exports[`Group renders group with anonymous functions 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1202,6 +1284,8 @@ exports[`Group renders group with anonymous functions 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1228,6 +1312,8 @@ exports[`Group renders group with anonymous functions 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1249,6 +1335,8 @@ exports[`Group renders group with anonymous functions 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1281,6 +1369,8 @@ exports[`Group renders group with anonymous functions 1`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1343,6 +1433,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1364,6 +1456,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1390,6 +1484,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1411,6 +1507,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1443,6 +1541,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1492,6 +1592,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1513,6 +1615,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1539,6 +1643,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1560,6 +1666,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1592,6 +1700,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "mahscripts.js", + "shortName": "mahscripts.js", "thread": "FakeThread", "url": "http://myfile.com/mahscripts.js", }, @@ -1628,6 +1738,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1649,6 +1761,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1675,6 +1789,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1696,6 +1812,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1728,6 +1846,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1763,6 +1883,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1784,6 +1906,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1810,6 +1934,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1831,6 +1957,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1863,6 +1991,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -1899,6 +2029,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1920,6 +2052,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1946,6 +2080,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1967,6 +2103,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -1999,6 +2137,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -2034,6 +2174,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -2055,6 +2197,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -2081,6 +2225,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -2102,6 +2248,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -2134,6 +2282,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "back.js", + "shortName": "back.js", "thread": "FakeThread", "url": "http://myfile.com/back.js", }, @@ -2170,6 +2320,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -2191,6 +2343,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -2217,6 +2371,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -2238,6 +2394,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -2270,6 +2428,8 @@ exports[`Group renders group with anonymous functions 2`] = ` "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js index 135decd254..65e4d19032 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js @@ -307,7 +307,7 @@ class Scopes extends PureComponent { dimTopLevelWindow: true, frame: selectedFrame, mayUseCustomFormatter: true, - openLink: openLink, + openLink, onDOMNodeClick: grip => openElementInInspector(grip), onInspectIconClick: grip => openElementInInspector(grip), onDOMNodeMouseOver: grip => highlightDomElement(grip), @@ -315,7 +315,7 @@ class Scopes extends PureComponent { onContextMenu: this.onContextMenu, setExpanded: (path, expand) => setExpandedScope(selectedFrame, path, expand), - initiallyExpanded: initiallyExpanded, + initiallyExpanded, renderItemActions: this.renderWatchpointButton, shouldRenderTooltip: true, }) diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Threads.js b/devtools/client/debugger/src/components/SecondaryPanes/Threads.js index 2d21a1dcc5..f1426c95cb 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/Threads.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/Threads.js @@ -25,7 +25,7 @@ export class Threads extends Component { }, threads.map(thread => React.createElement(Thread, { - thread: thread, + thread, key: thread.actor, }) ) diff --git a/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js index 9774255dcd..f0b86a5f5c 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js @@ -164,7 +164,7 @@ class XHRBreakpoints extends Component { this.setState({ focused: true, editing: true }); }; - onMouseDown = e => { + onMouseDown = () => { this.setState({ editing: false, clickedOnFormElement: true }); }; @@ -205,12 +205,12 @@ class XHRBreakpoints extends Component { className: classnames("xhr-input-container xhr-input-form", { focused, }), - onSubmit: onSubmit, + onSubmit, }, input({ className: "xhr-input-url", type: "text", - placeholder: placeholder, + placeholder, onChange: this.handleChange, onBlur: this.hideInput, onFocus: this.onFocus, @@ -262,7 +262,7 @@ class XHRBreakpoints extends Component { className: "xhr-container", key: `${path}-${method}`, title: path, - onDoubleClick: (items, options) => this.editExpression(index), + onDoubleClick: () => this.editExpression(index), }, label( null, @@ -290,7 +290,7 @@ class XHRBreakpoints extends Component { className: "xhr-container__close-btn", }, React.createElement(CloseButton, { - handleClick: e => removeXHRBreakpoint(index), + handleClick: () => removeXHRBreakpoint(index), }) ) ) diff --git a/devtools/client/debugger/src/components/SecondaryPanes/index.js b/devtools/client/debugger/src/components/SecondaryPanes/index.js index 20830afc12..52d0d3298e 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/index.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/index.js @@ -52,7 +52,7 @@ const classnames = require("resource://devtools/client/shared/classnames.js"); function debugBtn(onClick, type, className, tooltip) { return button( { - onClick: onClick, + onClick, className: `${type} ${className}`, key: type, title: tooltip, @@ -136,7 +136,7 @@ class SecondaryPanes extends Component { }, "plus", "active", - L10N.getStr("expressions.placeholder") + L10N.getStr("expressions.placeholder2") ) ); return buttons; @@ -214,7 +214,7 @@ class SecondaryPanes extends Component { input({ type: "checkbox", checked: mapScopesEnabled ? "checked" : "", - onChange: e => this.props.toggleMapScopes(), + onChange: () => this.props.toggleMapScopes(), }), L10N.getStr("scopes.showOriginalScopes") ), @@ -249,7 +249,7 @@ class SecondaryPanes extends Component { input({ type: "checkbox", checked: logEventBreakpoints ? "checked" : "", - onChange: e => this.props.toggleEventLogging(), + onChange: () => this.props.toggleEventLogging(), }), L10N.getStr("eventlisteners.log") ) diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js index 532c95e4ad..de7ab02ebe 100644 --- a/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js +++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js @@ -225,7 +225,7 @@ describe("XHR Breakpoints", function () { } // check each expected XHR Method to see if they match the actual methods - expectedXHRMethods.forEach((expectedMethod, i) => { + expectedXHRMethods.forEach(expectedMethod => { function compareMethods(actualMethod) { return expectedMethod === actualMethod; } diff --git a/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js b/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js index 4b0b52e186..430feed904 100644 --- a/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js +++ b/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js @@ -22,9 +22,9 @@ export function debugBtn( CommandBarButton, { className: classnames(type, className), - disabled: disabled, + disabled, key: type, - onClick: onClick, + onClick, pressed: ariaPressed, title: tooltip, }, diff --git a/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js b/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js index 5e448881d9..60a500776c 100644 --- a/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js +++ b/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js @@ -11,7 +11,7 @@ describe("CloseButton", () => { const tooltip = "testTooltip"; const wrapper = shallow( React.createElement(CloseButton, { - tooltip: tooltip, + tooltip, handleClick: () => {}, }) ); diff --git a/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js b/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js index 41537cf8e4..cad3dc1f6b 100644 --- a/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js +++ b/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js @@ -21,7 +21,7 @@ describe("CommandBarButton", () => { const children = [1, 2, 3, 4]; const wrapper = shallow( React.createElement(CommandBarButton, { - children: children, + children, className: "", }) ); diff --git a/devtools/client/debugger/src/components/shared/Dropdown.js b/devtools/client/debugger/src/components/shared/Dropdown.js index a47eef9534..69727b032a 100644 --- a/devtools/client/debugger/src/components/shared/Dropdown.js +++ b/devtools/client/debugger/src/components/shared/Dropdown.js @@ -21,7 +21,7 @@ export class Dropdown extends Component { }; } - toggleDropdown = e => { + toggleDropdown = () => { this.setState(prevState => ({ dropdownShown: !prevState.dropdownShown, })); diff --git a/devtools/client/debugger/src/components/shared/Popover.js b/devtools/client/debugger/src/components/shared/Popover.js index 8748e36418..b81fd7e89e 100644 --- a/devtools/client/debugger/src/components/shared/Popover.js +++ b/devtools/client/debugger/src/components/shared/Popover.js @@ -255,7 +255,6 @@ class Popover extends Component { React.createElement(SmartGap, { token: this.props.target, preview: this.$tooltip || this.$popover, - type: this.props.type, gapHeight: this.gapHeight, coords: this.state.coords, offset: this.$gap.getBoundingClientRect().left, diff --git a/devtools/client/debugger/src/components/shared/ResultList.js b/devtools/client/debugger/src/components/shared/ResultList.js index 6b29de51f4..fb921612e7 100644 --- a/devtools/client/debugger/src/components/shared/ResultList.js +++ b/devtools/client/debugger/src/components/shared/ResultList.js @@ -93,7 +93,7 @@ export default class ResultList extends Component { ref: this.ref, className: classnames("result-list", size), id: "result-list", - role: role, + role, "aria-live": "polite", }, items.map(this.renderListItem) diff --git a/devtools/client/debugger/src/components/shared/SmartGap.js b/devtools/client/debugger/src/components/shared/SmartGap.js index d76d018987..5810aea6ea 100644 --- a/devtools/client/debugger/src/components/shared/SmartGap.js +++ b/devtools/client/debugger/src/components/shared/SmartGap.js @@ -109,7 +109,6 @@ function getSmartGapDimensions( export default function SmartGap({ token, preview, - type, gapHeight, coords, offset, diff --git a/devtools/client/debugger/src/components/shared/tests/Popover.spec.js b/devtools/client/debugger/src/components/shared/tests/Popover.spec.js index 7150f4afe8..0febe5dcd5 100644 --- a/devtools/client/debugger/src/components/shared/tests/Popover.spec.js +++ b/devtools/client/debugger/src/components/shared/tests/Popover.spec.js @@ -53,10 +53,10 @@ describe("Popover", () => { React.createElement( Popover, { - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, - editorRef: editorRef, - targetPosition: targetPosition, + onMouseLeave, + onKeyDown, + editorRef, + targetPosition, mouseout: () => {}, target: targetRef, }, @@ -69,10 +69,10 @@ describe("Popover", () => { Popover, { type: "tooltip", - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, - editorRef: editorRef, - targetPosition: targetPosition, + onMouseLeave, + onKeyDown, + editorRef, + targetPosition, mouseout: () => {}, target: targetRef, }, @@ -94,10 +94,10 @@ describe("Popover", () => { React.createElement( Popover, { - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, - editorRef: editorRef, - targetPosition: targetPosition, + onMouseLeave, + onKeyDown, + editorRef, + targetPosition, mouseout: () => {}, target: targetRef, }, @@ -113,10 +113,10 @@ describe("Popover", () => { Popover, { type: "tooltip", - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, - editorRef: editorRef, - targetPosition: targetPosition, + onMouseLeave, + onKeyDown, + editorRef, + targetPosition, mouseout: () => {}, target: targetRef, }, @@ -153,8 +153,8 @@ describe("Popover", () => { Popover, { type: "tooltip", - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, + onMouseLeave, + onKeyDown, editorRef: editor, targetPosition: target, mouseout: () => {}, @@ -195,8 +195,8 @@ describe("Popover", () => { Popover, { type: "tooltip", - onMouseLeave: onMouseLeave, - onKeyDown: onKeyDown, + onMouseLeave, + onKeyDown, editorRef: editor, targetPosition: target, mouseout: () => {}, diff --git a/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js b/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js index c4c3990771..d7e1e5805c 100644 --- a/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js +++ b/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js @@ -17,7 +17,7 @@ describe("SearchInput", () => { }); const wrapper = shallow( React.createElement(SearchInput, { - store: store, + store, query: "", count: 5, placeholder: "A placeholder", diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap index 1c3589a6f8..6379668d6e 100644 --- a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap +++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap @@ -105,7 +105,6 @@ exports[`Popover mount popover 1`] = ` "getBoundingClientRect": [Function], } } - type="popover" > <svg style={ @@ -234,7 +233,6 @@ exports[`Popover mount tooltip 1`] = ` "getBoundingClientRect": [Function], } } - type="tooltip" > <svg style={ @@ -359,7 +357,6 @@ exports[`Popover render (tooltip) 1`] = ` "getBoundingClientRect": [Function], } } - type="tooltip" > <svg style={ @@ -504,7 +501,6 @@ exports[`Popover render 1`] = ` "getBoundingClientRect": [Function], } } - type="popover" > <svg style={ diff --git a/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js b/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js index 74bc7c75bc..2700960c37 100644 --- a/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js +++ b/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js @@ -130,6 +130,7 @@ describe("QuickOpenModal", () => { displayedSources: [ { url: "mozilla.com", + shortName: "mozilla.com", displayURL: getDisplayURL("mozilla.com"), }, ], @@ -147,6 +148,7 @@ describe("QuickOpenModal", () => { value: "mozilla.com", source: { url: "mozilla.com", + shortName: "mozilla.com", displayURL: getDisplayURL("mozilla.com"), }, }, diff --git a/devtools/client/debugger/src/main.js b/devtools/client/debugger/src/main.js index 83a6c1e6fc..ec734a89d0 100644 --- a/devtools/client/debugger/src/main.js +++ b/devtools/client/debugger/src/main.js @@ -66,7 +66,7 @@ function setPauseOnExceptions() { ); } -async function loadInitialState(commands, toolbox) { +async function loadInitialState() { const pendingBreakpoints = sanitizeBreakpoints( await asyncStore.pendingBreakpoints ); @@ -103,7 +103,7 @@ export async function bootstrap({ // record events. setToolboxTelemetry(panel.toolbox.telemetry); - const initialState = await loadInitialState(commands, panel.toolbox); + const initialState = await loadInitialState(); const workers = bootstrapWorkers(panelWorkers); const { store, actions, selectors } = bootstrapStore( diff --git a/devtools/client/debugger/src/reducers/sources-tree.js b/devtools/client/debugger/src/reducers/sources-tree.js index 0f0e8dadb3..ee8a8d0ca0 100644 --- a/devtools/client/debugger/src/reducers/sources-tree.js +++ b/devtools/client/debugger/src/reducers/sources-tree.js @@ -25,6 +25,11 @@ const IGNORED_EXTENSIONS = ["css", "svg", "png"]; import { isPretty, getRawSourceURL } from "../utils/source"; import { prefs } from "../utils/prefs"; +const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + BinarySearch: "resource://gre/modules/BinarySearch.sys.mjs", +}); + export function initialSourcesTreeState() { return { // List of all Thread Tree Items. @@ -224,8 +229,10 @@ function addThread(state, thread) { // (this is also used by sortThreadItems to sort the thread as a Tree in the Browser Toolbox) threadItem.thread = thread; - // We have to re-sort all threads because of the new `thread` attribute on current thread item - state.threadItems.sort(sortThreadItems); + // We have to remove and re-insert the thread as its order will be based on the newly set `thread` attribute + state.threadItems = [...state.threadItems]; + state.threadItems.splice(state.threadItems.indexOf(threadItem), 1); + addSortedItem(state.threadItems, threadItem, sortThreadItems); } } @@ -303,13 +310,12 @@ function isSourceVisibleInSourceTree( * The already sorted into which a value should be added. * @param {any} newValue * The value to add in the array while keeping the array sorted. - * @param {Function} sortFunction + * @param {Function} comparator * A function to compare two array values and their ordering. * Follow same behavior as Array sorting function. */ -function addSortedItem(array, newValue, sortFunction) { - let index = array.findIndex(value => sortFunction(value, newValue) === 1); - index = index >= 0 ? index : array.length; +function addSortedItem(array, newValue, comparator) { + const index = lazy.BinarySearch.insertionIndexOf(comparator, array, newValue); array.splice(index, 0, newValue); } @@ -396,12 +402,12 @@ function sortItems(a, b) { return -1; } else if (b.type == "directory" && a.type == "source") { return 1; + } else if (a.type == "group" && b.type == "group") { + return a.groupName.localeCompare(b.groupName); } else if (a.type == "directory" && b.type == "directory") { return a.path.localeCompare(b.path); } else if (a.type == "source" && b.type == "source") { - return a.source.displayURL.filename.localeCompare( - b.source.displayURL.filename - ); + return a.source.longName.localeCompare(b.source.longName); } return 0; } @@ -447,7 +453,7 @@ function sortThreadItems(a, b) { if (a.thread.processID > b.thread.processID) { return 1; } else if (a.thread.processID < b.thread.processID) { - return 0; + return -1; } // Order the frame targets and the worker targets by their target name diff --git a/devtools/client/debugger/src/reducers/sources.js b/devtools/client/debugger/src/reducers/sources.js index 76160b75f2..6d90fd5c91 100644 --- a/devtools/client/debugger/src/reducers/sources.js +++ b/devtools/client/debugger/src/reducers/sources.js @@ -182,6 +182,19 @@ function update(state = initialSourcesState(), action) { }; } + case "SET_DEFAULT_SELECTED_LOCATION": { + if ( + state.shouldSelectOriginalLocation == + action.shouldSelectOriginalLocation + ) { + return state; + } + return { + ...state, + shouldSelectOriginalLocation: action.shouldSelectOriginalLocation, + }; + } + case "SET_PENDING_SELECTED_LOCATION": { const pendingSelectedLocation = { url: action.url, diff --git a/devtools/client/debugger/src/reducers/ui.js b/devtools/client/debugger/src/reducers/ui.js index 7f37d2f54f..3544b3aa5c 100644 --- a/devtools/client/debugger/src/reducers/ui.js +++ b/devtools/client/debugger/src/reducers/ui.js @@ -63,6 +63,7 @@ export const initialUIState = () => ({ }, projectSearchQuery: "", hideIgnoredSources: prefs.hideIgnoredSources, + sourceMapsEnabled: prefs.clientSourceMapsEnabled, sourceMapIgnoreListEnabled: prefs.sourceMapIgnoreListEnabled, }); @@ -93,7 +94,7 @@ function update(state = initialUIState(), action) { case "TOGGLE_SOURCE_MAPS_ENABLED": { prefs.clientSourceMapsEnabled = action.value; - return { ...state }; + return { ...state, sourceMapsEnabled: action.value }; } case "SET_ORIENTATION": { diff --git a/devtools/client/debugger/src/selectors/breakpointSources.js b/devtools/client/debugger/src/selectors/breakpointSources.js index a0daedae21..4867ade82c 100644 --- a/devtools/client/debugger/src/selectors/breakpointSources.js +++ b/devtools/client/debugger/src/selectors/breakpointSources.js @@ -5,7 +5,6 @@ import { createSelector } from "devtools/client/shared/vendor/reselect"; import { getSelectedSource } from "./sources"; import { getBreakpointsList } from "./breakpoints"; -import { getFilename } from "../utils/source"; import { getSelectedLocation } from "../utils/selected-location"; // Returns a list of sources with their related breakpoints: @@ -37,16 +36,15 @@ export const getBreakpointSources = createSelector( sources.set(source, { source, breakpoints: [breakpoint], - filename: getFilename(source), }); } else { sources.get(source).breakpoints.push(breakpoint); } } - // Returns an array of breakpoints info per source, sorted by source's filename + // Returns an array of breakpoints info per source, sorted by source's displayed name return [...sources.values()].sort((a, b) => - a.filename.localeCompare(b.filename) + a.source.shortName.localeCompare(b.source.shortName) ); } ); diff --git a/devtools/client/debugger/src/selectors/sources.js b/devtools/client/debugger/src/selectors/sources.js index 938eae9fe2..6a67cf1a32 100644 --- a/devtools/client/debugger/src/selectors/sources.js +++ b/devtools/client/debugger/src/selectors/sources.js @@ -163,6 +163,16 @@ export function getSelectedMappedSource(state) { return mappedSource || null; } +/** + * Helps knowing if we are still computing the mapped location for the currently selected source. + */ +export function isSelectedMappedSourceLoading(state) { + const { selectedOriginalLocation } = state.sources; + // This `selectedOriginalLocation` attribute is set to UNDEFINED_LOCATION when selecting a new source attribute + // and later on, when the source map is processed, it will switch to either a valid location object, or NO_LOCATION if no valid one if found. + return selectedOriginalLocation === UNDEFINED_LOCATION; +} + export const getSelectedSource = createSelector( getSelectedLocation, selectedLocation => { diff --git a/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap b/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap index e4b18538cf..04bc12bbec 100644 --- a/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap +++ b/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap @@ -22,6 +22,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -44,6 +46,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -83,6 +87,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -105,6 +111,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -152,6 +160,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -174,6 +184,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -221,6 +233,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, @@ -243,6 +257,8 @@ Array [ "isOriginal": false, "isPrettyPrinted": false, "isWasm": false, + "longName": "url", + "shortName": "url", "thread": "FakeThread", "url": "url", }, diff --git a/devtools/client/debugger/src/selectors/ui.js b/devtools/client/debugger/src/selectors/ui.js index 4780b5e051..0dc97bed1b 100644 --- a/devtools/client/debugger/src/selectors/ui.js +++ b/devtools/client/debugger/src/selectors/ui.js @@ -115,3 +115,7 @@ export function getHideIgnoredSources(state) { export function isSourceMapIgnoreListEnabled(state) { return state.ui.sourceMapIgnoreListEnabled; } + +export function areSourceMapsEnabled(state) { + return state.ui.sourceMapsEnabled; +} diff --git a/devtools/client/debugger/src/utils/bootstrap.js b/devtools/client/debugger/src/utils/bootstrap.js index e8d6de2cf0..e0ee6c35be 100644 --- a/devtools/client/debugger/src/utils/bootstrap.js +++ b/devtools/client/debugger/src/utils/bootstrap.js @@ -42,7 +42,7 @@ export function bootstrapStore(client, workers, panel, initialState) { const createStore = configureStore({ log: prefs.logging || flags.testing, timing: debugJsModules, - makeThunkArgs: (args, state) => { + makeThunkArgs: args => { return { ...args, client, ...workers, panel }; }, }); diff --git a/devtools/client/debugger/src/utils/editor/create-editor.js b/devtools/client/debugger/src/utils/editor/create-editor.js index 6bb280fc4d..74b41ff78b 100644 --- a/devtools/client/debugger/src/utils/editor/create-editor.js +++ b/devtools/client/debugger/src/utils/editor/create-editor.js @@ -5,7 +5,7 @@ import SourceEditor from "devtools/client/shared/sourceeditor/editor"; import { features, prefs } from "../prefs"; -export function createEditor() { +export function createEditor(useCm6 = false) { const gutters = ["breakpoints", "hit-markers", "CodeMirror-linenumbers"]; if (features.codeFolding) { @@ -13,7 +13,8 @@ export function createEditor() { } return new SourceEditor({ - mode: "javascript", + mode: SourceEditor.modes.js, + cm6: useCm6, foldGutter: features.codeFolding, enableCodeFolding: features.codeFolding, readOnly: true, diff --git a/devtools/client/debugger/src/utils/editor/index.js b/devtools/client/debugger/src/utils/editor/index.js index 1adc73b4f8..d12e2f29f1 100644 --- a/devtools/client/debugger/src/utils/editor/index.js +++ b/devtools/client/debugger/src/utils/editor/index.js @@ -14,12 +14,12 @@ import { createLocation } from "../location"; let editor; -export function getEditor() { +export function getEditor(useCm6) { if (editor) { return editor; } - editor = createEditor(); + editor = createEditor(useCm6); return editor; } @@ -27,6 +27,16 @@ export function removeEditor() { editor = null; } +/** + * Update line wrapping for the codemirror editor. + */ +export function updateEditorLineWrapping(value) { + if (!editor) { + return; + } + editor.setLineWrapping(value); +} + function getCodeMirror() { return editor && editor.hasCodeMirror ? editor.codeMirror : null; } diff --git a/devtools/client/debugger/src/utils/editor/source-documents.js b/devtools/client/debugger/src/utils/editor/source-documents.js index 2ddb0b1965..53ee4f2f35 100644 --- a/devtools/client/debugger/src/utils/editor/source-documents.js +++ b/devtools/client/debugger/src/utils/editor/source-documents.js @@ -35,7 +35,7 @@ export function clearDocumentsForSources(sources) { } } -function resetLineNumberFormat(editor) { +export function resetLineNumberFormat(editor) { const cm = editor.codeMirror; cm.setOption("lineNumberFormatter", number => number); resizeBreakpointGutter(cm); @@ -54,59 +54,6 @@ function updateLineNumberFormat(editor, sourceId) { resizeToggleButton(cm); } -export function updateDocument(editor, source) { - if (!source) { - return; - } - - const sourceId = source.id; - const doc = getDocument(sourceId) || editor.createDocument(); - editor.replaceDocument(doc); - - updateLineNumberFormat(editor, sourceId); -} - -/* used to apply the context menu wrap line option change to all the docs */ -export function updateDocuments(updater) { - for (const doc of sourceDocs.values()) { - if (doc.cm == null) { - continue; - } else { - updater(doc); - } - } -} - -export function clearEditor(editor) { - const doc = editor.createDocument("", { name: "text" }); - editor.replaceDocument(doc); - resetLineNumberFormat(editor); -} - -export function showLoading(editor) { - // Create the "loading message" document only once - let doc = getDocument("loading"); - if (!doc) { - doc = editor.createDocument(L10N.getStr("loadingText"), { name: "text" }); - setDocument("loading", doc); - } - // `createDocument` won't be used right away in the editor, we still need to - // explicitely update it - editor.replaceDocument(doc); -} - -export function showErrorMessage(editor, msg) { - let error; - if (msg.includes("WebAssembly binary source is not available")) { - error = L10N.getStr("wasmIsNotAvailable"); - } else { - error = L10N.getFormatStr("errorLoadingText3", msg); - } - const doc = editor.createDocument(error, { name: "text" }); - editor.replaceDocument(doc); - resetLineNumberFormat(editor); -} - const contentTypeModeMap = new Map([ ["text/javascript", { name: "javascript" }], ["text/typescript", { name: "javascript", typescript: true }], diff --git a/devtools/client/debugger/src/utils/editor/source-search.js b/devtools/client/debugger/src/utils/editor/source-search.js index 92097377ba..2316cd2ccb 100644 --- a/devtools/client/debugger/src/utils/editor/source-search.js +++ b/devtools/client/debugger/src/utils/editor/source-search.js @@ -27,7 +27,7 @@ function SearchState() { * @memberof utils/source-search * @static */ -function getSearchState(cm, query) { +function getSearchState(cm) { const state = cm.state.search || (cm.state.search = new SearchState()); return state; } @@ -55,7 +55,7 @@ function searchOverlay(query, modifiers) { }); return { - token: function (stream, state) { + token(stream) { // set the last index to be the current stream position // this acts as an offset regexQuery.lastIndex = stream.pos; @@ -141,11 +141,11 @@ function doSearch( return cm.operation(function () { if (!query || isWhitespace(query)) { - clearSearch(cm, query); + clearSearch(cm); return null; } - const state = getSearchState(cm, query); + const state = getSearchState(cm); const isNewQuery = state.query !== query; state.query = query; @@ -179,7 +179,7 @@ export function searchSourceForHighlight( } cm.operation(function () { - const state = getSearchState(cm, query); + const state = getSearchState(cm); const isNewQuery = state.query !== query; state.query = query; @@ -207,7 +207,7 @@ function searchNext(ctx, rev, query, newQuery, modifiers) { const { cm } = ctx; let nextMatch; cm.operation(function () { - const state = getSearchState(cm, query); + const state = getSearchState(cm); const pos = getCursorPos(newQuery, rev, state); if (!state.query) { @@ -261,8 +261,8 @@ function findNextOnLine(ctx, rev, query, newQuery, modifiers, line, ch) { * @memberof utils/source-search * @static */ -export function removeOverlay(ctx, query) { - const state = getSearchState(ctx.cm, query); +export function removeOverlay(ctx) { + const state = getSearchState(ctx.cm); ctx.cm.removeOverlay(state.overlay); const { line, ch } = ctx.cm.getCursor(); ctx.cm.doc.setSelection({ line, ch }, { line, ch }, { scroll: false }); @@ -274,8 +274,8 @@ export function removeOverlay(ctx, query) { * @memberof utils/source-search * @static */ -export function clearSearch(cm, query) { - const state = getSearchState(cm, query); +export function clearSearch(cm) { + const state = getSearchState(cm); state.results = []; @@ -293,7 +293,7 @@ export function clearSearch(cm, query) { * @static */ export function find(ctx, query, keepSelection, modifiers, focusFirstResult) { - clearSearch(ctx.cm, query); + clearSearch(ctx.cm); return doSearch( ctx, false, diff --git a/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap b/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap Binary files differindex 843647731b..5c47ed94c7 100644 --- a/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap +++ b/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap diff --git a/devtools/client/debugger/src/utils/moz.build b/devtools/client/debugger/src/utils/moz.build index 8deb8e18db..742f96e060 100644 --- a/devtools/client/debugger/src/utils/moz.build +++ b/devtools/client/debugger/src/utils/moz.build @@ -42,7 +42,6 @@ CompiledModules( "source-queue.js", "source.js", "tabs.js", - "task.js", "telemetry.js", "text.js", "ui.js", diff --git a/devtools/client/debugger/src/utils/quick-open.js b/devtools/client/debugger/src/utils/quick-open.js index e2624559bc..f51d1c6ac7 100644 --- a/devtools/client/debugger/src/utils/quick-open.js +++ b/devtools/client/debugger/src/utils/quick-open.js @@ -3,12 +3,7 @@ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ import { endTruncateStr } from "./utils"; -import { - getFilename, - getSourceClassnames, - getSourceQueryString, - getRelativeUrl, -} from "./source"; +import { getSourceClassnames, getRelativeUrl } from "./source"; export const MODIFIERS = { "@": "functions", @@ -62,16 +57,15 @@ export function formatSourceForList( isBlackBoxed, projectDirectoryRoot ) { - const title = getFilename(source); const relativeUrlWithQuery = `${getRelativeUrl( source, projectDirectoryRoot - )}${getSourceQueryString(source) || ""}`; + )}${source.displayURL.search || ""}`; const subtitle = endTruncateStr(relativeUrlWithQuery, 100); const value = relativeUrlWithQuery; return { value, - title, + title: source.shortName, subtitle, icon: hasTabOpened ? "tab result-item-icon" diff --git a/devtools/client/debugger/src/utils/source.js b/devtools/client/debugger/src/utils/source.js index 31920453eb..91a02778e2 100644 --- a/devtools/client/debugger/src/utils/source.js +++ b/devtools/client/debugger/src/utils/source.js @@ -17,7 +17,6 @@ const { import { getRelativePath } from "../utils/sources-tree/utils"; import { endTruncateStr } from "./utils"; import { truncateMiddleText } from "../utils/text"; -import { parse as parseURL } from "../utils/url"; import { memoizeLast } from "../utils/memoizeLast"; import { renderWasmText } from "./wasm"; import { toEditorLine } from "./editor/index"; @@ -214,33 +213,10 @@ export function getFormattedSourceId(id) { } /** - * Gets a readable filename from a source URL for display purposes. - * If the source does not have a URL, the source ID will be returned instead. - * - * @memberof utils/source - * @static - */ -export function getFilename( - source, - rawSourceURL = getRawSourceURL(source.url) -) { - const { id } = source; - if (!rawSourceURL) { - return getFormattedSourceId(id); - } - - const { filename } = source.displayURL; - return getRawSourceURL(filename); -} - -/** - * Provides a middle-trunated filename - * - * @memberof utils/source - * @static + * Provides a middle-truncated filename displayed in Tab titles */ -export function getTruncatedFileName(source, querystring = "", length = 30) { - return truncateMiddleText(`${getFilename(source)}${querystring}`, length); +export function getTruncatedFileName(source) { + return truncateMiddleText(source.longName, 30); } /* Gets path for files with same filename for editor tabs, breakpoints, etc. @@ -252,15 +228,13 @@ export function getTruncatedFileName(source, querystring = "", length = 30) { export function getDisplayPath(mySource, sources) { const rawSourceURL = getRawSourceURL(mySource.url); - const filename = getFilename(mySource, rawSourceURL); + const filename = mySource.shortName; // Find sources that have the same filename, but different paths // as the original source const similarSources = sources.filter(source => { const rawSource = getRawSourceURL(source.url); - return ( - rawSourceURL != rawSource && filename == getFilename(source, rawSource) - ); + return rawSourceURL != rawSource && filename == source.shortName; }); if (!similarSources.length) { @@ -314,16 +288,6 @@ export function getFileURL(source, truncate = true) { return resolveFileURL(url, getUnicodeUrl, truncate); } -export function getSourcePath(url) { - if (!url) { - return ""; - } - - const { path, href } = parseURL(url); - // for URLs like "about:home" the path is null so we pass the full href - return path || href; -} - /** * Returns amount of lines in the source. If source is a WebAssembly binary, * the function returns amount of bytes. @@ -345,10 +309,6 @@ export function getSourceLineCount(content) { return count + 1; } -export function isInlineScript(source) { - return source.introductionType === "scriptElement"; -} - function getNthLine(str, lineNum) { let startIndex = -1; @@ -454,51 +414,6 @@ export function getRelativeUrl(source, root) { return url.slice(url.indexOf(root) + root.length + 1); } -/** - * source.url doesn't include thread actor ID, so before calling underRoot(), the thread actor ID - * must be removed from the root, which this function handles. - * @param {string} root The root url to be cleaned - * @param {Set<Thread>} threads The list of threads - * @returns {string} The root url with thread actor IDs removed - */ -export function removeThreadActorId(root, threads) { - threads.forEach(thread => { - if (root.includes(thread.actor)) { - root = root.slice(thread.actor.length + 1); - } - }); - return root; -} - -/** - * Checks if the source is descendant of the root identified by the - * root url specified. The root might likely be projectDirectoryRoot which - * is a defined by a pref that allows users restrict the source tree to - * a subset of sources. - * - * @param {Object} source - * The source object - * @param {String} rootUrlWithoutThreadActor - * The url for the root node, without the thread actor ID. This can be obtained - * by calling removeThreadActorId() - */ -export function isDescendantOfRoot(source, rootUrlWithoutThreadActor) { - if (source.url && source.url.includes("chrome://")) { - const { group, path } = source.displayURL; - return (group + path).includes(rootUrlWithoutThreadActor); - } - - return !!source.url && source.url.includes(rootUrlWithoutThreadActor); -} - -export function getSourceQueryString(source) { - if (!source) { - return ""; - } - - return parseURL(getRawSourceURL(source.url)).search; -} - export function isUrlExtension(url) { return url.includes("moz-extension:") || url.includes("chrome-extension"); } diff --git a/devtools/client/debugger/src/utils/sources-tree/getURL.js b/devtools/client/debugger/src/utils/sources-tree/getURL.js index c01fce5f23..5c9e7db6e5 100644 --- a/devtools/client/debugger/src/utils/sources-tree/getURL.js +++ b/devtools/client/debugger/src/utils/sources-tree/getURL.js @@ -56,6 +56,9 @@ const def = { * This is augmented with custom properties like: * - `group`, which is mostly the host of the source's URL. * This is used to sort sources in the Source tree. + * - `filename` which may not be quite matching the URL. + * When files are loaded from "/", they won't have a real name, + * but instead this will report "(index)". * - `fileExtension`, lowercased file extension of the source * (if any extension is available) * - `path` and `pathname` have some special behavior. @@ -66,8 +69,14 @@ export function getDisplayURL(url, extensionName = null) { return def; } - const { pathname, search, protocol, host } = parse(url); - const filename = getUnicodeUrlPath(getFilenameFromPath(pathname)); + let { pathname, search, protocol, host } = parse(url); + + // Decode encoded characters early so that all other code rely on decoded strings + pathname = getUnicodeUrlPath(pathname); + search = getUnicodeUrlPath(search); + host = getUnicodeHostname(host); + + const filename = getFilenameFromPath(pathname); switch (protocol) { case "javascript:": @@ -121,7 +130,7 @@ export function getDisplayURL(url, extensionName = null) { search, filename, fileExtension: getFileExtension("/"), - group: url, + group: getUnicodeUrlPath(url), }; case "data:": @@ -165,7 +174,7 @@ export function getDisplayURL(url, extensionName = null) { search, filename, fileExtension: getFileExtension(pathname), - group: getUnicodeHostname(host), + group: host, }; } diff --git a/devtools/client/debugger/src/utils/sources-tree/utils.js b/devtools/client/debugger/src/utils/sources-tree/utils.js index 0a2f41752b..45eba2d817 100644 --- a/devtools/client/debugger/src/utils/sources-tree/utils.js +++ b/devtools/client/debugger/src/utils/sources-tree/utils.js @@ -28,17 +28,3 @@ export function getRelativePath(url) { } return ""; } - -/** - * - * @param {String} name: Name (e.g. computed in SourcesTreeItem renderItemName), - * which might include URI search. - * @returns {String} result of `decodedURI(name)`, or name if it `name` is malformed. - */ -export function safeDecodeItemName(name) { - try { - return decodeURI(name); - } catch (e) { - return name; - } -} diff --git a/devtools/client/debugger/src/utils/task.js b/devtools/client/debugger/src/utils/task.js deleted file mode 100644 index 25663fdd16..0000000000 --- a/devtools/client/debugger/src/utils/task.js +++ /dev/null @@ -1,44 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ - -/** - * This object provides the public module functions. - */ -export const Task = { - // XXX: Not sure if this works in all cases... - async: function (task) { - return function () { - return Task.spawn(task, this, arguments); - }; - }, - - /** - * Creates and starts a new task. - * @param task A generator function - * @return A promise, resolved when the task terminates - */ - spawn: function (task, scope, args) { - return new Promise(function (resolve, reject) { - const iterator = task.apply(scope, args); - - const callNext = lastValue => { - const iteration = iterator.next(lastValue); - Promise.resolve(iteration.value) - .then(value => { - if (iteration.done) { - resolve(value); - } else { - callNext(value); - } - }) - .catch(error => { - reject(error); - iterator.throw(error); - }); - }; - - callNext(undefined); - }); - }, -}; diff --git a/devtools/client/debugger/src/utils/test-head.js b/devtools/client/debugger/src/utils/test-head.js index c21f408b61..1021849d02 100644 --- a/devtools/client/debugger/src/utils/test-head.js +++ b/devtools/client/debugger/src/utils/test-head.js @@ -101,10 +101,11 @@ function makeFrame({ id, sourceId, thread }, opts = {}) { }; } -function createSourceObject(filename, props = {}) { +function createSourceObject(filename) { return { id: filename, url: makeSourceURL(filename), + shortName: filename, isPrettyPrinted: false, isExtension: false, isOriginal: filename.includes("originalSource"), diff --git a/devtools/client/debugger/src/utils/test-mockup.js b/devtools/client/debugger/src/utils/test-mockup.js index 521872b7cb..8224050f6a 100644 --- a/devtools/client/debugger/src/utils/test-mockup.js +++ b/devtools/client/debugger/src/utils/test-mockup.js @@ -20,6 +20,8 @@ function makeMockSource(url = "url", id = "source", thread = "FakeThread") { return { id, url, + shortName: getDisplayURL(url).filename, + longName: getDisplayURL(url).filename + getDisplayURL(url).search, displayURL: getDisplayURL(url), thread, isPrettyPrinted: false, diff --git a/devtools/client/debugger/src/utils/tests/source.spec.js b/devtools/client/debugger/src/utils/tests/source.spec.js index 484c8ce570..6542ee2c0d 100644 --- a/devtools/client/debugger/src/utils/tests/source.spec.js +++ b/devtools/client/debugger/src/utils/tests/source.spec.js @@ -3,14 +3,11 @@ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ import { - getFilename, getTruncatedFileName, getFileURL, getDisplayPath, getSourceLineCount, isJavaScript, - isDescendantOfRoot, - removeThreadActorId, isUrlExtension, getLineText, } from "../source.js"; @@ -20,7 +17,6 @@ import { makeMockSourceWithContent, makeMockSourceAndContent, makeMockWasmSourceWithContent, - makeMockThread, makeFullfilledMockSourceContent, } from "../test-mockup"; import { isFulfilled } from "../async-value.js"; @@ -29,66 +25,20 @@ describe("sources", () => { const unicode = "\u6e2c"; const encodedUnicode = encodeURIComponent(unicode); - describe("getFilename", () => { - it("should give us a default of (index)", () => { - expect( - getFilename(makeMockSource("http://localhost.com:7999/increment/")) - ).toBe("(index)"); - }); - it("should give us the filename", () => { - expect( - getFilename( - makeMockSource("http://localhost.com:7999/increment/hello.html") - ) - ).toBe("hello.html"); - }); - it("should give us the readable Unicode filename if encoded", () => { - expect( - getFilename( - makeMockSource( - `http://localhost.com:7999/increment/${encodedUnicode}.html` - ) - ) - ).toBe(`${unicode}.html`); - }); - it("should give us the filename excluding the query strings", () => { - expect( - getFilename( - makeMockSource( - "http://localhost.com:7999/increment/hello.html?query_strings" - ) - ) - ).toBe("hello.html"); - }); - it("should give us the proper filename for pretty files", () => { - expect( - getFilename( - makeMockSource( - "http://localhost.com:7999/increment/hello.html:formatted" - ) - ) - ).toBe("hello.html"); - }); - }); - describe("getTruncatedFileName", () => { it("should truncate the file name when it is more than 30 chars", () => { expect( getTruncatedFileName( makeMockSource( "really-really-really-really-really-really-long-name.html" - ), - "", - 30 + ) ) ).toBe("really-really…long-name.html"); }); it("should first decode the filename and then truncate it", () => { expect( getTruncatedFileName( - makeMockSource(`${encodedUnicode.repeat(30)}.html`), - "", - 30 + makeMockSource(`${encodedUnicode.repeat(30)}.html`) ) ).toBe("測測測測測測測測測測測測測…測測測測測測測測測.html"); }); @@ -274,42 +224,6 @@ describe("sources", () => { }); }); - describe("isDescendantOfRoot", () => { - const threads = [ - makeMockThread({ actor: "server0.conn1.child1/thread19" }), - ]; - - it("should detect normal source urls", () => { - const source = makeMockSource( - "resource://activity-stream/vendor/react.js" - ); - const rootWithoutThreadActor = removeThreadActorId( - "resource://activity-stream", - threads - ); - expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true); - }); - - it("should detect source urls under chrome:// as root", () => { - const source = makeMockSource( - "chrome://browser/content/contentSearchUI.js" - ); - const rootWithoutThreadActor = removeThreadActorId("chrome://", threads); - expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true); - }); - - it("should detect source urls if root is a thread actor Id", () => { - const source = makeMockSource( - "resource://activity-stream/vendor/react-dom.js" - ); - const rootWithoutThreadActor = removeThreadActorId( - "server0.conn1.child1/thread19", - threads - ); - expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true); - }); - }); - describe("isUrlExtension", () => { it("should detect mozilla extension", () => { expect(isUrlExtension("moz-extension://id/js/content.js")).toBe(true); diff --git a/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js b/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js index ec29d6cf21..97018a129b 100644 --- a/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js +++ b/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js @@ -11,7 +11,7 @@ import { isTopLevel } from "./utils/helpers"; function hasTopLevelAwait(ast) { const hasAwait = hasNode( ast, - (node, ancestors, b) => t.isAwaitExpression(node) && isTopLevel(ancestors) + (node, ancestors) => t.isAwaitExpression(node) && isTopLevel(ancestors) ); return hasAwait; diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap deleted file mode 100644 index a341538a5d..0000000000 --- a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`has syntax error should return the error object for the invalid expression 1`] = `"SyntaxError : Missing semicolon. (1:3)"`; diff --git a/devtools/client/debugger/src/workers/parser/tests/framework.spec.js b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js index d41f45b71c..fe25fbe283 100644 --- a/devtools/client/debugger/src/workers/parser/tests/framework.spec.js +++ b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js @@ -8,7 +8,7 @@ import cases from "jest-in-case"; cases( "Parser.getFramework", - ({ name, file, value }) => { + () => { const source = populateOriginalSource("frameworks/plainJavascript"); const symbols = getSymbols(source.id); expect(symbols.framework).toBeNull(); diff --git a/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js index 723eef1fd9..0c5306d423 100644 --- a/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js +++ b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js @@ -9,7 +9,7 @@ import cases from "jest-in-case"; cases( "Parser.getSymbols", - ({ name, file, original, type }) => { + ({ file, original, type }) => { const source = original ? populateOriginalSource(file, type) : populateSource(file, type); diff --git a/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js index 8c23ab5873..3731ac1dd5 100644 --- a/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js +++ b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js @@ -12,7 +12,7 @@ function format(code) { return prettier.format(code, { semi: false, parser: "babel" }); } -function excludedTest({ name, expression, bindings = [] }) { +function excludedTest({ expression, bindings = [] }) { const safeExpression = mapExpressionBindings( expression, parseConsoleScript(expression), @@ -21,7 +21,7 @@ function excludedTest({ name, expression, bindings = [] }) { expect(format(safeExpression)).toEqual(format(expression)); } -function includedTest({ name, expression, newExpression, bindings }) { +function includedTest({ expression, newExpression, bindings }) { const safeExpression = mapExpressionBindings( expression, parseConsoleScript(expression), diff --git a/devtools/client/debugger/test/mochitest/browser_aj.toml b/devtools/client/debugger/test/mochitest/browser_aj.toml index cbedf75eae..fe154b8149 100644 --- a/devtools/client/debugger/test/mochitest/browser_aj.toml +++ b/devtools/client/debugger/test/mochitest/browser_aj.toml @@ -198,6 +198,9 @@ fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and ["browser_dbg-features-asm.js"] ["browser_dbg-features-breakable-lines.js"] +skip-if = [ + "apple_catalina && !debug", # Bug 1767701 +] ["browser_dbg-features-breakable-positions.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js index 8080d3c145..42eec2716c 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js @@ -200,7 +200,7 @@ add_task(async function testHideAndShowBlackBoxedFiles() { function waitForBlackboxCount(dbg, count) { return waitForState( dbg, - state => Object.keys(dbg.selectors.getBlackBoxRanges()).length === count + () => Object.keys(dbg.selectors.getBlackBoxRanges()).length === count ); } diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js index c766a0e549..f995df2b6b 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js @@ -15,9 +15,9 @@ add_task(async function () { info("Adding a breakpoint should remove the skipped pausing state"); await skipPausing(dbg); - await waitForState(dbg, state => dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => dbg.selectors.getSkipPausing()); await addBreakpoint(dbg, "simple3.js", 2); - await waitForState(dbg, state => !dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => !dbg.selectors.getSkipPausing()); invokeInTab("simple"); await waitForPaused(dbg); ok(true, "The breakpoint has been hit after a breakpoint was created"); @@ -28,13 +28,13 @@ add_task(async function () { // during a disable await skipPausing(dbg); await disableBreakpoint(dbg, 0); - await waitForState(dbg, state => !dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => !dbg.selectors.getSkipPausing()); // Then re-enable the breakpoint to ensure skip pausing gets turned off // during an enable await skipPausing(dbg); - await waitForState(dbg, state => dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => dbg.selectors.getSkipPausing()); toggleBreakpoint(dbg, 0); - await waitForState(dbg, state => !dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => !dbg.selectors.getSkipPausing()); await waitForDispatch(dbg.store, "SET_BREAKPOINT"); invokeInTab("simple"); await waitForPaused(dbg); @@ -45,7 +45,7 @@ add_task(async function () { await addBreakpoint(dbg, "simple3.js", 3); await skipPausing(dbg); await disableBreakpoint(dbg, 0); - await waitForState(dbg, state => !dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => !dbg.selectors.getSkipPausing()); invokeInTab("simple"); await waitForPaused(dbg); ok(true, "The breakpoint has been hit after skip pausing was disabled again"); @@ -57,7 +57,7 @@ add_task(async function () { const source = findSource(dbg, "simple3.js"); removeBreakpoint(dbg, source.id, 3); const wait = waitForDispatch(dbg.store, "TOGGLE_SKIP_PAUSING"); - await waitForState(dbg, state => !dbg.selectors.getSkipPausing()); + await waitForState(dbg, () => !dbg.selectors.getSkipPausing()); await wait; invokeInTab("simple"); await waitForPaused(dbg); @@ -70,7 +70,7 @@ add_task(async function () { function skipPausing(dbg) { clickElementWithSelector(dbg, ".command-bar-skip-pausing"); - return waitForState(dbg, state => dbg.selectors.getSkipPausing()); + return waitForState(dbg, () => dbg.selectors.getSkipPausing()); } function toggleBreakpoint(dbg, index) { diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js index 900c55e7fa..4150f552a1 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js @@ -16,7 +16,7 @@ add_task(async function () { // select "Remove breakpoint" selectContextMenuItem(dbg, selectors.breakpointContextMenu.remove); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() === 0); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() === 0); ok(true, "successfully removed the breakpoint"); }); @@ -34,7 +34,7 @@ add_task(async function () { // select "Disable Others" let dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT", 2); selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableOthers); - await waitForState(dbg, state => + await waitForState(dbg, () => dbg.selectors .getBreakpointsList() .every(bp => (bp.location.line !== 4) === bp.disabled) @@ -46,7 +46,7 @@ add_task(async function () { // select "Disable All" dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT"); selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableAll); - await waitForState(dbg, state => + await waitForState(dbg, () => dbg.selectors.getBreakpointsList().every(bp => bp.disabled) ); await dispatched; @@ -56,7 +56,7 @@ add_task(async function () { // select "Enable Others" dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT", 2); selectContextMenuItem(dbg, selectors.breakpointContextMenu.enableOthers); - await waitForState(dbg, state => + await waitForState(dbg, () => dbg.selectors .getBreakpointsList() .every(bp => (bp.location.line === 4) === bp.disabled) @@ -70,7 +70,7 @@ add_task(async function () { selectContextMenuItem(dbg, selectors.breakpointContextMenu.removeOthers); await waitForState( dbg, - state => + () => dbg.selectors.getBreakpointsList().length === 1 && dbg.selectors.getBreakpointsList()[0].location.line === 4 ); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js index 6234e22dcb..b48c2d162a 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js @@ -36,7 +36,10 @@ add_task(async function () { await setConditionalBreakpoint(dbg, 1, "foo2"); info("10. Test removing the breakpoints by clicking in the gutter"); - await removeAllBreakpoints(dbg, 32, 0); + await clickGutter(dbg, 32); + await waitForBreakpointCount(dbg, 0); + + ok(!findAllElements(dbg, "columnBreakpoints").length); }); async function enableFirstBreakpoint(dbg) { @@ -106,7 +109,7 @@ async function disableBreakpoint(dbg, index) { await waitForContextMenu(dbg); selectContextMenuItem(dbg, selectors.disableItem); - await waitForState(dbg, state => { + await waitForState(dbg, () => { const bp = dbg.selectors.getBreakpointsList()[index]; return bp.disabled; }); @@ -122,10 +125,3 @@ async function removeFirstBreakpoint(dbg) { bpMarkers = await waitForAllElements(dbg, "columnBreakpoints"); assertClass(bpMarkers[0], "active", false); } - -async function removeAllBreakpoints(dbg, line, count) { - await clickGutter(dbg, 32); - await waitForBreakpointCount(dbg, 0); - - ok(!findAllElements(dbg, "columnBreakpoints").length); -} diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js index bb1fa3d64b..ef12144cdb 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js @@ -20,7 +20,7 @@ add_task(async function () { await reload(dbg, "doc-duplicate-functions.html"); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 1); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() == 1); const firstBreakpoint = dbg.selectors.getBreakpointsList()[0]; is(firstBreakpoint.location.line, 21, "Breakpoint is on line 21"); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js index a3b7753738..eba02919d3 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js @@ -23,7 +23,7 @@ const POPUP_DEBUGGER_STATEMENT_URL = `https://example.com/document-builder.sjs?h `)}`; function isPopupPaused(popupBrowsingContext) { - return SpecialPowers.spawn(popupBrowsingContext, [], function (url) { + return SpecialPowers.spawn(popupBrowsingContext, [], function () { return content.wrappedJSObject.paused; }); } diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js index ca953445ba..6e1f4582fd 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js @@ -38,7 +38,7 @@ add_task(async function () { await assertPausedAtSourceAndLine(dbg, source.id, 61); info("The breakpoint for long.js does not exist yet"); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 2); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() == 2); // The breakpoints are available once their corresponding source // has been processed. Let's assert that all the breakpoints for @@ -54,7 +54,7 @@ add_task(async function () { await assertPausedAtSourceAndLine(dbg, source2.id, 1); info("All 3 breakpoints from simple1.js and long.js still exist"); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 3); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() == 3); await assertBreakpoint(dbg, 1); @@ -89,7 +89,7 @@ add_task(async function () { await assertPausedAtSourceAndLine(dbg, source.id, 22); info("Only the breakpoint for the first inline script should exist"); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 1); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() == 1); await assertBreakpoint(dbg, 22); @@ -102,7 +102,7 @@ add_task(async function () { await waitForPaused(dbg); info("All 2 breakpoints from both inline scripts still exist"); - await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 2); + await waitForState(dbg, () => dbg.selectors.getBreakpointCount() == 2); await assertPausedAtSourceAndLine(dbg, source.id, 27); await assertBreakpoint(dbg, 27); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js index c0c6c03a43..85467d2347 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js @@ -32,6 +32,7 @@ add_task(async function () { // Note that CodeMirror is 0-based while the footer displays 1-based getCM(dbg).setCursor({ line: 1, ch: 0 }); + await waitForCursorPosition(dbg, 2); assertCursorPosition( dbg, 2, @@ -44,6 +45,7 @@ add_task(async function () { ); getCM(dbg).setCursor({ line: 2, ch: 0 }); + await waitForCursorPosition(dbg, 3); assertCursorPosition( dbg, 3, diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js index fa321f5f43..539b273697 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js @@ -56,6 +56,8 @@ add_task(async function testSourceTreeNamesForWebExtensions() { }); await ToolboxTask.spawn(null, async () => { + // Disable autofixing to `Assert` methods which are not available here. + /* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ try { /* global gToolbox */ // Wait for the debugger to finish loading. diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js index f4fdd30898..4590f0c2b3 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js @@ -124,7 +124,7 @@ add_task(async function testSimpleSourcesWithManualClickExpand() { info("Test the download file context menu"); // Before trigerring the menu, mock the file picker const MockFilePicker = SpecialPowers.MockFilePicker; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); const nsiFile = new FileUtils.File( PathUtils.join(PathUtils.tempDir, `export_source_content_${Date.now()}.log`) ); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js index 4b75be5cd7..12102e602d 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js @@ -29,7 +29,7 @@ add_task(async function testTracingFunctionReturn() { const topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -42,7 +42,7 @@ add_task(async function testTracingFunctionReturn() { await clickElement(dbg, "trace"); info("Wait for tracing to be disabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -55,7 +55,7 @@ add_task(async function testTracingFunctionReturn() { await clickElement(dbg, "trace"); info("Wait for tracing to be re-enabled with logging of returned values"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -81,7 +81,7 @@ add_task(async function testTracingFunctionReturn() { info("Stop tracing"); await clickElement(dbg, "trace"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js index 37e275f273..8d3b2ae6f2 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js @@ -64,7 +64,7 @@ add_task(async function testTracingOnNextInteraction() { let topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -96,7 +96,7 @@ add_task(async function testTracingOnNextInteraction() { topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be disabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -127,7 +127,7 @@ add_task(async function testInteractionBetweenDebuggerAndConsole() { const topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -159,7 +159,7 @@ add_task(async function testInteractionBetweenDebuggerAndConsole() { is(msg.textContent.trim(), "Started tracing to Web Console"); info("Wait for tracing to be also enabled in the debugger"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); ok(true, "Debugger also reports the tracing in progress"); @@ -172,7 +172,7 @@ add_task(async function testInteractionBetweenDebuggerAndConsole() { await clickElement(dbg, "trace"); info("Wait for tracing to be disabled per debugger button"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js index 6ee442cbd0..b4259d5eb6 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js @@ -80,7 +80,7 @@ add_task(async function testTracingOnNextLoad() { let topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled after page reload"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); ok( @@ -105,7 +105,7 @@ add_task(async function testTracingOnNextLoad() { topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be disabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); await waitFor(() => { diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js index 92ff3c30a4..99ce73ac9d 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js @@ -28,7 +28,7 @@ add_task(async function testTracingValues() { const topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js index cabcb1deb8..df91b71e0f 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js @@ -41,7 +41,7 @@ add_task(async function testTracingWorker() { info("Enable tracing on all threads"); await clickElement(dbg, "trace"); info("Wait for tracing to be enabled for the worker"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing( workerTarget.threadFront.actorID ); @@ -56,7 +56,7 @@ add_task(async function testTracingWorker() { content.worker.postMessage("foo"); }); - await hasConsoleMessage(dbg, "DOM(message)"); + await hasConsoleMessage(dbg, "DOM | message"); await hasConsoleMessage(dbg, "λ onmessage"); await dbg.toolbox.closeToolbox(); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js index 9292e1ba17..bfa2447474 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js @@ -18,7 +18,7 @@ add_task(async function () { const topLevelThreadActorID = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -52,7 +52,7 @@ add_task(async function () { gBrowser.selectedBrowser ); - await hasConsoleMessage(dbg, "DOM(click)"); + await hasConsoleMessage(dbg, "DOM | click"); await hasConsoleMessage(dbg, "λ simple"); // Test Blackboxing @@ -90,7 +90,7 @@ add_task(async function () { info("Disable the tracing"); await clickElement(dbg, "trace"); info("Wait for tracing to be disabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); await hasConsoleMessage(dbg, "Stopped tracing"); @@ -116,7 +116,7 @@ add_task(async function () { const newTopLevelThread = dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID; info("Wait for tracing to be re-enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(newTopLevelThread); }); @@ -216,7 +216,7 @@ add_task(async function testPageKeyShortcut() { }); info("Wait for tracing to be enabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); @@ -236,7 +236,7 @@ add_task(async function testPageKeyShortcut() { }); info("Wait for tracing to be disabled"); - await waitForState(dbg, state => { + await waitForState(dbg, () => { return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID); }); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js b/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js index 609879c7b1..0f006c61fe 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js @@ -46,10 +46,7 @@ async function testLayout(dbg, orientation, host) { await switchHost(dbg, host); await resizeToolboxWindow(dbg, host); - return waitForState( - dbg, - state => dbg.selectors.getOrientation() == orientation - ); + return waitForState(dbg, () => dbg.selectors.getOrientation() == orientation); } function getHost(host) { diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-outline.js b/devtools/client/debugger/test/mochitest/browser_dbg-outline.js index 6048a7a92d..bfc1c846d1 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-outline.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-outline.js @@ -6,6 +6,41 @@ "use strict"; +// Test that the outline panel updates correctly when a source is selected +// This scenario covers the case where the outline panel always focused. +add_task(async function () { + const dbg = await initDebugger("doc-scripts.html", "simple1.js"); + openOutlinePanel(dbg, false); + is( + findAllElements(dbg, "outlineItems").length, + 0, + " There are no outline items when no source is selected" + ); + + await selectSource(dbg, "simple1.js", 1); + + info("Wait for all the outline list to load"); + await waitForElementWithSelector(dbg, ".outline-list"); + + assertOutlineItems(dbg, [ + "λmain()", + "λdoEval()", + "λevaledFunc()", + "λdoNamedEval()", + // evaledFunc is set twice + "λevaledFunc()", + "class MyClass", + "λconstructor(a, b)", + "λtest()", + "λ#privateFunc(a, b)", + "class Klass", + "λconstructor()", + "λtest()", + ]); +}); + +// Test that the outline panel updates correctly when a source is selected +// This scenario covers the case where the outline panel gets un-selected and selected again add_task(async function () { const dbg = await initDebugger("doc-scripts.html", "simple1.js"); @@ -73,7 +108,7 @@ add_task(async function () { ]); }); -// Test empty panel when source has not function or class symbols +// Test empty panel when source has no function or class symbols add_task(async function () { const dbg = await initDebugger("doc-on-load.html", "top-level.js"); await selectSource(dbg, "top-level.js", 1); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js b/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js index 48f5893799..0e2dc54609 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js @@ -70,7 +70,7 @@ add_task(async function () { info("Select test.js tree node, and add override"); const MockFilePicker = SpecialPowers.MockFilePicker; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); const nsiFile = new FileUtils.File( PathUtils.join(PathUtils.tempDir, "test.js") ); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js index 27ae30983f..ee27554280 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js @@ -13,7 +13,7 @@ add_task(async function () { } = dbg; clickElement(dbg, "pause"); - await waitForState(dbg, state => getIsWaitingOnBreak(getCurrentThread())); + await waitForState(dbg, () => getIsWaitingOnBreak(getCurrentThread())); invokeInTab("simple"); await waitForPaused(dbg, "simple3"); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js index 456e4e10f5..3590395701 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js @@ -14,7 +14,7 @@ async function testCase(dbg, { name, steps }) { } = dbg; const locations = []; - const recordFrame = state => { + const recordFrame = () => { const { line, column } = getTopFrame(getCurrentThread()).location; locations.push([line, column]); info(`Break on ${line}:${column}`); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js index 1d442c5ca5..93b537bba5 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js @@ -71,3 +71,39 @@ add_task(async function () { }); ok(true, "The overlay is hidden after clicking on the resume button"); }); + +add_task(async function testOverlayDisabled() { + await pushPref("devtools.debugger.features.overlay", false); + + const dbg = await initDebugger("doc-scripts.html"); + const highlighterTestFront = await getHighlighterTestFront(dbg.toolbox); + + info("Create an eval script that pauses itself."); + invokeInTab("doEval"); + + await waitForPaused(dbg); + + // Let a chance to regress and still show the overlay + await wait(500); + + const isPausedOverlayVisible = + await highlighterTestFront.isPausedDebuggerOverlayVisible(); + ok( + !isPausedOverlayVisible, + "The paused overlay wasn't shown when the related feature preference is false" + ); + + const onPreferenceApplied = dbg.toolbox.once("new-configuration-applied"); + await pushPref("devtools.debugger.features.overlay", true); + await onPreferenceApplied; + + info("Click debugger UI step-in button"); + const stepButton = await waitFor(() => findElement(dbg, "stepIn")); + stepButton.click(); + + await waitFor(() => highlighterTestFront.isPausedDebuggerOverlayVisible()); + ok( + true, + "Stepping after having toggled the feature preference back to true allow the overlay to be shown again" + ); +}); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js index a5b9260af2..43bb6279fd 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js @@ -21,7 +21,7 @@ add_task(async function () { await waitForSelectedSource(dbg, "math.min.js:formatted"); await waitForState( dbg, - state => dbg.selectors.getSelectedFrame(thread).location.line == 18 + () => dbg.selectors.getSelectedFrame(thread).location.line == 18 ); assertPausedAtSourceAndLine( dbg, diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js index 4075b6525a..b58dd19686 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js @@ -60,7 +60,7 @@ add_task(async function () { function waitForSelectedFrame(dbg, displayName) { const { getInScopeLines, getVisibleSelectedFrame } = dbg.selectors; - return waitForState(dbg, state => { + return waitForState(dbg, () => { const frame = getVisibleSelectedFrame(); return frame?.displayName == displayName && getInScopeLines(frame.location); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js b/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js index 2882bba1b6..f2f304805e 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js @@ -15,7 +15,7 @@ add_task(async function () { invokeInTab("clickButton"); await waitForPaused(dbg); - await waitForState(dbg, state => + await waitForState(dbg, () => dbg.selectors.getSelectedScopeMappings(dbg.selectors.getCurrentThread()) ); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js index 75daa9a469..57238dc36c 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js @@ -125,7 +125,7 @@ add_task(async function () { is(dbg.win.document.activeElement.tagName, "INPUT", "Search field focused"); }); -async function navigateWithKey(dbg, key, expectedLine, assertionMessage) { +async function navigateWithKey(dbg, key, expectedLine) { pressKey(dbg, key); await waitForCursorPosition(dbg, expectedLine); } diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js b/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js index 83b35e1009..39008a7478 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js @@ -7,6 +7,11 @@ // Tests the slow script warning add_task(async function openDebuggerFirst() { + // This test fails with pending vsync at end of test without fission, not EFT + if (!isFissionEnabled() && !isEveryFrameTargetEnabled()) { + return; + } + // In mochitest, the timeout is disable, so set it to a short, but non zero duration await pushPref("dom.max_script_run_time", 1); // Prevents having to click on the page to have the dialog to appear @@ -41,6 +46,11 @@ add_task(async function openDebuggerFirst() { }); add_task(async function openDebuggerFromDialog() { + // This test fails with pending vsync at end of test without fission, not EFT + if (!isFissionEnabled() && !isEveryFrameTargetEnabled()) { + return; + } + const tab = await addTab(EXAMPLE_URL + "doc-slow-script.html"); const alert = BrowserTestUtils.waitForGlobalNotificationBar( @@ -57,7 +67,7 @@ add_task(async function openDebuggerFromDialog() { // And mochitest may consider this as an error. So ignore any rejection. SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () { content.wrappedJSObject.infiniteLoop(); - }).catch(e => {}); + }).catch(() => {}); info("Wait for the slow script warning"); const notification = await alert; diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js index e9e3a3c7f2..79a8245613 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js @@ -53,6 +53,16 @@ add_task(async function () { "There is a warning about the missing source map file" ); + let footerButton = findElement(dbg, "sourceMapFooterButton"); + ok( + footerButton.classList.contains("not-mapped"), + "The source map error causes the file to be reported as not mapped" + ); + ok( + footerButton.classList.contains("error"), + "The source map error is displayed in the source map icon" + ); + // Test a Source Map with missing original text content await selectSource(dbg, "map-with-failed-original-request.js"); ok( @@ -87,5 +97,24 @@ add_task(async function () { `Error while fetching an original source: request failed with status 404\nSource URL: ${EXAMPLE_URL}map-with-failed-original-request.original.js` ); + footerButton = findElement(dbg, "sourceMapFooterButton"); + is( + footerButton.textContent, + "original file", + "Even if the original can't be loaded, it is reported as original in the footer" + ); + ok( + !footerButton.classList.contains("loading"), + "The source map isn't loading because of the missing text content" + ); + ok( + !footerButton.classList.contains("error"), + "The source map isn't reported with an error because of the missing text content" + ); + ok( + footerButton.classList.contains("original"), + "The source map icon is set to original" + ); + await resume(dbg); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js index 93440dc9e1..4348e2103d 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js @@ -17,7 +17,34 @@ add_task(async function () { info("Pretty print the bundle"); await selectSource(dbg, bundleSrc); + + const footerButton = findElement(dbg, "sourceMapFooterButton"); + is( + footerButton.textContent, + "Source Maps disabled", + "The source map button reports the disabling" + ); + ok( + footerButton.classList.contains("disabled"), + "The source map button is disabled" + ); + clickElement(dbg, "prettyPrintButton"); await waitForSelectedSource(dbg, "bundle.js:formatted"); - ok(true, "everything finished"); + ok(true, "Pretty printed source shown"); + + const toggled = waitForDispatch(dbg.store, "TOGGLE_SOURCE_MAPS_ENABLED"); + await clickOnSourceMapMenuItem(dbg, ".debugger-source-map-enabled"); + await toggled; + ok(true, "Toggled the Source map setting"); + + is( + footerButton.textContent, + "original file", + "The source map button now reports the pretty printed file as original file" + ); + ok( + !footerButton.classList.contains("disabled"), + "The source map button is no longer disabled" + ); }); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js index c10273baaf..5814e423f2 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js @@ -54,8 +54,5 @@ add_task(async function () { }); async function waitForBreakpointCount(dbg, count) { - return waitForState( - dbg, - state => dbg.selectors.getBreakpointCount() === count - ); + return waitForState(dbg, () => dbg.selectors.getBreakpointCount() === count); } diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js index 7ed70b3310..d7c71aade8 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js @@ -98,6 +98,25 @@ add_task(async function () { "Pending selected location is the expected one" ); + const footerButton = findElement(dbg, "sourceMapFooterButton"); + is( + footerButton.textContent, + "original file", + "The source map button's label mention an original file" + ); + ok( + footerButton.classList.contains("original"), + "The source map icon is original" + ); + ok( + !footerButton.classList.contains("not-mapped"), + "The source map button isn't gray out" + ); + ok( + !footerButton.classList.contains("loading"), + "The source map button isn't reporting in-process loading" + ); + info("Click on jump to generated source link from editor's footer"); let mappedSourceLink = findElement(dbg, "mappedSourceLink"); is( @@ -117,6 +136,23 @@ add_task(async function () { "From entry.js", "The link to mapped source mentions the original source" ); + is( + footerButton.textContent, + "bundle file", + "When moved to the bundle, the source map button's label mention a bundle file" + ); + ok( + !footerButton.classList.contains("original"), + "The source map icon isn't original" + ); + ok( + !footerButton.classList.contains("not-mapped"), + "The source map button isn't gray out" + ); + ok( + !footerButton.classList.contains("loading"), + "The source map button isn't reporting in-process loading" + ); info("Move the cursor within the bundle to another original source"); getCM(dbg).setCursor({ line: 70, ch: 0 }); @@ -126,6 +162,18 @@ add_task(async function () { "From times2.js", "The link to mapped source updates to the newly selected original source within the bundle" ); + + info("Move to the new original file via the source map button/menu"); + await clickOnSourceMapMenuItem(dbg, ".debugger-jump-mapped-source"); + await waitForSelectedSource(dbg, "times2.js"); + + info("Open the related source map file and wait for a new tab to be opened"); + const onTabLoaded = BrowserTestUtils.waitForNewTab( + gBrowser, + `view-source:${EXAMPLE_URL}sourcemaps/bundle.js.map` + ); + await clickOnSourceMapMenuItem(dbg, ".debugger-source-map-link"); + await onTabLoaded; }); function assertBreakpointExists(dbg, source, line) { @@ -143,5 +191,5 @@ async function waitForBreakpointCount(dbg, count) { const { selectors: { getBreakpointCount }, } = dbg; - await waitForState(dbg, state => getBreakpointCount() == count); + await waitForState(dbg, () => getBreakpointCount() == count); } diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js b/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js index e563d52824..07d628c45a 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js @@ -28,7 +28,7 @@ add_task(async function () { ); clickElement(dbg, "pause"); - await waitForState(dbg, state => + await waitForState(dbg, () => dbg.selectors.getIsWaitingOnBreak(dbg.selectors.getCurrentThread()) ); diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js index a38aebe6e0..f2e20f4541 100644 --- a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js +++ b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js @@ -168,7 +168,7 @@ add_task(async function () { await removeTab(gBrowser.selectedTab); }); -async function checkWorkerStatus(dbg, status) { +async function checkWorkerStatus(_dbg, _status) { /* TODO: Re-Add support for showing service worker status (Bug 1641099) await waitUntil(() => { const threads = dbg.selectors.getThreads(); diff --git a/devtools/client/debugger/test/mochitest/browser_kz.toml b/devtools/client/debugger/test/mochitest/browser_kz.toml index 5af2243d7f..6b39a42b94 100644 --- a/devtools/client/debugger/test/mochitest/browser_kz.toml +++ b/devtools/client/debugger/test/mochitest/browser_kz.toml @@ -73,17 +73,14 @@ skip-if = [ ] ["browser_dbg-outline-filter.js"] -fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled ["browser_dbg-outline-focus.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled skip-if = ["verify"] ["browser_dbg-outline-pretty.js"] -fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled ["browser_dbg-outline.js"] -fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled ["browser_dbg-overrides.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled diff --git a/devtools/client/debugger/test/mochitest/shared-head.js b/devtools/client/debugger/test/mochitest/shared-head.js index 2466957044..b2a1c7c3d7 100644 --- a/devtools/client/debugger/test/mochitest/shared-head.js +++ b/devtools/client/debugger/test/mochitest/shared-head.js @@ -2,6 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ +// This file is loaded in a `spawn` context sometimes which doesn't have, +// `Assert`, so we can't use its comparison functions. +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ + /** * Helper methods to drive with the debugger during mochitests. This file can be safely * required from other panel test files. @@ -50,8 +54,8 @@ const { } = require("devtools/client/debugger/src/utils/prefs"); const { - safeDecodeItemName, -} = require("devtools/client/debugger/src/utils/sources-tree/utils"); + getUnicodeUrlPath, +} = require("resource://devtools/client/shared/unicode-url.js"); const { isGeneratedId, @@ -133,7 +137,7 @@ async function waitForSources(dbg, ...sources) { function waitForSource(dbg, url) { return waitForState( dbg, - state => findSource(dbg, url, { silent: true }), + () => findSource(dbg, url, { silent: true }), "source exists" ); } @@ -185,7 +189,7 @@ function assertClass(el, className, exists = true) { } function waitForSelectedLocation(dbg, line, column) { - return waitForState(dbg, state => { + return waitForState(dbg, () => { const location = dbg.selectors.getSelectedLocation(); return ( location && @@ -216,7 +220,7 @@ function waitForSelectedSource(dbg, sourceOrUrl) { return waitForState( dbg, - state => { + () => { const location = dbg.selectors.getSelectedLocation() || {}; const sourceTextContent = getSelectedSourceTextContent(); if (!sourceTextContent) { @@ -504,10 +508,7 @@ async function waitForLoadedScopes(dbg) { } function waitForBreakpointCount(dbg, count) { - return waitForState( - dbg, - state => dbg.selectors.getBreakpointCount() == count - ); + return waitForState(dbg, () => dbg.selectors.getBreakpointCount() == count); } function waitForBreakpoint(dbg, url, line) { @@ -569,7 +570,7 @@ async function waitForPaused( await waitForState( dbg, - state => isPaused(dbg) && !!getSelectedScope(getCurrentThread()), + () => isPaused(dbg) && !!getSelectedScope(getCurrentThread()), "paused" ); @@ -588,7 +589,7 @@ async function waitForPaused( */ function waitForResumed(dbg) { info("Waiting for the debugger to resume"); - return waitForState(dbg, state => !dbg.selectors.getIsCurrentThreadPaused()); + return waitForState(dbg, () => !dbg.selectors.getIsCurrentThreadPaused()); } function waitForInlinePreviews(dbg) { @@ -596,7 +597,7 @@ function waitForInlinePreviews(dbg) { } function waitForCondition(dbg, condition) { - return waitForState(dbg, state => + return waitForState(dbg, () => dbg.selectors .getBreakpointsList() .find(bp => bp.options.condition == condition) @@ -604,7 +605,7 @@ function waitForCondition(dbg, condition) { } function waitForLog(dbg, logValue) { - return waitForState(dbg, state => + return waitForState(dbg, () => dbg.selectors .getBreakpointsList() .find(bp => bp.options.logValue == logValue) @@ -612,10 +613,10 @@ function waitForLog(dbg, logValue) { } async function waitForPausedThread(dbg, thread) { - return waitForState(dbg, state => dbg.selectors.getIsPaused(thread)); + return waitForState(dbg, () => dbg.selectors.getIsPaused(thread)); } -function isSelectedFrameSelected(dbg, state) { +function isSelectedFrameSelected(dbg) { const frame = dbg.selectors.getVisibleSelectedFrame(); // Make sure the source text is completely loaded for the @@ -733,7 +734,7 @@ function findSource( const source = sources.find(s => { // Sources don't have a file name attribute, we need to compute it here: const sourceFileName = s.url - ? safeDecodeItemName(s.url.substring(s.url.lastIndexOf("/") + 1)) + ? getUnicodeUrlPath(s.url.substring(s.url.lastIndexOf("/") + 1)) : ""; // The input argument may either be only the filename, or the complete URL @@ -784,7 +785,7 @@ function sourceExists(dbg, url) { function waitForLoadedSource(dbg, url) { return waitForState( dbg, - state => { + () => { const source = findSource(dbg, url, { silent: true }); return ( source && @@ -1772,6 +1773,7 @@ const selectors = { prettyPrintButton: ".source-footer .prettyPrint", mappedSourceLink: ".source-footer .mapped-source", sourcesFooter: ".sources-panel .source-footer", + sourceMapFooterButton: ".debugger-source-map-button", editorFooter: ".editor-pane .source-footer", sourceNode: i => `.sources-list .tree-node:nth-child(${i}) .node`, sourceNodes: ".sources-list .tree-node", @@ -2202,8 +2204,9 @@ async function clickAtPos(dbg, pos) { bubbles: true, cancelable: true, view: dbg.win, - clientX: left, - clientY: top, + // Shift by one as we might be on the edge of the element and click on previous line/column + clientX: left + 1, + clientY: top + 1, }) ); } @@ -2570,14 +2573,13 @@ async function assertPreviews(dbg, previews) { * @param {Number} column * @param {Object} options * @param {String} options.result - Expected text shown in the preview - * @param {String} options.expression - The expression hovered over * @param {Array} options.fields - The expected stacktrace information */ async function assertInlineExceptionPreview( dbg, line, column, - { expression, result, fields } + { result, fields } ) { info(" # Assert preview on " + line + ":" + column); const { element: popupEl, tokenEl } = await tryHovering( @@ -2628,7 +2630,7 @@ async function assertInlineExceptionPreview( async function waitForBreakableLine(dbg, source, lineNumber) { await waitForState( dbg, - state => { + () => { const currentSource = findSource(dbg, source); const breakableLines = @@ -2944,6 +2946,33 @@ async function toggleDebbuggerSettingsMenuItem(dbg, { className, isChecked }) { await waitFor(() => menuButton.getAttribute("aria-expanded") === "false"); } +/** + * Click on the source map button in the editor's footer + * and wait for its context menu to be rendered before clicking + * on one menuitem of it. + * + * @param {Object} dbg + * @param {String} className + * The class name of the menuitem to click in the context menu. + */ +async function clickOnSourceMapMenuItem(dbg, className) { + const menuButton = findElement(dbg, "sourceMapFooterButton"); + const { parent } = dbg.panel.panelWin; + const { document } = parent; + + menuButton.click(); + // Waits for the debugger settings panel to appear. + await waitFor(() => { + const menuListEl = document.querySelector("#debugger-source-map-list"); + // Lets check the offsetParent property to make sure the menu list is actually visible + // by its parents display property being no longer "none". + return menuListEl && menuListEl.offsetParent !== null; + }); + + const menuItem = document.querySelector(className); + menuItem.click(); +} + async function setLogPoint(dbg, index, value) { rightClickElement(dbg, "gutter", index); await waitForContextMenu(dbg); @@ -2964,10 +2993,7 @@ async function setLogPoint(dbg, index, value) { function openProjectSearch(dbg) { info("Opening the project search panel"); synthesizeKeyShortcut("CmdOrCtrl+Shift+F"); - return waitForState( - dbg, - state => dbg.selectors.getActiveSearch() === "project" - ); + return waitForState(dbg, () => dbg.selectors.getActiveSearch() === "project"); } /** @@ -3076,6 +3102,7 @@ async function selectBlackBoxContextMenuItem(dbg, itemName) { } function openOutlinePanel(dbg, waitForOutlineList = true) { + info("Select the outline panel"); const outlineTab = findElementWithSelector(dbg, ".outline-tab a"); EventUtils.synthesizeMouseAtCenter(outlineTab, {}, outlineTab.ownerGlobal); @@ -3105,7 +3132,7 @@ function assertOutlineItems(dbg, expectedItems) { async function checkAdditionalThreadCount(dbg, count) { await waitForState( dbg, - state => { + () => { return dbg.selectors.getThreads().length == count; }, "Have the expected number of additional threads" diff --git a/devtools/client/definitions.js b/devtools/client/definitions.js index 70a7906160..e12c1c8dcc 100644 --- a/devtools/client/definitions.js +++ b/devtools/client/definitions.js @@ -161,7 +161,11 @@ Tools.inspector = { // that trigger the element picker. preventRaisingOnKey: true, onkey(panel, toolbox) { - toolbox.nodePicker.togglePicker(); + if ( + Services.prefs.getBoolPref("devtools.command-button-pick.enabled", false) + ) { + toolbox.nodePicker.togglePicker(); + } }, isToolSupported(toolbox) { diff --git a/devtools/client/dom/content/dom-decorator.js b/devtools/client/dom/content/dom-decorator.js index a711a95d83..625caaf55b 100644 --- a/devtools/client/dom/content/dom-decorator.js +++ b/devtools/client/dom/content/dom-decorator.js @@ -41,7 +41,7 @@ DomDecorator.prototype = { * Return custom React template for specified object. The template * might depend on specified column. */ - getValueRep(value, colId) {}, + getValueRep() {}, }; // Exports from this module diff --git a/devtools/client/dom/content/reducers/grips.js b/devtools/client/dom/content/reducers/grips.js index 1413baa1ce..f5871d59dd 100644 --- a/devtools/client/dom/content/reducers/grips.js +++ b/devtools/client/dom/content/reducers/grips.js @@ -36,7 +36,7 @@ function grips(state = getInitialState(), action) { /** * Handle requestProperties action */ -function onRequestProperties(state, action) { +function onRequestProperties(state) { return state; } diff --git a/devtools/client/dom/panel.js b/devtools/client/dom/panel.js index 98e821cbd8..427ffe58f3 100644 --- a/devtools/client/dom/panel.js +++ b/devtools/client/dom/panel.js @@ -147,7 +147,7 @@ DomPanel.prototype = { this.refresh(); }, - _onTargetSelected({ targetFront }) { + _onTargetSelected() { this.forceRefresh(); }, diff --git a/devtools/client/framework/actions/dom-mutation-breakpoints.js b/devtools/client/framework/actions/dom-mutation-breakpoints.js index 1e1273d711..9780771a24 100644 --- a/devtools/client/framework/actions/dom-mutation-breakpoints.js +++ b/devtools/client/framework/actions/dom-mutation-breakpoints.js @@ -47,7 +47,7 @@ function createDOMMutationBreakpoint(nodeFront, mutationType) { assert(typeof nodeFront === "object" && nodeFront); assert(typeof mutationType === "string"); - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { const walker = nodeFront.walkerFront; dispatch({ @@ -67,7 +67,7 @@ function deleteDOMMutationBreakpoint(nodeFront, mutationType) { assert(typeof nodeFront === "object" && nodeFront); assert(typeof mutationType === "string"); - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { const walker = nodeFront.walkerFront; await walker.setMutationBreakpoints(nodeFront, { [mutationType]: false, @@ -141,7 +141,7 @@ function toggleDOMMutationBreakpointState(id, enabled) { assert(typeof id === "string"); assert(typeof enabled === "boolean"); - return async function ({ dispatch, getState }) { + return async function ({ getState }) { const bp = getDOMMutationBreakpoint(getState(), id); if (!bp) { throw new Error(`No DOM mutation BP with ID ${id}`); diff --git a/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_netmonitor.js b/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_netmonitor.js index 56e38998ce..cfa5783f12 100644 --- a/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_netmonitor.js +++ b/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_netmonitor.js @@ -29,6 +29,7 @@ add_task(async function () { await ToolboxTask.importFunctions({ waitUntil, + waitForDOM, }); await ToolboxTask.spawn(null, async () => { @@ -94,7 +95,10 @@ add_task(async function () { await ToolboxTask.spawn(null, async () => { const monitor = gToolbox.getCurrentPanel(); - const { document, store } = monitor.panelWin; + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire( + "devtools/client/netmonitor/src/actions/index" + ); await waitUntil( () => !document.querySelector(".request-list-empty-notice") @@ -110,10 +114,19 @@ add_task(async function () { document.querySelectorAll("tbody .requests-list-column.requests-list-url") ); is(requests.length, 1, "One request displayed"); + const requestUrl = + "https://example.org/document-builder.sjs?html=fromParent"; + is(requests[0].textContent, requestUrl, "Expected request is displayed"); + + const waitForHeaders = waitForDOM(document, ".headers-overview"); + store.dispatch(Actions.toggleNetworkDetails()); + await waitForHeaders; + + const tabpanel = document.querySelector("#headers-panel"); is( - requests[0].textContent, - "https://example.org/document-builder.sjs?html=fromParent", - "Expected request is displayed" + tabpanel.querySelector(".url-preview .url").innerText, + requestUrl, + "The url summary value is incorrect." ); }); @@ -129,23 +142,24 @@ add_task(async function () { const monitor = gToolbox.getCurrentPanel(); const { document, store } = monitor.panelWin; + // Note that we may have lots of other requests relates to browser activity, + // like file:// requests for many internal UI ressources. await waitUntil(() => store.getState().requests.requests.length >= 3); ok(true, "Expected content requests are displayed"); - const requests = Array.from( - document.querySelectorAll("tbody .requests-list-column.requests-list-url") - ); - is(requests.length, 3, "Three requests displayed"); - ok( - requests[1].textContent.includes( - `https://example.com/document-builder.sjs` - ), - "Request for the tab is displayed" - ); - is( - requests[2].textContent, - innerUrlImg, - "Request for image image in tab is displayed" - ); + async function waitForRequest(url, requestName) { + info(`Wait for ${requestName} request`); + await waitUntil(() => { + const requests = Array.from( + document.querySelectorAll( + "tbody .requests-list-column.requests-list-url" + ) + ); + return requests.some(r => r.textContent.includes(url)); + }); + info(`Got ${requestName} request`); + } + await waitForRequest("https://example.com/document-builder.sjs", "tab"); + await waitForRequest(innerUrlImg, "image in tab"); }); }); diff --git a/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_unavailable_children.js b/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_unavailable_children.js index 5029c62306..d06274591e 100644 --- a/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_unavailable_children.js +++ b/devtools/client/framework/browser-toolbox/test/browser_browser_toolbox_unavailable_children.js @@ -38,107 +38,99 @@ add_task(async function () { selectNode, }); - const tabProcessID = - tab.linkedBrowser.browsingContext.currentWindowGlobal.osPid; - - const decodedTabURI = decodeURI(tab.linkedBrowser.currentURI.spec); - - await ToolboxTask.spawn( - [tabProcessID, isFissionEnabled(), decodedTabURI], - async (processID, _isFissionEnabled, tabURI) => { - /* global gToolbox */ - const inspector = gToolbox.getPanel("inspector"); - - info("Select the test browser element."); - await selectNode('browser[remote="true"][test-tab]', inspector); - - info("Retrieve the node front for selected node."); - const browserNodeFront = inspector.selection.nodeFront; - ok(!!browserNodeFront, "Retrieved a node front for the browser"); - is(browserNodeFront.displayName, "browser"); - - // Small helper to expand containers and return the child container - // matching the provided display name. - async function expandContainer(container, expectedChildName) { - info(`Expand the node expected to contain a ${expectedChildName}`); - await inspector.markup.expandNode(container.node); - await waitUntil(() => !!container.getChildContainers().length); - - const children = container - .getChildContainers() - .filter(child => child.node.displayName === expectedChildName); - is(children.length, 1); - return children[0]; - } - - info("Check that the corresponding markup view container has children"); - const browserContainer = inspector.markup.getContainer(browserNodeFront); - ok(browserContainer.hasChildren); - ok( - !browserContainer.node.childrenUnavailable, - "childrenUnavailable un-set" - ); - ok( - !browserContainer.elt.querySelector(".unavailable-children"), - "The unavailable badge is not displayed" - ); - - // Store the asserts as a helper to reuse it later in the test. - async function assertMarkupView() { - info("Check that the children are #document > html > body > div"); - let container = await expandContainer(browserContainer, "#document"); - container = await expandContainer(container, "html"); - container = await expandContainer(container, "body"); - container = await expandContainer(container, "div"); - - info("Select the #pick-me div"); - await selectNode(container.node, inspector); - is(inspector.selection.nodeFront.id, "pick-me"); - } - await assertMarkupView(); - - const parentProcessScope = gToolbox.doc.querySelector( - 'input[name="chrome-debug-mode"][value="parent-process"]' - ); - - info("Switch to parent process only scope"); - const onInspectorUpdated = inspector.once("inspector-updated"); - parentProcessScope.click(); - await onInspectorUpdated; - - // Note: `getChildContainers` returns null when the container has no - // children, instead of an empty array. - await waitUntil(() => browserContainer.getChildContainers() === null); - - ok(!browserContainer.hasChildren, "browser container has no children"); - ok(browserContainer.node.childrenUnavailable, "childrenUnavailable set"); - ok( - !!browserContainer.elt.querySelector(".unavailable-children"), - "The unavailable badge is displayed" - ); - - const everythingScope = gToolbox.doc.querySelector( - 'input[name="chrome-debug-mode"][value="everything"]' - ); - - info("Switch to multi process scope"); - everythingScope.click(); - - info("Wait until browserContainer has children"); - await waitUntil(() => browserContainer.hasChildren); - ok(browserContainer.hasChildren, "browser container has children"); - ok( - !browserContainer.node.childrenUnavailable, - "childrenUnavailable un-set" - ); - ok( - !browserContainer.elt.querySelector(".unavailable-children"), - "The unavailable badge is no longer displayed" - ); - - await assertMarkupView(); + await ToolboxTask.spawn([], async () => { + /* global gToolbox */ + const inspector = gToolbox.getPanel("inspector"); + + info("Select the test browser element."); + await selectNode('browser[remote="true"][test-tab]', inspector); + + info("Retrieve the node front for selected node."); + const browserNodeFront = inspector.selection.nodeFront; + ok(!!browserNodeFront, "Retrieved a node front for the browser"); + is(browserNodeFront.displayName, "browser"); + + // Small helper to expand containers and return the child container + // matching the provided display name. + async function expandContainer(container, expectedChildName) { + info(`Expand the node expected to contain a ${expectedChildName}`); + await inspector.markup.expandNode(container.node); + await waitUntil(() => !!container.getChildContainers().length); + + const children = container + .getChildContainers() + .filter(child => child.node.displayName === expectedChildName); + is(children.length, 1); + return children[0]; } - ); + + info("Check that the corresponding markup view container has children"); + const browserContainer = inspector.markup.getContainer(browserNodeFront); + ok(browserContainer.hasChildren); + ok( + !browserContainer.node.childrenUnavailable, + "childrenUnavailable un-set" + ); + ok( + !browserContainer.elt.querySelector(".unavailable-children"), + "The unavailable badge is not displayed" + ); + + // Store the asserts as a helper to reuse it later in the test. + async function assertMarkupView() { + info("Check that the children are #document > html > body > div"); + let container = await expandContainer(browserContainer, "#document"); + container = await expandContainer(container, "html"); + container = await expandContainer(container, "body"); + container = await expandContainer(container, "div"); + + info("Select the #pick-me div"); + await selectNode(container.node, inspector); + is(inspector.selection.nodeFront.id, "pick-me"); + } + await assertMarkupView(); + + const parentProcessScope = gToolbox.doc.querySelector( + 'input[name="chrome-debug-mode"][value="parent-process"]' + ); + + info("Switch to parent process only scope"); + const onInspectorUpdated = inspector.once("inspector-updated"); + parentProcessScope.click(); + await onInspectorUpdated; + + // Note: `getChildContainers` returns null when the container has no + // children, instead of an empty array. + await waitUntil(() => browserContainer.getChildContainers() === null); + + ok(!browserContainer.hasChildren, "browser container has no children"); + ok(browserContainer.node.childrenUnavailable, "childrenUnavailable set"); + ok( + !!browserContainer.elt.querySelector(".unavailable-children"), + "The unavailable badge is displayed" + ); + + const everythingScope = gToolbox.doc.querySelector( + 'input[name="chrome-debug-mode"][value="everything"]' + ); + + info("Switch to multi process scope"); + everythingScope.click(); + + info("Wait until browserContainer has children"); + await waitUntil(() => browserContainer.hasChildren); + ok(browserContainer.hasChildren, "browser container has children"); + ok( + !browserContainer.node.childrenUnavailable, + "childrenUnavailable un-set" + ); + ok( + !browserContainer.elt.querySelector(".unavailable-children"), + "The unavailable badge is no longer displayed" + ); + + await assertMarkupView(); + }); await ToolboxTask.destroy(); }); diff --git a/devtools/client/framework/browser-toolbox/window.js b/devtools/client/framework/browser-toolbox/window.js index e84ef02829..e1b4c8031b 100644 --- a/devtools/client/framework/browser-toolbox/window.js +++ b/devtools/client/framework/browser-toolbox/window.js @@ -185,7 +185,7 @@ window.addEventListener( { once: true } ); -function onCloseCommand(event) { +function onCloseCommand() { window.close(); } diff --git a/devtools/client/framework/components/ToolboxTabs.js b/devtools/client/framework/components/ToolboxTabs.js index 04b7d653a4..ad392a8700 100644 --- a/devtools/client/framework/components/ToolboxTabs.js +++ b/devtools/client/framework/components/ToolboxTabs.js @@ -97,7 +97,7 @@ class ToolboxTabs extends Component { } } - componentDidUpdate(prevProps, prevState) { + componentDidUpdate(prevProps) { if (this.shouldUpdateToolboxTabs(prevProps, this.props)) { this.updateCachedToolTabsWidthMap(); this.updateOverflowedTabs(); @@ -226,7 +226,7 @@ class ToolboxTabs extends Component { } } - resizeHandler(evt) { + resizeHandler() { window.cancelIdleCallback(this._resizeTimerId); this._resizeTimerId = window.requestIdleCallback( () => { diff --git a/devtools/client/framework/components/ToolboxToolbar.js b/devtools/client/framework/components/ToolboxToolbar.js index 6f94d0282b..f9998db0ab 100644 --- a/devtools/client/framework/components/ToolboxToolbar.js +++ b/devtools/client/framework/components/ToolboxToolbar.js @@ -354,7 +354,7 @@ class ToolboxToolbar extends Component { } const items = []; - toolbox.frameMap.forEach((frame, index) => { + toolbox.frameMap.forEach(frame => { const label = toolbox.target.isWebExtension ? toolbox.target.getExtensionPathName(frame.url) : getUnicodeUrl(frame.url); diff --git a/devtools/client/framework/devtools.js b/devtools/client/framework/devtools.js index e56efb0c4b..05e340a454 100644 --- a/devtools/client/framework/devtools.js +++ b/devtools/client/framework/devtools.js @@ -195,29 +195,13 @@ DevTools.prototype = { * Removes all tools that match the given |toolId| * Needed so that add-ons can remove themselves when they are deactivated * - * @param {string|object} tool - * Definition or the id of the tool to unregister. Passing the - * tool id should be avoided as it is a temporary measure. + * @param {string} toolId + * The id of the tool to unregister. * @param {boolean} isQuitApplication * true to indicate that the call is due to app quit, so we should not * cause a cascade of costly events */ - unregisterTool(tool, isQuitApplication) { - let toolId = null; - if (typeof tool == "string") { - toolId = tool; - tool = this._tools.get(tool); - } else { - const { Deprecated } = ChromeUtils.importESModule( - "resource://gre/modules/Deprecated.sys.mjs" - ); - Deprecated.warning( - "Deprecation WARNING: gDevTools.unregisterTool(tool) is " + - "deprecated. You should unregister a tool using its toolId: " + - "gDevTools.unregisterTool(toolId)." - ); - toolId = tool.id; - } + unregisterTool(toolId, isQuitApplication) { this._tools.delete(toolId); if (!isQuitApplication) { diff --git a/devtools/client/framework/menu.js b/devtools/client/framework/menu.js index a4cd8af5f7..2aef8aaf01 100644 --- a/devtools/client/framework/menu.js +++ b/devtools/client/framework/menu.js @@ -49,10 +49,10 @@ Menu.prototype.clear = function () { /** * Add an item to a specified position in the menu * - * @param {int} pos - * @param {MenuItem} menuItem + * @param {int} _pos + * @param {MenuItem} _menuItem */ -Menu.prototype.insert = function (pos, menuItem) { +Menu.prototype.insert = function (_pos, _menuItem) { throw Error("Not implemented"); }; diff --git a/devtools/client/framework/source-map-url-service.js b/devtools/client/framework/source-map-url-service.js index 8e08e9e4cb..043211a723 100644 --- a/devtools/client/framework/source-map-url-service.js +++ b/devtools/client/framework/source-map-url-service.js @@ -296,7 +296,7 @@ class SourceMapURLService { return query; } - _dispatchQuery(query, newSubscribers = null) { + _dispatchQuery(query) { if (!this._prefValue) { throw new Error("This function should only be called if the pref is on."); } diff --git a/devtools/client/framework/test/browser_devtools_api_destroy.js b/devtools/client/framework/test/browser_devtools_api_destroy.js index 736455df65..56cf001f76 100644 --- a/devtools/client/framework/test/browser_devtools_api_destroy.js +++ b/devtools/client/framework/test/browser_devtools_api_destroy.js @@ -38,11 +38,11 @@ async function runTests(aTab) { const panel = toolbox.getPanel(toolDefinition.id); ok(panel, "Tool open"); - gDevTools.once("toolbox-destroy", (toolbox, iframe) => { + gDevTools.once("toolbox-destroy", () => { collectedEvents.push("toolbox-destroy"); }); - gDevTools.once(toolDefinition.id + "-destroy", (toolbox, iframe) => { + gDevTools.once(toolDefinition.id + "-destroy", () => { collectedEvents.push("gDevTools-" + toolDefinition.id + "-destroy"); }); diff --git a/devtools/client/framework/test/browser_keybindings_01.js b/devtools/client/framework/test/browser_keybindings_01.js index 968c3a3d3d..3f48a5dfa2 100644 --- a/devtools/client/framework/test/browser_keybindings_01.js +++ b/devtools/client/framework/test/browser_keybindings_01.js @@ -97,6 +97,33 @@ add_task(async function () { key.synthesizeKey(); await onPickerStop; ok(true, "picker-stopped event received, highlighter stopped"); + + info( + `Run the keyboard shortcut for ${test.id} with picker shortcut disabled` + ); + await pushPref("devtools.command-button-pick.enabled", false); + + // Switch to another panel to assure the hotkey still opens inspector + await toolbox.selectTool("webconsole"); + await waitUntil(() => toolbox.currentToolId === "webconsole"); + + // Check if picker event times out + const onHasPickerStarted = Promise.race([ + toolbox.nodePicker.once("picker-started").then(() => true), + wait(100).then(() => false), + ]); + + key.synthesizeKey(); + const hasPickerStarted = await onHasPickerStarted; + + ok(!hasPickerStarted, "picker was not started on shortcut"); + is( + toolbox.currentToolId, + "inspector", + "shortcut still switches tab to inspector" + ); + + await pushPref("devtools.command-button-pick.enabled", true); } await onSelectTool; diff --git a/devtools/client/framework/test/browser_target_parents.js b/devtools/client/framework/test/browser_target_parents.js index 795219abef..d66339739c 100644 --- a/devtools/client/framework/test/browser_target_parents.js +++ b/devtools/client/framework/test/browser_target_parents.js @@ -60,7 +60,7 @@ add_task(async function () { // With that, we were chasing a precise race, where a second call to ProcessDescriptor.getTarget() // happens between the instantiation of ContentProcessTarget and its call to attach() from getTarget // function. - await testGetTargetWithConcurrentCalls(processes, processTarget => { + await testGetTargetWithConcurrentCalls(processes, () => { // We only call ContentProcessTargetFront.attach and not TargetMixin.attachAndInitThread. // So nothing is done for content process targets. return true; diff --git a/devtools/client/framework/test/browser_target_server_compartment.js b/devtools/client/framework/test/browser_target_server_compartment.js index c0bd8e56f0..652f9e0bfb 100644 --- a/devtools/client/framework/test/browser_target_server_compartment.js +++ b/devtools/client/framework/test/browser_target_server_compartment.js @@ -26,7 +26,7 @@ async function testChromeTab() { ); const onThreadActorInstantiated = new Promise(resolve => { - const observe = function (subject, topic, data) { + const observe = function (subject, topic) { if (topic === "devtools-thread-ready") { Services.obs.removeObserver(observe, "devtools-thread-ready"); const threadActor = subject.wrappedJSObject; @@ -62,7 +62,7 @@ async function testChromeTab() { ); const onDedicatedLoaderDestroy = new Promise(resolve => { - const observe = function (subject, topic, data) { + const observe = function (subject, topic) { if (topic === "devtools:loader:destroy") { Services.obs.removeObserver(observe, "devtools:loader:destroy"); resolve(); @@ -81,7 +81,7 @@ async function testChromeTab() { // Test that Main process Target can debug chrome scripts async function testMainProcess() { const onThreadActorInstantiated = new Promise(resolve => { - const observe = function (subject, topic, data) { + const observe = function (subject, topic) { if (topic === "devtools-thread-ready") { Services.obs.removeObserver(observe, "devtools-thread-ready"); const threadActor = subject.wrappedJSObject; diff --git a/devtools/client/framework/test/browser_toolbox_highlight.js b/devtools/client/framework/test/browser_toolbox_highlight.js index d0712aeed5..401f5df9f6 100644 --- a/devtools/client/framework/test/browser_toolbox_highlight.js +++ b/devtools/client/framework/test/browser_toolbox_highlight.js @@ -62,7 +62,7 @@ function test() { finish(); }); }); - })().catch(error => { + })().catch(() => { ok(false, "There was an error running the test."); }); } diff --git a/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.html b/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.html index 4065aabc2b..06b6281588 100644 --- a/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.html +++ b/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.html @@ -15,9 +15,9 @@ // enabled, so dereferencing it would throw a ReferenceError (which // is then caught in the .catch() clause). return window.navigator.serviceWorker.register("serviceworker.js"); - }).then(registration => { + }).then(() => { return {success: true}; - }).catch(error => { + }).catch(() => { return {success: false}; }); } @@ -36,7 +36,7 @@ function iframeRegisterAndUnregister() { var frame = window.document.createElement("iframe"); - var promise = new Promise(function(resolve, reject) { + var promise = new Promise(function(resolve) { frame.addEventListener("load", function() { Promise.resolve().then(_ => { return frame.contentWindow.navigator.serviceWorker.register("serviceworker.js"); @@ -45,7 +45,7 @@ }).then(_ => { frame.remove(); resolve({success: true}); - }).catch(error => { + }).catch(() => { resolve({success: false}); }); }, {once: true}); diff --git a/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.js b/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.js index 152f64f835..315b1f1e55 100644 --- a/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.js +++ b/devtools/client/framework/test/browser_toolbox_options_enable_serviceworkers_testing.js @@ -67,7 +67,7 @@ function register() { return sendMessage("devtools:sw-test:register"); } -function unregister(swr) { +function unregister() { return sendMessage("devtools:sw-test:unregister"); } diff --git a/devtools/client/framework/test/browser_toolbox_options_multiple_tabs.js b/devtools/client/framework/test/browser_toolbox_options_multiple_tabs.js index 74c0983d4e..d8d4d3057d 100644 --- a/devtools/client/framework/test/browser_toolbox_options_multiple_tabs.js +++ b/devtools/client/framework/test/browser_toolbox_options_multiple_tabs.js @@ -66,7 +66,7 @@ async function testToggleTools() { await toggleTool(tab2, toolId); } -async function toggleTool({ doc, panelWin, checkbox, tab }, toolId) { +async function toggleTool({ panelWin, checkbox }, toolId) { const prevChecked = checkbox.checked; (prevChecked ? checkRegistered : checkUnregistered)(toolId); diff --git a/devtools/client/framework/test/browser_toolbox_select_event.js b/devtools/client/framework/test/browser_toolbox_select_event.js index ebdae9af13..bbfd36eae4 100644 --- a/devtools/client/framework/test/browser_toolbox_select_event.js +++ b/devtools/client/framework/test/browser_toolbox_select_event.js @@ -72,7 +72,7 @@ add_task(async function () { async function testSelectToolRace() { const toolbox = await openToolboxForTab(tab, "webconsole"); let selected = false; - const onSelect = (event, id) => { + const onSelect = () => { if (selected) { ok(false, "Got more than one 'select' event"); } else { diff --git a/devtools/client/framework/test/browser_toolbox_telemetry_activate_splitconsole.js b/devtools/client/framework/test/browser_toolbox_telemetry_activate_splitconsole.js index cd1a478f5c..31c52e432e 100644 --- a/devtools/client/framework/test/browser_toolbox_telemetry_activate_splitconsole.js +++ b/devtools/client/framework/test/browser_toolbox_telemetry_activate_splitconsole.js @@ -103,6 +103,6 @@ async function checkResults() { // extras is(extra.host, expected.extra.host, "host is correct"); - ok(extra.width > 0, "width is greater than 0"); + Assert.greater(Number(extra.width), 0, "width is greater than 0"); } } diff --git a/devtools/client/framework/test/browser_toolbox_telemetry_enter.js b/devtools/client/framework/test/browser_toolbox_telemetry_enter.js index 4cb4611a97..ac1253ec79 100644 --- a/devtools/client/framework/test/browser_toolbox_telemetry_enter.js +++ b/devtools/client/framework/test/browser_toolbox_telemetry_enter.js @@ -144,7 +144,7 @@ async function checkResults() { // extras is(extra.host, expected.extra.host, "host is correct"); - ok(extra.width > 0, "width is greater than 0"); + Assert.greater(Number(extra.width), 0, "width is greater than 0"); is(extra.start_state, expected.extra.start_state, "start_state is correct"); is(extra.panel_name, expected.extra.panel_name, "panel_name is correct"); is(extra.cold, expected.extra.cold, "cold is correct"); diff --git a/devtools/client/framework/test/browser_toolbox_telemetry_exit.js b/devtools/client/framework/test/browser_toolbox_telemetry_exit.js index 3056b9af8c..98f831d6d4 100644 --- a/devtools/client/framework/test/browser_toolbox_telemetry_exit.js +++ b/devtools/client/framework/test/browser_toolbox_telemetry_exit.js @@ -121,7 +121,7 @@ async function checkResults() { // extras is(extra.host, expected.extra.host, "host is correct"); - ok(extra.width > 0, "width is greater than 0"); + Assert.greater(Number(extra.width), 0, "width is greater than 0"); is(extra.panel_name, expected.extra.panel_name, "panel_name is correct"); is(extra.next_panel, expected.extra.next_panel, "next_panel is correct"); is(extra.reason, expected.extra.reason, "reason is correct"); diff --git a/devtools/client/framework/test/browser_toolbox_toolbar_minimum_width.js b/devtools/client/framework/test/browser_toolbox_toolbar_minimum_width.js index cdd6678e6f..d5780c083c 100644 --- a/devtools/client/framework/test/browser_toolbox_toolbar_minimum_width.js +++ b/devtools/client/framework/test/browser_toolbox_toolbar_minimum_width.js @@ -10,7 +10,7 @@ const SIDEBAR_WIDTH_PREF = "devtools.toolbox.sidebar.width"; const { Toolbox } = require("resource://devtools/client/framework/toolbox.js"); -add_task(async function (pickerEnable, commandsEnable) { +add_task(async function () { // 74px is Chevron(26px) + Meatball(24px) + Close(24px) // devtools-browser.css defined this minimum width by using min-width. Services.prefs.setIntPref(SIDEBAR_WIDTH_PREF, 74); diff --git a/devtools/client/framework/test/browser_toolbox_window_reload_target.js b/devtools/client/framework/test/browser_toolbox_window_reload_target.js index d9a4eb34c1..8415af88f2 100644 --- a/devtools/client/framework/test/browser_toolbox_window_reload_target.js +++ b/devtools/client/framework/test/browser_toolbox_window_reload_target.js @@ -46,7 +46,7 @@ add_task(async function () { "Listen to page reloads to check that they are indeed sent by the toolbox" ); let reloadDetected = 0; - const reloadCounter = msg => { + const reloadCounter = () => { reloadDetected++; info("Detected reload #" + reloadDetected); is( diff --git a/devtools/client/framework/test/helper_disable_cache.js b/devtools/client/framework/test/helper_disable_cache.js index a98a68cc9f..31db6d81b4 100644 --- a/devtools/client/framework/test/helper_disable_cache.js +++ b/devtools/client/framework/test/helper_disable_cache.js @@ -93,7 +93,7 @@ async function setDisableCacheCheckboxChecked(tabX, state) { if (cbx.checked !== state) { info("Setting disable cache checkbox to " + state + " for " + tabX.title); - const onReconfigured = tabX.toolbox.once("cache-reconfigured"); + const onReconfigured = tabX.toolbox.once("new-configuration-applied"); cbx.click(); // We have to wait for the reconfigure request to be finished before reloading diff --git a/devtools/client/framework/toolbox-hosts.js b/devtools/client/framework/toolbox-hosts.js index 59d113848f..889a8cec36 100644 --- a/devtools/client/framework/toolbox-hosts.js +++ b/devtools/client/framework/toolbox-hosts.js @@ -413,7 +413,7 @@ PageHost.prototype = { raise() {}, // Do nothing. - setTitle(title) {}, + setTitle() {}, // Do nothing. destroy() { diff --git a/devtools/client/framework/toolbox-options.js b/devtools/client/framework/toolbox-options.js index 57fa1202b7..98b263ad44 100644 --- a/devtools/client/framework/toolbox-options.js +++ b/devtools/client/framework/toolbox-options.js @@ -148,7 +148,7 @@ OptionsPanel.prototype = { } }, - _themeRegistered(themeId) { + _themeRegistered() { this.setupThemeList(); }, diff --git a/devtools/client/framework/toolbox-tabs-order-manager.js b/devtools/client/framework/toolbox-tabs-order-manager.js index 0eec0c935f..d8fe73597f 100644 --- a/devtools/client/framework/toolbox-tabs-order-manager.js +++ b/devtools/client/framework/toolbox-tabs-order-manager.js @@ -7,7 +7,7 @@ const { AddonManager } = ChromeUtils.importESModule( "resource://gre/modules/AddonManager.sys.mjs", // AddonManager is a singleton, never create two instances of it. - { loadInDevToolsLoader: false } + { global: "shared" } ); const { gDevTools, diff --git a/devtools/client/framework/toolbox.js b/devtools/client/framework/toolbox.js index 2294ff879d..a03360aa26 100644 --- a/devtools/client/framework/toolbox.js +++ b/devtools/client/framework/toolbox.js @@ -216,6 +216,25 @@ loader.lazyGetter(this, "ProfilerBackground", () => { ); }); +const BOOLEAN_CONFIGURATION_PREFS = { + "devtools.cache.disabled": { + name: "cacheDisabled", + }, + "devtools.custom-formatters.enabled": { + name: "customFormatters", + }, + "devtools.serviceWorkers.testing.enabled": { + name: "serviceWorkersTestingEnabled", + }, + "devtools.inspector.simple-highlighters-reduced-motion": { + name: "useSimpleHighlightersForReducedMotion", + }, + "devtools.debugger.features.overlay": { + name: "pauseOverlay", + thread: true, + }, +}; + /** * A "Toolbox" is the component that holds all the tools for one specific * target. Visually, it's a document that includes the tools tabs and all @@ -284,13 +303,6 @@ function Toolbox(commands, selectedTool, hostType, contentWindow, frameId) { this._splitConsoleOnKeypress = this._splitConsoleOnKeypress.bind(this); this.closeToolbox = this.closeToolbox.bind(this); this.destroy = this.destroy.bind(this); - this._applyCacheSettings = this._applyCacheSettings.bind(this); - this._applyCustomFormatterSetting = - this._applyCustomFormatterSetting.bind(this); - this._applyServiceWorkersTestingSettings = - this._applyServiceWorkersTestingSettings.bind(this); - this._applySimpleHighlightersSettings = - this._applySimpleHighlightersSettings.bind(this); this._saveSplitConsoleHeight = this._saveSplitConsoleHeight.bind(this); this._onFocus = this._onFocus.bind(this); this._onBlur = this._onBlur.bind(this); @@ -887,17 +899,9 @@ Toolbox.prototype = { // the iframe being ready (makes startup faster) await this.commands.targetCommand.startListening(); - // Lets get the current thread settings from the prefs and - // update the threadConfigurationActor which should manage - // updating the current threads. - const options = await getThreadOptions(); - await this.commands.threadConfigurationCommand.updateConfiguration( - options - ); - - // This needs to be done before watching for resources so console messages can be - // custom formatted right away. - await this._applyCustomFormatterSetting(); + // Transfer settings early, before watching resources as it may impact them. + // (this is the case for custom formatter pref and console messages) + await this._listenAndApplyConfigurationPref(); // The targetCommand is created right before this code. // It means that this call to watchTargets is the first, @@ -960,22 +964,6 @@ Toolbox.prototype = { const framesPromise = this._listFrames(); Services.prefs.addObserver( - "devtools.cache.disabled", - this._applyCacheSettings - ); - Services.prefs.addObserver( - "devtools.custom-formatters.enabled", - this._applyCustomFormatterSetting - ); - Services.prefs.addObserver( - "devtools.serviceWorkers.testing.enabled", - this._applyServiceWorkersTestingSettings - ); - Services.prefs.addObserver( - "devtools.inspector.simple-highlighters-reduced-motion", - this._applySimpleHighlightersSettings - ); - Services.prefs.addObserver( BROWSERTOOLBOX_SCOPE_PREF, this._refreshHostTitle ); @@ -992,11 +980,6 @@ Toolbox.prototype = { this._buildInitialPanelDefinitions(); this._setDebugTargetData(); - // Forward configuration flags to the DevTools server. - this._applyCacheSettings(); - this._applyServiceWorkersTestingSettings(); - this._applySimpleHighlightersSettings(); - this._addWindowListeners(); this._addChromeEventHandlerEvents(); @@ -2033,7 +2016,7 @@ Toolbox.prototype = { this.errorCountButton = this._createButtonState({ id: "command-button-errorcount", isInStartContainer: false, - isToolSupported: toolbox => true, + isToolSupported: () => true, description: L10N.getStr("toolbox.errorCountButton.description"), }); // Use updateErrorCountButton to set some properties so we don't have to repeat @@ -2206,68 +2189,70 @@ Toolbox.prototype = { : L10N.getFormatStr(label, shortcut); }, - /** - * Apply the current cache setting from devtools.cache.disabled to this - * toolbox's tab. - */ - async _applyCacheSettings() { - const pref = "devtools.cache.disabled"; - const cacheDisabled = Services.prefs.getBoolPref(pref); + async _listenAndApplyConfigurationPref() { + this._onBooleanConfigurationPrefChange = + this._onBooleanConfigurationPrefChange.bind(this); - await this.commands.targetConfigurationCommand.updateConfiguration({ - cacheDisabled, - }); + // We have two configurations: + // * target specific configurations, which are set on all target actors, themself easily accessible from any actor. + // Most configurations should be set this way. + // * thread specific configurations, which are set on directly on the thread actor. + // Only configuration used by the thread actor should be set this way. + const targetConfiguration = {}; - // This event is only emitted for tests in order to know when to reload - if (flags.testing) { - this.emit("cache-reconfigured"); - } - }, + // Get the current thread settings from the prefs as well as debugger internal storage for breakpoints. + const threadConfiguration = await getThreadOptions(); - /** - * Apply the custom formatter setting (from `devtools.custom-formatters.enabled`) to this - * toolbox's tab. - */ - async _applyCustomFormatterSetting() { - if (!this.commands) { - return; - } + for (const prefName in BOOLEAN_CONFIGURATION_PREFS) { + const { name, thread } = BOOLEAN_CONFIGURATION_PREFS[prefName]; + const value = Services.prefs.getBoolPref(prefName, false); - const customFormatters = Services.prefs.getBoolPref( - "devtools.custom-formatters.enabled", - false - ); + // Based on the pref name, this will be stored in either target or thread specific configuration + if (thread) { + threadConfiguration[name] = value; + } else { + targetConfiguration[name] = value; + } - await this.commands.targetConfigurationCommand.updateConfiguration({ - customFormatters, - }); + // Also listen for any future change + Services.prefs.addObserver( + prefName, + this._onBooleanConfigurationPrefChange + ); + } - this.emitForTests("custom-formatters-reconfigured"); + // Now communicate the configurations to the server + await this.commands.targetConfigurationCommand.updateConfiguration( + targetConfiguration + ); + await this.commands.threadConfigurationCommand.updateConfiguration( + threadConfiguration + ); }, /** - * Apply the current service workers testing setting from - * devtools.serviceWorkers.testing.enabled to this toolbox's tab. - */ - _applyServiceWorkersTestingSettings() { - const pref = "devtools.serviceWorkers.testing.enabled"; - const serviceWorkersTestingEnabled = Services.prefs.getBoolPref(pref); - this.commands.targetConfigurationCommand.updateConfiguration({ - serviceWorkersTestingEnabled, + * Called whenever a preference registered in BOOLEAN_CONFIGURATION_PREFS + * changes. + * This is used to communicate the new setting's value to the server. + * + * @param {String} subject + * @param {String} topic + * @param {String} prefName + * The preference name which changed + */ + async _onBooleanConfigurationPrefChange(subject, topic, prefName) { + const { name, thread } = BOOLEAN_CONFIGURATION_PREFS[prefName]; + const value = Services.prefs.getBoolPref(prefName, false); + + const configurationCommand = thread + ? this.commands.threadConfigurationCommand + : this.commands.targetConfigurationCommand; + await configurationCommand.updateConfiguration({ + [name]: value, }); - }, - /** - * Apply the current simple highlighters setting to this toolbox's tab. - */ - _applySimpleHighlightersSettings() { - const useSimpleHighlightersForReducedMotion = Services.prefs.getBoolPref( - "devtools.inspector.simple-highlighters-reduced-motion", - false - ); - this.commands.targetConfigurationCommand.updateConfiguration({ - useSimpleHighlightersForReducedMotion, - }); + // This event is only emitted for tests in order to know when the setting has been applied by the backend. + this.emitForTests("new-configuration-applied", prefName); }, /** @@ -3378,7 +3363,7 @@ Toolbox.prototype = { return prefFront.getBoolPref(DISABLE_AUTOHIDE_PREF); }, - async _listFrames(event) { + async _listFrames() { if ( !this.target.getTrait("frames") || this.target.targetForm.ignoreSubFrames @@ -4053,22 +4038,12 @@ Toolbox.prototype = { gDevTools.off("tool-registered", this._toolRegistered); gDevTools.off("tool-unregistered", this._toolUnregistered); - Services.prefs.removeObserver( - "devtools.cache.disabled", - this._applyCacheSettings - ); - Services.prefs.removeObserver( - "devtools.custom-formatters.enabled", - this._applyCustomFormatterSetting - ); - Services.prefs.removeObserver( - "devtools.serviceWorkers.testing.enabled", - this._applyServiceWorkersTestingSettings - ); - Services.prefs.removeObserver( - "devtools.inspector.simple-highlighters-reduced-motion", - this._applySimpleHighlightersSettings - ); + for (const prefName in BOOLEAN_CONFIGURATION_PREFS) { + Services.prefs.removeObserver( + prefName, + this._onBooleanConfigurationPrefChange + ); + } Services.prefs.removeObserver( BROWSERTOOLBOX_SCOPE_PREF, this._refreshHostTitle @@ -4478,8 +4453,8 @@ Toolbox.prototype = { * Opens source in plain "view-source:". * @see devtools/client/shared/source-utils.js */ - viewSource(sourceURL, sourceLine) { - return viewSource.viewSource(this, sourceURL, sourceLine); + viewSource(sourceURL, sourceLine, sourceColumn) { + return viewSource.viewSource(this, sourceURL, sourceLine, sourceColumn); }, // Support for WebExtensions API (`devtools.network.*`) diff --git a/devtools/client/fronts/css-properties.js b/devtools/client/fronts/css-properties.js index 93e9d52900..47bfe3e411 100644 --- a/devtools/client/fronts/css-properties.js +++ b/devtools/client/fronts/css-properties.js @@ -131,7 +131,7 @@ CssProperties.prototype = { * * @return {Array} An array of strings. */ - getNames(property) { + getNames() { return Object.keys(this.properties); }, diff --git a/devtools/client/fronts/node.js b/devtools/client/fronts/node.js index 8df63f2c1b..d56f2d93f1 100644 --- a/devtools/client/fronts/node.js +++ b/devtools/client/fronts/node.js @@ -585,7 +585,7 @@ class NodeFront extends FrontClassWithSpec(nodeSpec) { * and is only intended as a stopgap during the transition to the remote * protocol. If you depend on this you're likely to break soon. */ - rawNode(rawNode) { + rawNode() { if (!this.isLocalToBeDeprecated()) { console.warn("Tried to use rawNode on a remote connection."); return null; diff --git a/devtools/client/fronts/object.js b/devtools/client/fronts/object.js index 53752a778a..c5ce91329c 100644 --- a/devtools/client/fronts/object.js +++ b/devtools/client/fronts/object.js @@ -14,17 +14,18 @@ const { } = require("resource://devtools/client/fronts/string.js"); const SUPPORT_ENUM_ENTRIES_SET = new Set([ + "CustomStateSet", + "FormData", "Headers", + "HighlightRegistry", "Map", - "WeakMap", + "MIDIInputMap", + "MIDIOutputMap", "Set", - "WeakSet", "Storage", "URLSearchParams", - "FormData", - "MIDIInputMap", - "MIDIOutputMap", - "HighlightRegistry", + "WeakMap", + "WeakSet", ]); /** diff --git a/devtools/client/fronts/storage.js b/devtools/client/fronts/storage.js index 7637471126..a6ccd82514 100644 --- a/devtools/client/fronts/storage.js +++ b/devtools/client/fronts/storage.js @@ -26,7 +26,7 @@ for (const childSpec of Object.values(childSpecs)) { } // Update the storage fronts `hosts` properties with potential new hosts and remove the deleted ones - async _onStoreUpdate({ changed, added, deleted }) { + async _onStoreUpdate({ added, deleted }) { // `resourceKey` comes from the storage resource and is set by the legacy listener // -or- the resource transformer. const { resourceKey } = this; diff --git a/devtools/client/fronts/walker.js b/devtools/client/fronts/walker.js index 5feae2a343..5cffef612d 100644 --- a/devtools/client/fronts/walker.js +++ b/devtools/client/fronts/walker.js @@ -148,6 +148,18 @@ class WalkerFront extends FrontClassWithSpec(walkerSpec) { return response.node; } + async getIdrefNode(queryNode, id) { + // @backward-compat { version 125 } getIdrefNode was added in 125, so the whole if + // block below can be removed once 125 hits release. + if (!this.traits.hasGetIdrefNode) { + const doc = await this.document(queryNode); + return this.querySelector(doc, "#" + id); + } + + const response = await super.getIdrefNode(queryNode, id); + return response.node; + } + async getNodeActorFromWindowID(windowID) { const response = await super.getNodeActorFromWindowID(windowID); return response ? response.node : null; diff --git a/devtools/client/fronts/watcher.js b/devtools/client/fronts/watcher.js index 1a7499561a..f78e063992 100644 --- a/devtools/client/fronts/watcher.js +++ b/devtools/client/fronts/watcher.js @@ -67,7 +67,7 @@ class WatcherFront extends FrontClassWithSpec(watcherSpec) { // the watcher may notify us about the top level target destruction a bit late. // The descriptor (`this.parentFront`) already switched to the new target. // Missing `target-destroyed` isn't critical when target switching is off - // as `TargetCommand.switchToTarget` will end calling `TargetCommandonTargetDestroyed` for all + // as `TargetCommand.switchToTarget` will end calling `TargetCommand.onTargetDestroyed` for all // existing targets. // https://searchfox.org/mozilla-central/rev/af8e5d37fd56be90ccddae2203e7b875d3f3ae87/devtools/shared/commands/target/target-command.js#166-173 if (front) { diff --git a/devtools/client/inspector/animation/components/App.js b/devtools/client/inspector/animation/components/App.js index 75a000286c..74ce8e7b40 100644 --- a/devtools/client/inspector/animation/components/App.js +++ b/devtools/client/inspector/animation/components/App.js @@ -60,7 +60,7 @@ class App extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.animations.length !== 0 || nextProps.animations.length !== 0 ); diff --git a/devtools/client/inspector/animation/components/NoAnimationPanel.js b/devtools/client/inspector/animation/components/NoAnimationPanel.js index ea034e413d..260325518b 100644 --- a/devtools/client/inspector/animation/components/NoAnimationPanel.js +++ b/devtools/client/inspector/animation/components/NoAnimationPanel.js @@ -26,7 +26,7 @@ class NoAnimationPanel extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return this.props.elementPickerEnabled != nextProps.elementPickerEnabled; } diff --git a/devtools/client/inspector/animation/components/PlaybackRateSelector.js b/devtools/client/inspector/animation/components/PlaybackRateSelector.js index 2d0de53a0c..9f2c56cdb6 100644 --- a/devtools/client/inspector/animation/components/PlaybackRateSelector.js +++ b/devtools/client/inspector/animation/components/PlaybackRateSelector.js @@ -28,7 +28,7 @@ class PlaybackRateSelector extends PureComponent { }; } - static getDerivedStateFromProps(props, state) { + static getDerivedStateFromProps(props) { const { animations, playbackRates } = props; const currentPlaybackRates = sortAndUnique( diff --git a/devtools/client/inspector/animation/test/browser_animation_keyframes-progress-bar.js b/devtools/client/inspector/animation/test/browser_animation_keyframes-progress-bar.js index a7051d9a01..bb69249907 100644 --- a/devtools/client/inspector/animation/test/browser_animation_keyframes-progress-bar.js +++ b/devtools/client/inspector/animation/test/browser_animation_keyframes-progress-bar.js @@ -91,7 +91,7 @@ add_task(async function () { } }); -function assertPosition(barEl, areaEl, expectedRate, animationInspector) { +function assertPosition(barEl, areaEl, expectedRate) { const controllerBounds = areaEl.getBoundingClientRect(); const barBounds = barEl.getBoundingClientRect(); const barX = barBounds.x + barBounds.width / 2 - controllerBounds.x; diff --git a/devtools/client/inspector/animation/test/summary-graph_delay-sign_head.js b/devtools/client/inspector/animation/test/summary-graph_delay-sign_head.js index fd601821b6..fffd653b1d 100644 --- a/devtools/client/inspector/animation/test/summary-graph_delay-sign_head.js +++ b/devtools/client/inspector/animation/test/summary-graph_delay-sign_head.js @@ -75,8 +75,9 @@ async function testSummaryGraphDelaySign() { function assertExpected(key) { const actual = parseFloat(delaySignEl.style[key]); const expected = parseFloat(expectedResult[key]); - ok( - Math.abs(actual - expected) < 0.01, + Assert.less( + Math.abs(actual - expected), + 0.01, `${key} should be ${expected} (got ${actual})` ); } diff --git a/devtools/client/inspector/animation/test/summary-graph_end-delay-sign_head.js b/devtools/client/inspector/animation/test/summary-graph_end-delay-sign_head.js index f87a554420..09838fcadf 100644 --- a/devtools/client/inspector/animation/test/summary-graph_end-delay-sign_head.js +++ b/devtools/client/inspector/animation/test/summary-graph_end-delay-sign_head.js @@ -69,8 +69,9 @@ async function testSummaryGraphEndDelaySign() { function assertExpected(key) { const actual = parseFloat(endDelaySignEl.style[key]); const expected = parseFloat(expectedResult[key]); - ok( - Math.abs(actual - expected) < 0.01, + Assert.less( + Math.abs(actual - expected), + 0.01, `${key} should be ${expected} (got ${actual})` ); } diff --git a/devtools/client/inspector/boxmodel/components/BoxModelInfo.js b/devtools/client/inspector/boxmodel/components/BoxModelInfo.js index e64faba05a..2444b7107d 100644 --- a/devtools/client/inspector/boxmodel/components/BoxModelInfo.js +++ b/devtools/client/inspector/boxmodel/components/BoxModelInfo.js @@ -32,7 +32,7 @@ class BoxModelInfo extends PureComponent { this.onToggleGeometryEditor = this.onToggleGeometryEditor.bind(this); } - onToggleGeometryEditor(e) { + onToggleGeometryEditor() { this.props.onToggleGeometryEditor(); } diff --git a/devtools/client/inspector/breadcrumbs.js b/devtools/client/inspector/breadcrumbs.js index 68bafb591c..47700f7d40 100644 --- a/devtools/client/inspector/breadcrumbs.js +++ b/devtools/client/inspector/breadcrumbs.js @@ -588,9 +588,8 @@ HTMLBreadcrumbs.prototype = { /** * On mouse out, make sure to unhighlight. - * @param {DOMEvent} event. */ - handleMouseOut(event) { + handleMouseOut() { this.inspector.highlighters.hideHighlighterType( this.inspector.highlighters.TYPES.BOXMODEL ); diff --git a/devtools/client/inspector/changes/reducers/changes.js b/devtools/client/inspector/changes/reducers/changes.js index 23e82a3ba7..82a5a92ed7 100644 --- a/devtools/client/inspector/changes/reducers/changes.js +++ b/devtools/client/inspector/changes/reducers/changes.js @@ -371,7 +371,7 @@ const reducers = { return state; }, - [RESET_CHANGES](state) { + [RESET_CHANGES]() { return INITIAL_STATE; }, }; diff --git a/devtools/client/inspector/changes/selectors/changes.js b/devtools/client/inspector/changes/selectors/changes.js index a6b99e4579..a176e11082 100644 --- a/devtools/client/inspector/changes/selectors/changes.js +++ b/devtools/client/inspector/changes/selectors/changes.js @@ -65,7 +65,7 @@ function getChangesTree(state, filter = {}) { } return Object.entries(state) - .filter(([sourceId, source]) => { + .filter(([sourceId]) => { // Use only matching sources if an array to filter by was provided. if (sourceIdsFilter.length) { return sourceIdsFilter.includes(sourceId); @@ -87,7 +87,7 @@ function getChangesTree(state, filter = {}) { ...source, // Build a new collection of rules keyed by rule id. rules: Object.entries(rules) - .filter(([ruleId, rule]) => { + .filter(([ruleId]) => { // Use only matching rules if an array to filter by was provided. if (rulesIdsFilter.length) { return rulesIdsFilter.includes(ruleId); @@ -237,22 +237,19 @@ function getChangesStylesheet(state, filter) { } // Iterate through all sources in the change tree and build a CSS stylesheet string. - return Object.entries(changeTree).reduce( - (stylesheetText, [sourceId, source]) => { - const { href, rules } = source; - // Write code comment with source origin - stylesheetText += `\n/* ${getSourceForDisplay(source)} | ${href} */\n`; - // Write CSS rules - stylesheetText += Object.entries(rules).reduce((str, [ruleId, rule]) => { - // Add a new like only after top-level rules (level == 0) - str += writeRule(ruleId, rule, 0) + "\n"; - return str; - }, ""); + return Object.values(changeTree).reduce((stylesheetText, source) => { + const { href, rules } = source; + // Write code comment with source origin + stylesheetText += `\n/* ${getSourceForDisplay(source)} | ${href} */\n`; + // Write CSS rules + stylesheetText += Object.entries(rules).reduce((str, [ruleId, rule]) => { + // Add a new like only after top-level rules (level == 0) + str += writeRule(ruleId, rule, 0) + "\n"; + return str; + }, ""); - return stylesheetText; - }, - "" - ); + return stylesheetText; + }, ""); } module.exports = { diff --git a/devtools/client/inspector/compatibility/CompatibilityView.js b/devtools/client/inspector/compatibility/CompatibilityView.js index 19c3263f00..548246fd54 100644 --- a/devtools/client/inspector/compatibility/CompatibilityView.js +++ b/devtools/client/inspector/compatibility/CompatibilityView.js @@ -32,7 +32,7 @@ const CompatibilityApp = createFactory( ); class CompatibilityView { - constructor(inspector, window) { + constructor(inspector) { this.inspector = inspector; this.inspector.store.injectReducer("compatibility", compatibilityReducer); @@ -133,7 +133,7 @@ class CompatibilityView { ); } - _parseMarkup(str) { + _parseMarkup() { // Using a BrowserLoader for the inspector is currently blocked on performance regressions, // see Bug 1471853. throw new Error( diff --git a/devtools/client/inspector/compatibility/actions/compatibility.js b/devtools/client/inspector/compatibility/actions/compatibility.js index fa9f410e0d..3ff512f1b0 100644 --- a/devtools/client/inspector/compatibility/actions/compatibility.js +++ b/devtools/client/inspector/compatibility/actions/compatibility.js @@ -74,7 +74,7 @@ function clearDestroyedNodes() { } function initUserSettings() { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: COMPATIBILITY_INIT_USER_SETTINGS_START }); try { diff --git a/devtools/client/inspector/compatibility/reducers/compatibility.js b/devtools/client/inspector/compatibility/reducers/compatibility.js index 9256167601..ce54e856a9 100644 --- a/devtools/client/inspector/compatibility/reducers/compatibility.js +++ b/devtools/client/inspector/compatibility/reducers/compatibility.js @@ -139,7 +139,7 @@ const reducers = { _showError(COMPATIBILITY_UPDATE_TOP_LEVEL_TARGET_FAILURE, error); return state; }, - [COMPATIBILITY_UPDATE_TOP_LEVEL_TARGET_COMPLETE](state, { target }) { + [COMPATIBILITY_UPDATE_TOP_LEVEL_TARGET_COMPLETE](state) { return Object.assign({}, state, { isTopLevelTargetProcessing: false }); }, }; diff --git a/devtools/client/inspector/computed/computed.js b/devtools/client/inspector/computed/computed.js index 7d2c129c7b..9b051425e2 100644 --- a/devtools/client/inspector/computed/computed.js +++ b/devtools/client/inspector/computed/computed.js @@ -1383,7 +1383,7 @@ class PropertyView { /** * The action when a user clicks on the MDN help link for a property. */ - mdnLinkClick(event) { + mdnLinkClick() { if (!this.link) { return; } diff --git a/devtools/client/inspector/computed/test/browser.toml b/devtools/client/inspector/computed/test/browser.toml index d4ec4fc993..634c367351 100644 --- a/devtools/client/inspector/computed/test/browser.toml +++ b/devtools/client/inspector/computed/test/browser.toml @@ -34,7 +34,8 @@ fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and ["browser_computed_getNodeInfo.js"] skip-if = [ - "!debug && os == 'mac'", #Bug 1559033 + "apple_catalina && !debug", #Bug 1559033 + "apple_silicon && !debug", #Bug 1559033 "a11y_checks", # Bugs 1849028 and 1858041 to investigate intermittent a11y_checks results ] diff --git a/devtools/client/inspector/computed/test/browser_computed_keybindings_01.js b/devtools/client/inspector/computed/test/browser_computed_keybindings_01.js index 5a6681f139..351d640bf9 100644 --- a/devtools/client/inspector/computed/test/browser_computed_keybindings_01.js +++ b/devtools/client/inspector/computed/test/browser_computed_keybindings_01.js @@ -83,7 +83,7 @@ function checkHelpLinkKeybinding(view) { info('Check that MDN link is opened on "F1"'); const propView = getFirstVisiblePropertyView(view); return new Promise(resolve => { - propView.mdnLinkClick = function (event) { + propView.mdnLinkClick = function () { ok(true, "Pressing F1 opened the MDN link"); resolve(); }; diff --git a/devtools/client/inspector/flexbox/components/FlexItemSizingProperties.js b/devtools/client/inspector/flexbox/components/FlexItemSizingProperties.js index 00bea31e57..ad26d3beab 100644 --- a/devtools/client/inspector/flexbox/components/FlexItemSizingProperties.js +++ b/devtools/client/inspector/flexbox/components/FlexItemSizingProperties.js @@ -90,12 +90,10 @@ class FlexItemSizingProperties extends PureComponent { * The name for this CSS property * @param {String} value * The property value - * @param {Booleam} isDefaultValue - * Whether the value come from the browser default style * @return {Object} * The React component representing this CSS property */ - renderCssProperty(name, value, isDefaultValue) { + renderCssProperty(name, value) { return dom.span({ className: "css-property-link" }, `(${name}: ${value})`); } @@ -115,7 +113,7 @@ class FlexItemSizingProperties extends PureComponent { ); } - renderBaseSizeSection({ mainBaseSize, clampState }, properties, dimension) { + renderBaseSizeSection({ mainBaseSize }, properties, dimension) { const flexBasisValue = properties["flex-basis"]; const dimensionValue = properties[dimension]; diff --git a/devtools/client/inspector/flexbox/reducers/flexbox.js b/devtools/client/inspector/flexbox/reducers/flexbox.js index 856294a549..46c1d4525c 100644 --- a/devtools/client/inspector/flexbox/reducers/flexbox.js +++ b/devtools/client/inspector/flexbox/reducers/flexbox.js @@ -58,7 +58,7 @@ const INITIAL_FLEXBOX = { }; const reducers = { - [CLEAR_FLEXBOX](flexbox, _) { + [CLEAR_FLEXBOX](_) { return INITIAL_FLEXBOX; }, diff --git a/devtools/client/inspector/fonts/reducers/font-editor.js b/devtools/client/inspector/fonts/reducers/font-editor.js index b40fff4ba1..fbfee2d666 100644 --- a/devtools/client/inspector/fonts/reducers/font-editor.js +++ b/devtools/client/inspector/fonts/reducers/font-editor.js @@ -62,7 +62,7 @@ const reducers = { return newState; }, - [RESET_EDITOR](state) { + [RESET_EDITOR]() { return { ...INITIAL_STATE }; }, diff --git a/devtools/client/inspector/grids/components/GridOutline.js b/devtools/client/inspector/grids/components/GridOutline.js index 65771f3f45..2a7a195bd0 100644 --- a/devtools/client/inspector/grids/components/GridOutline.js +++ b/devtools/client/inspector/grids/components/GridOutline.js @@ -344,7 +344,7 @@ class GridOutline extends PureComponent { ); } - renderGridOutlineBorder(borderWidth, borderHeight, color) { + renderGridOutlineBorder(borderWidth, borderHeight) { return dom.rect({ key: "border", className: "grid-outline-border", diff --git a/devtools/client/inspector/markup/markup.js b/devtools/client/inspector/markup/markup.js index 5d10b003c9..7975d442f8 100644 --- a/devtools/client/inspector/markup/markup.js +++ b/devtools/client/inspector/markup/markup.js @@ -1218,19 +1218,15 @@ MarkupView.prototype = { } else if (type == "idref") { // Select the node in the same document. nodeFront.walkerFront - .document(nodeFront) - .then(doc => { - return nodeFront.walkerFront - .querySelector(doc, "#" + CSS.escape(link)) - .then(node => { - if (!node) { - this.emit("idref-attribute-link-failed"); - return; - } - this.inspector.selection.setNodeFront(node, { - reason: "markup-attribute-link", - }); - }); + .getIdrefNode(nodeFront, CSS.escape(link)) + .then(node => { + if (!node) { + this.emitForTests("idref-attribute-link-failed"); + return; + } + this.inspector.selection.setNodeFront(node, { + reason: "markup-attribute-link", + }); }) .catch(console.error); } @@ -1555,7 +1551,7 @@ MarkupView.prototype = { } }, - _onTargetAvailable({ targetFront }) {}, + _onTargetAvailable() {}, _onTargetDestroyed({ targetFront, isModeSwitching }) { // Bug 1776250: We only watch targets in order to update containers which @@ -2103,14 +2099,12 @@ MarkupView.prototype = { * Mark the given node selected, and update the inspector.selection * object's NodeFront to keep consistent state between UI and selection. * - * @param {NodeFront} aNode + * @param {NodeFront} node * The NodeFront to mark as selected. - * @param {String} reason - * The reason for marking the node as selected. * @return {Boolean} False if the node is already marked as selected, true * otherwise. */ - markNodeAsSelected(node, reason = "nodeselected") { + markNodeAsSelected(node) { const container = this.getContainer(node); return this._markContainerAsSelected(container); }, diff --git a/devtools/client/inspector/markup/test/browser.toml b/devtools/client/inspector/markup/test/browser.toml index 0b566f5e18..4f08fd10f2 100644 --- a/devtools/client/inspector/markup/test/browser.toml +++ b/devtools/client/inspector/markup/test/browser.toml @@ -1,5 +1,4 @@ [DEFAULT] -prefs = ["devtools.chrome.enabled=false"] # Bug 1520383 - Force devtools.chrome.enabled to false regardless of whether we're in an official build so we don't show event bubbles from chrome event listeners in the inspector on unprivileged test pages. tags = "devtools" subsuite = "devtools" support-files = [ @@ -76,6 +75,7 @@ support-files = [ "lib_react_with_addons_15.3.1_min.js", "lib_react_with_addons_15.4.1.js", "react_external_listeners.js", + "resources/*", "shadowdom_open_debugger.min.js", "!/devtools/client/debugger/test/mochitest/shared-head.js", "!/devtools/client/inspector/test/head.js", diff --git a/devtools/client/inspector/markup/test/browser_markup_events_03.js b/devtools/client/inspector/markup/test/browser_markup_events_03.js index bebffec066..b0de4561e0 100644 --- a/devtools/client/inspector/markup/test/browser_markup_events_03.js +++ b/devtools/client/inspector/markup/test/browser_markup_events_03.js @@ -17,7 +17,7 @@ const TEST_DATA = [ expected: [ { type: "click", - filename: TEST_URL + ":69:17", + filename: TEST_URL + ":70:17", attributes: ["Bubbling"], handler: "es6Method(foo, bar) {\n" + ' alert("obj.es6Method");\n' + "}", @@ -29,7 +29,7 @@ const TEST_DATA = [ expected: [ { type: "click", - filename: TEST_URL + ":89:25", + filename: TEST_URL + ":91:25", attributes: ["Bubbling"], handler: "function* generator() {\n" + ' alert("generator");\n' + "}", }, @@ -40,7 +40,7 @@ const TEST_DATA = [ expected: [ { type: "click", - filename: TEST_URL + ":46:58", + filename: TEST_URL + ":47:58", attributes: ["Bubbling"], handler: "function*() {\n" + ' alert("anonGenerator");\n' + "}", }, diff --git a/devtools/client/inspector/markup/test/browser_markup_links_07.js b/devtools/client/inspector/markup/test/browser_markup_links_07.js index 2a86f3b1d9..830d370b03 100644 --- a/devtools/client/inspector/markup/test/browser_markup_links_07.js +++ b/devtools/client/inspector/markup/test/browser_markup_links_07.js @@ -7,6 +7,7 @@ // do follows the link. const TEST_URL = URL_ROOT_SSL + "doc_markup_links.html"; +const TEST_URL_BASE = URL_ROOT_SSL + "resources/doc_markup_links_base.html"; add_task(async function () { const { inspector } = await openInspectorForURL(TEST_URL); @@ -70,6 +71,31 @@ add_task(async function () { await followLinkNoNewNode(linkEl, true, inspector); }); +add_task(async function testDocumentWithBaseAttribute() { + const { inspector } = await openInspectorForURL(TEST_URL_BASE); + + info("Select a node with a URI attribute"); + await selectNode("img", inspector); + + info("Find the link element from the markup-view"); + const { editor } = await getContainerForSelector("img", inspector); + const linkEl = editor.attrElements.get("src").querySelector(".link"); + + info("Follow the link with middle-click and wait for the new tab to open"); + await followLinkWaitForTab( + linkEl, + false, + URL_ROOT_SSL + "doc_markup_tooltip.png" + ); + + info("Follow the link with meta/ctrl-click and wait for the new tab to open"); + await followLinkWaitForTab( + linkEl, + true, + URL_ROOT_SSL + "doc_markup_tooltip.png" + ); +}); + function performMouseDown(linkEl, metactrl) { const evt = linkEl.ownerDocument.createEvent("MouseEvents"); diff --git a/devtools/client/inspector/markup/test/browser_markup_links_aria_attributes.js b/devtools/client/inspector/markup/test/browser_markup_links_aria_attributes.js index 1f50ae6b88..6d02f214ae 100644 --- a/devtools/client/inspector/markup/test/browser_markup_links_aria_attributes.js +++ b/devtools/client/inspector/markup/test/browser_markup_links_aria_attributes.js @@ -16,42 +16,84 @@ const TEST_DATA = [ { selector: "#aria-activedescendant", attributeName: "aria-activedescendant", - links: ["activedescendant01"], + links: [{ id: "activedescendant01" }], }, { selector: "#aria-controls", attributeName: "aria-controls", - links: ["controls01", "controls02"], + links: [{ id: "controls01" }, { id: "controls02" }], }, { selector: "#aria-describedby", attributeName: "aria-describedby", - links: ["describedby01", "describedby02"], + links: [{ id: "describedby01" }, { id: "describedby02" }], }, { selector: "#aria-details", attributeName: "aria-details", - links: ["details01", "details02"], + links: [{ id: "details01" }, { id: "details02" }], }, { selector: "#aria-errormessage", attributeName: "aria-errormessage", - links: ["errormessage01"], + links: [{ id: "errormessage01" }], }, { selector: "#aria-flowto", attributeName: "aria-flowto", - links: ["flowto01", "flowto02"], + links: [{ id: "flowto01" }, { id: "flowto02" }], }, { selector: "#aria-labelledby", attributeName: "aria-labelledby", - links: ["labelledby01", "labelledby02"], + links: [{ id: "labelledby01" }, { id: "labelledby02" }], }, { selector: "#aria-owns", attributeName: "aria-owns", - links: ["owns01", "owns02"], + links: [{ id: "owns01" }, { id: "owns02" }], + }, + { + getContainer: async inspector => { + info("Find and expand the test-component shadow DOM host."); + const hostFront = await getNodeFront("test-component", inspector); + const hostContainer = inspector.markup.getContainer(hostFront); + await expandContainer(inspector, hostContainer); + + info("Expand the shadow root"); + const shadowRootContainer = hostContainer.getChildContainers()[0]; + await expandContainer(inspector, shadowRootContainer); + + info("Expand the slot"); + const slotContainer = shadowRootContainer.getChildContainers()[0]; + + is( + slotContainer.elt + .querySelector(`[data-attr="id"]`) + .getAttribute("data-value"), + "aria-describedby-shadow-dom", + `This is the container for button#aria-describedby-shadow-dom` + ); + + // The test expect the node to be selected + const updated = inspector.once("inspector-updated"); + inspector.selection.setNodeFront(slotContainer.node, { reason: "test" }); + await updated; + + return slotContainer; + }, + attributeName: "aria-describedby", + links: [{ id: "describedby01", valid: false }, { id: "describedbyshadow" }], + }, + { + selector: "#empty-attributes", + attributeName: "aria-activedescendant", + links: [], + }, + { + selector: "#empty-attributes", + attributeName: "aria-details", + links: [], }, ]; @@ -59,11 +101,16 @@ add_task(async function () { const { inspector } = await openInspectorForURL(TEST_URL); for (const test of TEST_DATA) { - info("Selecting test node " + test.selector); - await selectNode(test.selector, inspector); + let editor; + if (typeof test.getContainer === "function") { + ({ editor } = await test.getContainer(inspector)); + } else { + info("Selecting test node " + test.selector); + await selectNode(test.selector, inspector); + info("Finding the popupNode to anchor the context-menu to"); + ({ editor } = await getContainerForSelector(test.selector, inspector)); + } - info("Finding the popupNode to anchor the context-menu to"); - const { editor } = await getContainerForSelector(test.selector, inspector); const attributeEl = editor.attrElements.get(test.attributeName); const linksEl = attributeEl.querySelectorAll(".link"); @@ -79,8 +126,6 @@ add_task(async function () { const linkEl = linksEl[i]; ok(linkEl, "Found the link"); - const expectedReferencedNodeId = test.links[i]; - info("Simulating a context click on the link"); const allMenuItems = openContextMenuAndGetAllItems(inspector, { target: linkEl, @@ -95,6 +140,7 @@ add_task(async function () { is(linkFollow.visible, true, "The follow-link item is visible"); is(linkCopy.visible, false, "The copy-link item is not visible"); + const { id: expectedReferencedNodeId } = test.links[i]; const linkFollowItemLabel = INSPECTOR_L10N.getFormatStr( "inspector.menu.selectElement.label", expectedReferencedNodeId @@ -114,16 +160,32 @@ add_task(async function () { "Button has expected title" ); - info("Check that clicking on button selects the associated node"); - const onSelection = inspector.selection.once("new-node-front"); - buttonEl.click(); - await onSelection; - - is( - inspector.selection.nodeFront.id, - expectedReferencedNodeId, - "The expected new node was selected" - ); + if (test.links[i].valid !== false) { + info("Check that clicking on button selects the associated node"); + const onSelection = inspector.selection.once("new-node-front"); + buttonEl.click(); + await onSelection; + + is( + inspector.selection.nodeFront.id, + expectedReferencedNodeId, + "The expected new node was selected" + ); + } else { + info( + "Check that clicking on button triggers idref-attribute-link-failed event" + ); + const onIdrefAttributeLinkFailed = inspector.markup.once( + "idref-attribute-link-failed" + ); + const onSelection = inspector.selection.once("new-node-front"); + const onTimeout = wait(500).then(() => "TIMEOUT"); + buttonEl.click(); + await onIdrefAttributeLinkFailed; + ok(true, "Got expected idref-attribute-link-failed event"); + const res = await Promise.race([onSelection, onTimeout]); + is(res, "TIMEOUT", "Clicking the button did not select a new node"); + } } } }); diff --git a/devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js b/devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js index 38f7361725..563863d614 100644 --- a/devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js +++ b/devtools/client/inspector/markup/test/browser_markup_tag_edit_07.js @@ -59,7 +59,7 @@ var TEST_DATA = [ expectedAttributes: { style: DATA_URL_INLINE_STYLE, }, - validate: (container, inspector) => { + validate: container => { const editor = container.editor; const visibleAttrText = editor.attrElements .get("style") @@ -75,7 +75,7 @@ var TEST_DATA = [ expectedAttributes: { "data-long": LONG_ATTRIBUTE, }, - validate: (container, inspector) => { + validate: container => { const editor = container.editor; const visibleAttrText = editor.attrElements .get("data-long") @@ -91,7 +91,7 @@ var TEST_DATA = [ expectedAttributes: { src: DATA_URL_ATTRIBUTE, }, - validate: (container, inspector) => { + validate: container => { const editor = container.editor; const visibleAttrText = editor.attrElements .get("src") @@ -107,17 +107,17 @@ var TEST_DATA = [ expectedAttributes: { "data-long": LONG_ATTRIBUTE, }, - setUp(inspector) { + setUp() { Services.prefs.setBoolPref("devtools.markup.collapseAttributes", false); }, - validate: (container, inspector) => { + validate: container => { const editor = container.editor; const visibleAttrText = editor.attrElements .get("data-long") .querySelector(".attr-value").textContent; is(visibleAttrText, LONG_ATTRIBUTE); }, - tearDown(inspector) { + tearDown() { Services.prefs.clearUserPref("devtools.markup.collapseAttributes"); }, }, @@ -127,10 +127,10 @@ var TEST_DATA = [ expectedAttributes: { "data-long": LONG_ATTRIBUTE, }, - setUp(inspector) { + setUp() { Services.prefs.setIntPref("devtools.markup.collapseAttributeLength", 2); }, - validate: (container, inspector) => { + validate: container => { const firstChar = LONG_ATTRIBUTE[0]; const lastChar = LONG_ATTRIBUTE[LONG_ATTRIBUTE.length - 1]; const collapsed = firstChar + "\u2026" + lastChar; @@ -140,7 +140,7 @@ var TEST_DATA = [ .querySelector(".attr-value").textContent; is(visibleAttrText, collapsed); }, - tearDown(inspector) { + tearDown() { Services.prefs.clearUserPref("devtools.markup.collapseAttributeLength"); }, }, diff --git a/devtools/client/inspector/markup/test/doc_markup_events_03.html b/devtools/client/inspector/markup/test/doc_markup_events_03.html index a0c067e33e..deb3730d32 100644 --- a/devtools/client/inspector/markup/test/doc_markup_events_03.html +++ b/devtools/client/inspector/markup/test/doc_markup_events_03.html @@ -43,6 +43,7 @@ generatorNode.addEventListener("click", generator); const anonGenerator = document.getElementById("anon-generator"); + // eslint-disable-next-line require-yield anonGenerator.addEventListener("click", function* () { alert("anonGenerator"); }); @@ -86,6 +87,7 @@ } }; + // eslint-disable-next-line require-yield function* generator() { alert("generator"); } diff --git a/devtools/client/inspector/markup/test/doc_markup_links_aria_attributes.html b/devtools/client/inspector/markup/test/doc_markup_links_aria_attributes.html index 0e3bf0a57f..d4fc13042f 100644 --- a/devtools/client/inspector/markup/test/doc_markup_links_aria_attributes.html +++ b/devtools/client/inspector/markup/test/doc_markup_links_aria_attributes.html @@ -3,6 +3,24 @@ <head> <meta charset="utf-8"> <title>Markup-view Linkify ARIA attributes</title> + <script> + "use strict"; + class TestComponent extends HTMLElement { + constructor() { + super(); + this.attachShadow({mode: 'open'}); + + this.shadowRoot.innerHTML = ` + <button + id="aria-describedby-shadow-dom" + aria-describedby="describedby01 describedbyshadow" + ></button> + <div id="describedbyshadow">#describedbyshadow</div> + `; + } + } + customElements.define('test-component', TestComponent); + </script> </head> <body> <div id="aria-activedescendant" @@ -40,5 +58,9 @@ <div id="aria-owns" aria-owns="owns01 owns02">aria-owns test</div> <div id="owns01">#owns01</div> <div id="owns02">#owns02</div> + + <test-component></test-component> + + <div id="empty-attributes" aria-activedescendant=" " aria-details=" "></div> </body> </html> diff --git a/devtools/client/inspector/markup/test/resources/doc_markup_links_base.html b/devtools/client/inspector/markup/test/resources/doc_markup_links_base.html new file mode 100644 index 0000000000..55b5350ab5 --- /dev/null +++ b/devtools/client/inspector/markup/test/resources/doc_markup_links_base.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Markup-view links with base attribute</title> + <base href="../"> + </head> + <body> + <img src="doc_markup_tooltip.png"> + Test relative links with base attributes. + </body> +</html> diff --git a/devtools/client/inspector/markup/views/element-editor.js b/devtools/client/inspector/markup/views/element-editor.js index f538c2f6a9..c7e47c0a7c 100644 --- a/devtools/client/inspector/markup/views/element-editor.js +++ b/devtools/client/inspector/markup/views/element-editor.js @@ -878,7 +878,7 @@ ElementEditor.prototype = { // Create links in the attribute value, and truncate long attribute values if needed. for (const token of parsedLinksData) { - if (token.type === "string") { + if (token.type === "string" || token.value?.trim() === "") { attributeValueEl.appendChild( this.doc.createTextNode(this._truncateAttributeValue(token.value)) ); diff --git a/devtools/client/inspector/node-picker.js b/devtools/client/inspector/node-picker.js index 24b53b51e0..ca837b12f1 100644 --- a/devtools/client/inspector/node-picker.js +++ b/devtools/client/inspector/node-picker.js @@ -22,11 +22,9 @@ loader.lazyRequireGetter( * * @param {Commands} commands * The commands object with all interfaces defined from devtools/shared/commands/ - * @param {Selection} selection - * The global Selection object */ class NodePicker extends EventEmitter { - constructor(commands, selection) { + constructor(commands) { super(); this.commands = commands; this.targetCommand = commands.targetCommand; @@ -305,7 +303,7 @@ class NodePicker extends EventEmitter { * When the picker is canceled, stop the picker, and make sure the toolbox * gets the focus. */ - #onCanceled = data => { + #onCanceled = () => { return this.stop({ canceled: true }); }; } diff --git a/devtools/client/inspector/rules/test/browser_rules_colorpicker-contrast-ratio.js b/devtools/client/inspector/rules/test/browser_rules_colorpicker-contrast-ratio.js index 6bdb9dd9d3..42a0f86904 100644 --- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-contrast-ratio.js +++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-contrast-ratio.js @@ -122,11 +122,7 @@ async function checkColorPickerConstrastData({ expectedContrastValueScore, expectContrastRange = false, expectedMinContrastValueResult, - expectedMinContrastValueTitle, - expectedMinContrastValueScore, expectedMaxContrastValueResult, - expectedMaxContrastValueTitle, - expectedMaxContrastValueScore, }) { info(`Checking color picker: "${label}"`); const cPicker = view.tooltips.getTooltip("colorPicker"); diff --git a/devtools/client/inspector/rules/test/browser_rules_container-queries.js b/devtools/client/inspector/rules/test/browser_rules_container-queries.js index 1a1857be05..0e866c2a7a 100644 --- a/devtools/client/inspector/rules/test/browser_rules_container-queries.js +++ b/devtools/client/inspector/rules/test/browser_rules_container-queries.js @@ -264,13 +264,12 @@ async function assertQueryContainerTooltip({ expectedHeaderText, expectedBodyText, }) { - const tooltipTriggerEl = getRuleViewAncestorRulesDataElementByIndex( - view, - ruleIndex - ).querySelector(".container-query-declaration"); + const parent = getRuleViewAncestorRulesDataElementByIndex(view, ruleIndex); + const highlighterTriggerEl = parent.querySelector(".open-inspector"); + const tooltipTriggerEl = parent.querySelector(".container-query-declaration"); // Ensure that the element can be targetted from EventUtils. - tooltipTriggerEl.scrollIntoView(); + parent.scrollIntoView(); const { waitForHighlighterTypeShown, waitForHighlighterTypeHidden } = getHighlighterTestHelpers(inspector); @@ -280,17 +279,35 @@ async function assertQueryContainerTooltip({ ); const tooltip = view.tooltips.getTooltip("interactiveTooltip"); + + info("synthesizing mousemove on open-inspector icon: " + tooltip.isVisible()); + EventUtils.synthesizeMouseAtCenter( + highlighterTriggerEl, + { type: "mousemove" }, + highlighterTriggerEl.ownerDocument.defaultView + ); + + await onNodeHighlight; + info("node was highlighted"); + + const onNodeUnhighlight = waitForHighlighterTypeHidden( + inspector.highlighters.TYPES.BOXMODEL + ); + const onTooltipReady = tooltip.once("shown"); - info("synthesizing mousemove: " + tooltip.isVisible()); + + info("synthesizing mousemove on tooltip el: " + tooltip.isVisible()); EventUtils.synthesizeMouseAtCenter( tooltipTriggerEl, { type: "mousemove" }, tooltipTriggerEl.ownerDocument.defaultView ); + await onTooltipReady; info("tooltip was shown"); - await onNodeHighlight; - info("node was highlighted"); + + await onNodeUnhighlight; + info("highlighter was hidden"); is( tooltip.panel.querySelector("header").textContent, @@ -305,9 +322,7 @@ async function assertQueryContainerTooltip({ info("Hide the tooltip"); const onHidden = tooltip.once("hidden"); - const onNodeUnhighlight = waitForHighlighterTypeHidden( - inspector.highlighters.TYPES.BOXMODEL - ); + // Move the mouse elsewhere to hide the tooltip EventUtils.synthesizeMouse( tooltipTriggerEl.ownerDocument.body, @@ -317,5 +332,4 @@ async function assertQueryContainerTooltip({ tooltipTriggerEl.ownerDocument.defaultView ); await onHidden; - await onNodeUnhighlight; } diff --git a/devtools/client/inspector/rules/test/browser_rules_edit-size-property-dragging.js b/devtools/client/inspector/rules/test/browser_rules_edit-size-property-dragging.js index c95506de50..a10e7a6625 100644 --- a/devtools/client/inspector/rules/test/browser_rules_edit-size-property-dragging.js +++ b/devtools/client/inspector/rules/test/browser_rules_edit-size-property-dragging.js @@ -335,12 +335,11 @@ async function runIncrementTest(editor, view, tests) { * @param {String} options.description * @param {Boolean} options.ctrl Small increment key * @param {Boolean} options.alt Small increment key for macosx - * @param {Boolean} option.deadzoneIncluded True if the provided distance + * @param {Boolean} options.deadzoneIncluded True if the provided distance * accounts for the deadzone. When false, the deadzone will automatically * be added to the distance. - * @param {CSSRuleView} view */ -async function testIncrement(editor, options, view) { +async function testIncrement(editor, options) { info("Running subtest: " + options.description); editor.valueSpan.scrollIntoView(); diff --git a/devtools/client/inspector/rules/test/browser_rules_large_base64_background_image.js b/devtools/client/inspector/rules/test/browser_rules_large_base64_background_image.js index 0373d29321..717cc9bfb5 100644 --- a/devtools/client/inspector/rules/test/browser_rules_large_base64_background_image.js +++ b/devtools/client/inspector/rules/test/browser_rules_large_base64_background_image.js @@ -43,10 +43,20 @@ add_task(async function () { const { inspector } = await openInspectorForURL(TEST_URL); const view = selectRuleView(inspector); - await selectNode("body", inspector); - - const propertyValues = view.styleDocument.querySelectorAll( - ".ruleview-propertyvalue" + let propertyValues; + await waitFor( + async () => { + await selectNode("body", inspector); + propertyValues = view.styleDocument.querySelectorAll( + ".ruleview-propertyvalue" + ); + return propertyValues.length == 2; + }, + "Timed out while waiting for body element properties", + // Use default interval. + 10, + // reduce maxTries to 50 since `selectNode` is already async. + 50 ); is(propertyValues.length, 2, "Ruleview has 2 propertyvalue elements"); diff --git a/devtools/client/inspector/rules/test/browser_rules_original-source-link.js b/devtools/client/inspector/rules/test/browser_rules_original-source-link.js index 9d440659a2..473d0037b0 100644 --- a/devtools/client/inspector/rules/test/browser_rules_original-source-link.js +++ b/devtools/client/inspector/rules/test/browser_rules_original-source-link.js @@ -64,7 +64,7 @@ async function testClickingLink(toolbox, view) { function waitForOriginalStyleSheetEditorSelection(toolbox) { const panel = toolbox.getCurrentPanel(); - return new Promise((resolve, reject) => { + return new Promise(resolve => { const maybeContinue = editor => { // The style editor selects the first sheet at first load before // selecting the desired sheet. diff --git a/devtools/client/inspector/rules/test/browser_rules_original-source-link2.js b/devtools/client/inspector/rules/test/browser_rules_original-source-link2.js index 87963f9ec5..6e8faecc33 100644 --- a/devtools/client/inspector/rules/test/browser_rules_original-source-link2.js +++ b/devtools/client/inspector/rules/test/browser_rules_original-source-link2.js @@ -61,7 +61,7 @@ async function testClickingLink(toolbox, view) { function waitForOriginalStyleSheetEditorSelection(toolbox) { const panel = toolbox.getCurrentPanel(); - return new Promise((resolve, reject) => { + return new Promise(resolve => { const maybeContinue = editor => { // The style editor selects the first sheet at first load before // selecting the desired sheet. diff --git a/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js b/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js index f170cf1591..fcd0302624 100644 --- a/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js +++ b/devtools/client/inspector/rules/test/browser_rules_pseudo-element_01.js @@ -11,6 +11,7 @@ const PSEUDO_PREF = "devtools.inspector.show_pseudo_elements"; add_task(async function () { await pushPref(PSEUDO_PREF, true); await pushPref("dom.customHighlightAPI.enabled", true); + await pushPref("layout.css.modern-range-pseudos.enabled", true); await addTab(TEST_URI); const { inspector, view } = await openRuleView(); @@ -24,6 +25,7 @@ add_task(async function () { await testList(inspector, view); await testDialogBackdrop(inspector, view); await testCustomHighlight(inspector, view); + await testSlider(inspector, view); }); async function testTopLeft(inspector, view) { @@ -344,6 +346,36 @@ async function testCustomHighlight(inspector, view) { assertGutters(view); } +async function testSlider(inspector, view) { + await assertPseudoElementRulesNumbers( + "input[type=range].slider", + inspector, + view, + { + elementRulesNb: 3, + sliderFillRulesNb: 1, + sliderThumbRulesNb: 1, + sliderTrackRulesNb: 1, + } + ); + assertGutters(view); + + info( + "Check that ::slider-* pseudo elements are not displayed for non-range inputs" + ); + await assertPseudoElementRulesNumbers( + "input[type=text].slider", + inspector, + view, + { + elementRulesNb: 3, + sliderFillRulesNb: 0, + sliderThumbRulesNb: 0, + sliderTrackRulesNb: 0, + } + ); +} + function convertTextPropsToString(textProps) { return textProps .map( @@ -395,6 +427,15 @@ async function assertPseudoElementRulesNumbers( highlightRules: elementStyle.rules.filter(rule => rule.pseudoElement?.startsWith("::highlight(") ), + sliderFillRules: elementStyle.rules.filter( + rule => rule.pseudoElement === "::slider-fill" + ), + sliderThumbRules: elementStyle.rules.filter( + rule => rule.pseudoElement === "::slider-thumb" + ), + sliderTrackRules: elementStyle.rules.filter( + rule => rule.pseudoElement === "::slider-track" + ), }; is( @@ -437,6 +478,21 @@ async function assertPseudoElementRulesNumbers( ruleNbs.highlightRulesNb || 0, selector + " has the correct number of ::highlight rules" ); + is( + rules.sliderFillRules.length, + ruleNbs.sliderFillRulesNb || 0, + selector + " has the correct number of ::slider-fill rules" + ); + is( + rules.sliderThumbRules.length, + ruleNbs.sliderThumbRulesNb || 0, + selector + " has the correct number of ::slider-thumb rules" + ); + is( + rules.sliderTrackRules.length, + ruleNbs.sliderTrackRulesNb || 0, + selector + " has the correct number of ::slider-track rules" + ); // If we do have pseudo element rules displayed, ensure we don't mark their selectors // as matched or unmatched diff --git a/devtools/client/inspector/rules/test/doc_pseudoelement.html b/devtools/client/inspector/rules/test/doc_pseudoelement.html index a6251c613c..8e077e220b 100644 --- a/devtools/client/inspector/rules/test/doc_pseudoelement.html +++ b/devtools/client/inspector/rules/test/doc_pseudoelement.html @@ -133,7 +133,15 @@ dialog::backdrop { } } - +input::slider-fill { + background: tomato; +} +input::slider-thumb { + background: gold; +} +input::slider-track { + background: seagreen; +} </style> </head> <body> @@ -161,6 +169,9 @@ dialog::backdrop { <dialog>In dialog</dialog> + <label>Range <input type="range" class="slider"></label> + <label>Not range <input type="text" class="slider"></label> + <section class="highlights-container"> Firefox Developer Tools is a set of web developer tools built into Firefox. You can use them to examine, edit, and debug HTML, CSS, and JavaScript. diff --git a/devtools/client/inspector/rules/views/rule-editor.js b/devtools/client/inspector/rules/views/rule-editor.js index 93e24f0946..a5717976d0 100644 --- a/devtools/client/inspector/rules/views/rule-editor.js +++ b/devtools/client/inspector/rules/views/rule-editor.js @@ -410,7 +410,7 @@ RuleEditor.prototype = { this._ruleViewIsEditing = this.ruleView.isEditing; }); - code.addEventListener("click", event => { + code.addEventListener("click", () => { const selection = this.doc.defaultView.getSelection(); if (selection.isCollapsed && !this._ruleViewIsEditing) { this.newProperty(); @@ -905,10 +905,8 @@ RuleEditor.prototype = { * True if the change should be applied. * @param {Number} direction * The move focus direction number. - * @param {Number} key - * The event keyCode that trigger the editor to close */ - async _onSelectorDone(value, commit, direction, key) { + async _onSelectorDone(value, commit, direction) { if ( !commit || this.isEditing || diff --git a/devtools/client/inspector/rules/views/text-property-editor.js b/devtools/client/inspector/rules/views/text-property-editor.js index 8546417cfb..edcdb856a8 100644 --- a/devtools/client/inspector/rules/views/text-property-editor.js +++ b/devtools/client/inspector/rules/views/text-property-editor.js @@ -385,7 +385,7 @@ TextPropertyEditor.prototype = { } }); - this.valueSpan.addEventListener("mouseup", event => { + this.valueSpan.addEventListener("mouseup", () => { // if we have dragged, we will handle the pending click in _draggingOnMouseUp instead if (this._hasDragged) { return; @@ -1146,10 +1146,8 @@ TextPropertyEditor.prototype = { * True if the change should be applied. * @param {Number} direction * The move focus direction number. - * @param {Number} key - * The event keyCode that trigger the editor to close */ - _onNameDone(value, commit, direction, key) { + _onNameDone(value, commit, direction) { const isNameUnchanged = (!commit && !this.ruleEditor.isEditing) || this.committed.name === value; if (this.prop.value && isNameUnchanged) { @@ -1233,10 +1231,8 @@ TextPropertyEditor.prototype = { * True if the change should be applied. * @param {Number} direction * The move focus direction number. - * @param {Number} key - * The event keyCode that trigger the editor to close */ - _onValueDone(value = "", commit, direction, key) { + _onValueDone(value = "", commit, direction) { const parsedProperties = this._getValueAndExtraProperties(value); const val = parseSingleValue( this.cssProperties.isKnown, diff --git a/devtools/client/inspector/shared/highlighters-overlay.js b/devtools/client/inspector/shared/highlighters-overlay.js index 6082b8b842..7f44f8b555 100644 --- a/devtools/client/inspector/shared/highlighters-overlay.js +++ b/devtools/client/inspector/shared/highlighters-overlay.js @@ -793,13 +793,8 @@ class HighlightersOverlay { /** * Called after the shapes highlighter was hidden. - * - * @param {Object} data - * Data associated with the event. - * Contains: - * - {NodeFront} node: The NodeFront of the element that was highlighted. */ - onShapesHighlighterHidden(data) { + onShapesHighlighterHidden() { this.emit( "shapes-highlighter-hidden", this.shapesHighlighterShown, @@ -1178,7 +1173,7 @@ class HighlightersOverlay { async restoreParentGridHighlighter(node) { // Find the highlighter map entry for the subgrid whose parent grid is the given node. const entry = Array.from(this.gridHighlighters.entries()).find( - ([key, value]) => { + ([, value]) => { return value?.parentGridNode === node; } ); diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-autohide-config_03.js b/devtools/client/inspector/test/browser_inspector_highlighter-autohide-config_03.js index 188b99a7cb..e90bd87ad0 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-autohide-config_03.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-autohide-config_03.js @@ -60,7 +60,7 @@ add_task(async function () { somehow not overwritten and fires another "highlighter-hidden" event. */ let wasEmitted = false; - const waitForExtraEvent = new Promise((resolve, reject) => { + const waitForExtraEvent = new Promise(resolve => { const _handler = () => { wasEmitted = true; resolve(); diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js b/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js index 0c05aa219f..5fa5567e3f 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-events.js @@ -60,10 +60,10 @@ const MOVE_EVENTS_DATA = [ // Mouse initialization for right snapping { type: "mouse", - x: (width, height) => width - 5, + x: width => width - 5, y: 0, expected: { - x: (width, height) => width - 5, + x: width => width - 5, y: 0, }, }, @@ -73,7 +73,7 @@ const MOVE_EVENTS_DATA = [ key: "VK_RIGHT", shift: true, expected: { - x: (width, height) => width, + x: width => width, y: 0, }, desc: "Right snapping to x=max window width available", diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js b/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js index d9413e5d39..37d3070c04 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-eyedropper-label.js @@ -65,14 +65,14 @@ const TEST_DATA = [ }, { desc: "Move the mouse to the top left", - getCoordinates: (width, height) => { + getCoordinates: () => { return { x: 0, y: 0 }; }, expectedPositions: { top: false, right: true, left: false }, }, { desc: "Move the mouse to the top right", - getCoordinates: (width, height) => { + getCoordinates: width => { return { x: width, y: 0 }; }, expectedPositions: { top: false, right: false, left: true }, diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js b/devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js index c50dee30b0..bfdfd12cd8 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-geometry_01.js @@ -58,7 +58,6 @@ async function hasArrowsAndLabelsAndHandlers({ getElementAttribute }) { async function isHiddenForNonPositionedNonSizedElement({ show, - hide, isElementHidden, }) { info("Asking to show the highlighter on an inline, non p ositioned element"); diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-measure_03.js b/devtools/client/inspector/test/browser_inspector_highlighter-measure_03.js index 906284ba86..dbe70d83ae 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-measure_03.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-measure_03.js @@ -16,10 +16,10 @@ const WIDTH = 160; const HEIGHT = 100; const HANDLER_MAP = { - top(areaWidth, areaHeight) { + top(areaWidth) { return { x: Math.round(areaWidth / 2), y: 0 }; }, - topright(areaWidth, areaHeight) { + topright(areaWidth) { return { x: areaWidth, y: 0 }; }, right(areaWidth, areaHeight) { @@ -37,7 +37,7 @@ const HANDLER_MAP = { left(areaWidth, areaHeight) { return { x: 0, y: Math.round(areaHeight / 2) }; }, - topleft(areaWidth, areaHeight) { + topleft() { return { x: 0, y: 0 }; }, }; diff --git a/devtools/client/inspector/test/browser_inspector_highlighter-measure_04.js b/devtools/client/inspector/test/browser_inspector_highlighter-measure_04.js index d9dcd5d89f..8493981dd3 100644 --- a/devtools/client/inspector/test/browser_inspector_highlighter-measure_04.js +++ b/devtools/client/inspector/test/browser_inspector_highlighter-measure_04.js @@ -18,10 +18,10 @@ const X_OFFSET = 15; const Y_OFFSET = 10; const HANDLER_MAP = { - top(areaWidth, areaHeight) { + top(areaWidth) { return { x: Math.round(areaWidth / 2), y: 0 }; }, - topright(areaWidth, areaHeight) { + topright(areaWidth) { return { x: areaWidth, y: 0 }; }, right(areaWidth, areaHeight) { @@ -39,7 +39,7 @@ const HANDLER_MAP = { left(areaWidth, areaHeight) { return { x: 0, y: Math.round(areaHeight / 2) }; }, - topleft(areaWidth, areaHeight) { + topleft() { return { x: 0, y: 0 }; }, }; diff --git a/devtools/client/inspector/test/browser_inspector_sidebarstate.js b/devtools/client/inspector/test/browser_inspector_sidebarstate.js index 396e78c91f..6ccc6df6f4 100644 --- a/devtools/client/inspector/test/browser_inspector_sidebarstate.js +++ b/devtools/client/inspector/test/browser_inspector_sidebarstate.js @@ -122,8 +122,8 @@ function checkTelemetryResults() { const expected = TELEMETRY_DATA[i]; // ignore timestamp - ok(timestamp > 0, "timestamp is greater than 0"); - ok(extra.time_open > 0, "time_open is greater than 0"); + Assert.greater(timestamp, 0, "timestamp is greater than 0"); + Assert.greater(Number(extra.time_open), 0, "time_open is greater than 0"); is(category, expected.category, "category is correct"); is(method, expected.method, "method is correct"); is(object, expected.object, "object is correct"); diff --git a/devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js b/devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js index 171f4f8e7f..2bcd2e9873 100644 --- a/devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js +++ b/devtools/client/inspector/test/browser_inspector_switch-to-inspector-on-pick.js @@ -104,7 +104,7 @@ function checkResults() { is(method, expected.method, "method is correct"); is(object, expected.object, "object is correct"); is(value, null, "value is correct"); - ok(extra.width > 0, "width is greater than 0"); + Assert.greater(Number(extra.width), 0, "width is greater than 0"); checkExtra("host", extra, expected); checkExtra("start_state", extra, expected); diff --git a/devtools/client/inspector/toolsidebar.js b/devtools/client/inspector/toolsidebar.js index cff5eb96fa..422ae76b43 100644 --- a/devtools/client/inspector/toolsidebar.js +++ b/devtools/client/inspector/toolsidebar.js @@ -151,10 +151,8 @@ ToolSidebar.prototype = { * @param {String} tabId The ID of the tab that was used to register it, or * the tab id attribute value if the tab existed before the sidebar * got created. - * @param {String} tabPanelId Optional. If provided, this ID will be used - * instead of the tabId to retrieve and remove the corresponding <tabpanel> */ - removeTab(tabId, tabPanelId) { + removeTab(tabId) { this._tabbar.removeTab(tabId); this.emit("tab-unregistered", tabId); diff --git a/devtools/client/jar.mn b/devtools/client/jar.mn index 33a70de4a2..a2b1b7bfb7 100644 --- a/devtools/client/jar.mn +++ b/devtools/client/jar.mn @@ -143,13 +143,11 @@ devtools.jar: skin/images/accessibility.svg (themes/images/accessibility.svg) skin/images/add.svg (themes/images/add.svg) skin/images/alert.svg (themes/images/alert.svg) - skin/images/alert-small.svg (themes/images/alert-small.svg) skin/images/alert-tiny.svg (themes/images/alert-tiny.svg) skin/images/arrow-dropdown-12.svg (themes/images/arrow-dropdown-12.svg) skin/images/error.svg (themes/images/error.svg) skin/images/error-tiny.svg (themes/images/error-tiny.svg) skin/images/info.svg (themes/images/info.svg) - skin/images/info-small.svg (themes/images/info-small.svg) skin/images/info-tiny.svg (themes/images/info-tiny.svg) skin/images/arrow.svg (themes/images/arrow.svg) skin/images/arrow-big.svg (themes/images/arrow-big.svg) @@ -246,6 +244,8 @@ devtools.jar: content/debugger/images/regex-match.svg (debugger/images/regex-match.svg) content/debugger/images/search.svg (debugger/images/search.svg) content/debugger/images/sourcemap.svg (debugger/images/sourcemap.svg) + content/debugger/images/sourcemap-active.svg (debugger/images/sourcemap-active.svg) + content/debugger/images/sourcemap-disabled.svg (debugger/images/sourcemap-disabled.svg) content/debugger/images/stepIn.svg (debugger/images/stepIn.svg) content/debugger/images/stepOut.svg (debugger/images/stepOut.svg) content/debugger/images/tab.svg (debugger/images/tab.svg) diff --git a/devtools/client/jsonview/Sniffer.sys.mjs b/devtools/client/jsonview/Sniffer.sys.mjs index d585ce8ab2..8deeece706 100644 --- a/devtools/client/jsonview/Sniffer.sys.mjs +++ b/devtools/client/jsonview/Sniffer.sys.mjs @@ -35,7 +35,7 @@ function getContentDisposition(channel) { * a compartment at startup when no JSON is being viewed. */ export class Sniffer { - getMIMETypeFromContent(request, data, length) { + getMIMETypeFromContent(request) { if (request instanceof Ci.nsIChannel) { // JSON View is enabled only for top level loads only. if ( diff --git a/devtools/client/jsonview/components/Headers.js b/devtools/client/jsonview/components/Headers.js index 7477627328..01b6160718 100644 --- a/devtools/client/jsonview/components/Headers.js +++ b/devtools/client/jsonview/components/Headers.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { createFactory, Component, diff --git a/devtools/client/jsonview/components/HeadersPanel.js b/devtools/client/jsonview/components/HeadersPanel.js index 0e9e17190e..45f216afb5 100644 --- a/devtools/client/jsonview/components/HeadersPanel.js +++ b/devtools/client/jsonview/components/HeadersPanel.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); diff --git a/devtools/client/jsonview/components/HeadersToolbar.js b/devtools/client/jsonview/components/HeadersToolbar.js index f9122c3a31..4033b6f1e4 100644 --- a/devtools/client/jsonview/components/HeadersToolbar.js +++ b/devtools/client/jsonview/components/HeadersToolbar.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const { createFactories } = require("devtools/client/shared/react-utils"); @@ -31,7 +31,7 @@ define(function (require, exports, module) { // Commands - onCopy(event) { + onCopy() { this.props.actions.onCopyHeaders(); } diff --git a/devtools/client/jsonview/components/JsonPanel.js b/devtools/client/jsonview/components/JsonPanel.js index f569aad4c6..6e7aef1f16 100644 --- a/devtools/client/jsonview/components/JsonPanel.js +++ b/devtools/client/jsonview/components/JsonPanel.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { createFactory, Component, @@ -71,7 +71,7 @@ define(function (require, exports, module) { document.removeEventListener("keypress", this.onKeyPress, true); } - onKeyPress(e) { + onKeyPress() { // XXX shortcut for focusing the Filter field (see Bug 1178771). } diff --git a/devtools/client/jsonview/components/JsonToolbar.js b/devtools/client/jsonview/components/JsonToolbar.js index 34e6ed285b..2e3a074538 100644 --- a/devtools/client/jsonview/components/JsonToolbar.js +++ b/devtools/client/jsonview/components/JsonToolbar.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); @@ -42,19 +42,19 @@ define(function (require, exports, module) { // Commands - onSave(event) { + onSave() { this.props.actions.onSaveJson(); } - onCopy(event) { + onCopy() { this.props.actions.onCopyJson(); } - onCollapse(event) { + onCollapse() { this.props.actions.onCollapse(); } - onExpand(event) { + onExpand() { this.props.actions.onExpand(); } diff --git a/devtools/client/jsonview/components/LiveText.js b/devtools/client/jsonview/components/LiveText.js index d90c099340..8e3563d2da 100644 --- a/devtools/client/jsonview/components/LiveText.js +++ b/devtools/client/jsonview/components/LiveText.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const { findDOMNode } = require("devtools/client/shared/vendor/react-dom"); diff --git a/devtools/client/jsonview/components/MainTabbedArea.js b/devtools/client/jsonview/components/MainTabbedArea.js index 5341e590ce..d800a1f58c 100644 --- a/devtools/client/jsonview/components/MainTabbedArea.js +++ b/devtools/client/jsonview/components/MainTabbedArea.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const { createFactories } = require("devtools/client/shared/react-utils"); diff --git a/devtools/client/jsonview/components/SearchBox.js b/devtools/client/jsonview/components/SearchBox.js index cb736db85b..45b9ac8752 100644 --- a/devtools/client/jsonview/components/SearchBox.js +++ b/devtools/client/jsonview/components/SearchBox.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); diff --git a/devtools/client/jsonview/components/TextPanel.js b/devtools/client/jsonview/components/TextPanel.js index b5b674b6ce..30cfede326 100644 --- a/devtools/client/jsonview/components/TextPanel.js +++ b/devtools/client/jsonview/components/TextPanel.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); diff --git a/devtools/client/jsonview/components/TextToolbar.js b/devtools/client/jsonview/components/TextToolbar.js index 0ab16ef192..e0bbee2d0f 100644 --- a/devtools/client/jsonview/components/TextToolbar.js +++ b/devtools/client/jsonview/components/TextToolbar.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const { createFactories } = require("devtools/client/shared/react-utils"); @@ -33,15 +33,15 @@ define(function (require, exports, module) { // Commands - onPrettify(event) { + onPrettify() { this.props.actions.onPrettify(); } - onSave(event) { + onSave() { this.props.actions.onSaveJson(); } - onCopy(event) { + onCopy() { this.props.actions.onCopyJson(); } diff --git a/devtools/client/jsonview/components/reps/Toolbar.js b/devtools/client/jsonview/components/reps/Toolbar.js index 458acf236f..bed0a77799 100644 --- a/devtools/client/jsonview/components/reps/Toolbar.js +++ b/devtools/client/jsonview/components/reps/Toolbar.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component } = require("devtools/client/shared/vendor/react"); const PropTypes = require("devtools/client/shared/vendor/react-prop-types"); const dom = require("devtools/client/shared/vendor/react-dom-factories"); diff --git a/devtools/client/jsonview/converter-child.js b/devtools/client/jsonview/converter-child.js index 79fd4a68cd..e249de0180 100644 --- a/devtools/client/jsonview/converter-child.js +++ b/devtools/client/jsonview/converter-child.js @@ -65,14 +65,14 @@ Converter.prototype = { * 5. convert does nothing, it's just the synchronous version * of asyncConvertData */ - convert(fromStream, fromType, toType, ctx) { + convert(fromStream) { return fromStream; }, - asyncConvertData(fromType, toType, listener, ctx) { + asyncConvertData(fromType, toType, listener) { this.listener = listener; }, - getConvertedType(fromType, channel) { + getConvertedType() { return "text/html"; }, @@ -395,7 +395,7 @@ function keepThemeUpdated(win) { addThemeObserver(listener); win.addEventListener( "unload", - function (event) { + function () { removeThemeObserver(listener); win = null; }, diff --git a/devtools/client/jsonview/json-viewer.js b/devtools/client/jsonview/json-viewer.js index 131307302e..cefeb7b8f6 100644 --- a/devtools/client/jsonview/json-viewer.js +++ b/devtools/client/jsonview/json-viewer.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require) { const { render } = require("devtools/client/shared/vendor/react-dom"); const { createFactories } = require("devtools/client/shared/react-utils"); const { MainTabbedArea } = createFactories( @@ -79,7 +79,7 @@ define(function (require, exports, module) { theApp.setState({ searchFilter: value }); }, - onPrettify(data) { + onPrettify() { if (input.json instanceof Error) { // Cannot prettify invalid JSON return; @@ -96,12 +96,12 @@ define(function (require, exports, module) { input.prettified = !input.prettified; }, - onCollapse(data) { + onCollapse() { input.expandedNodes.clear(); theApp.forceUpdate(); }, - onExpand(data) { + onExpand() { input.expandedNodes = TreeViewClass.getExpandedNodes(input.json); theApp.setState({ expandedNodes: input.expandedNodes }); }, diff --git a/devtools/client/jsonview/test/browser_jsonview_content_type.js b/devtools/client/jsonview/test/browser_jsonview_content_type.js index c3298cc7d9..f72ac14b5d 100644 --- a/devtools/client/jsonview/test/browser_jsonview_content_type.js +++ b/devtools/client/jsonview/test/browser_jsonview_content_type.js @@ -34,7 +34,7 @@ add_task(async function () { ); SpecialPowers.setBoolPref("browser.download.useDownloadDir", false); const { MockFilePicker } = SpecialPowers; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); MockFilePicker.returnValue = MockFilePicker.returnCancel; for (const kind of Object.keys(contentTypes)) { diff --git a/devtools/client/jsonview/test/browser_jsonview_expand_collapse.js b/devtools/client/jsonview/test/browser_jsonview_expand_collapse.js index 46ce800b1f..04e0834f2a 100644 --- a/devtools/client/jsonview/test/browser_jsonview_expand_collapse.js +++ b/devtools/client/jsonview/test/browser_jsonview_expand_collapse.js @@ -45,7 +45,7 @@ add_task(async function () { const json = JSON.stringify({ data: Array(1e5) .fill() - .map(x => "hoot"), + .map(() => "hoot"), status: "ok", }); Assert.greater( diff --git a/devtools/client/jsonview/test/browser_jsonview_save_json.js b/devtools/client/jsonview/test/browser_jsonview_save_json.js index 506967df00..d83741685e 100644 --- a/devtools/client/jsonview/test/browser_jsonview_save_json.js +++ b/devtools/client/jsonview/test/browser_jsonview_save_json.js @@ -8,7 +8,7 @@ const saveButton = "button.save"; const prettifyButton = "button.prettyprint"; const { MockFilePicker } = SpecialPowers; -MockFilePicker.init(window); +MockFilePicker.init(window.browsingContext); MockFilePicker.returnValue = MockFilePicker.returnOK; Services.scriptloader.loadSubScript( diff --git a/devtools/client/jsonview/test/browser_jsonview_serviceworker.js b/devtools/client/jsonview/test/browser_jsonview_serviceworker.js index 3d68cad065..c8be1a939a 100644 --- a/devtools/client/jsonview/test/browser_jsonview_serviceworker.js +++ b/devtools/client/jsonview/test/browser_jsonview_serviceworker.js @@ -34,7 +34,7 @@ add_task(async function () { resolve(); return; } - worker.addEventListener("statechange", evt => { + worker.addEventListener("statechange", () => { if (worker.state === "activated") { resolve(); } diff --git a/devtools/client/locales/en-US/debugger.properties b/devtools/client/locales/en-US/debugger.properties index 2c6cdeb5a9..0d7b347722 100644 --- a/devtools/client/locales/en-US/debugger.properties +++ b/devtools/client/locales/en-US/debugger.properties @@ -636,7 +636,7 @@ original=original # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression # input element -expressions.placeholder=Add watch expression +expressions.placeholder2=Add expression # LOCALIZATION NOTE (expressions.noOriginalScopes): Expressions right sidebar pane message # for when the`map variable names`is off and the debugger is paused in an original source @@ -751,6 +751,71 @@ sourceFooter.unignore=Unignore source # with the ignore source button when the selected source is on the ignore list sourceFooter.ignoreList=This source is on the ignore list. Please turn off the `Ignore Known Third-party Scripts` option to enable it. +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.disabled): Label displayed next to the +# Source Map icon displayed in editor footer. +# Displayed when Source Maps are disabled. +sourceFooter.sourceMapButton.disabled = Source Maps disabled + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.sourceNotMapped): Label displayed next to the +# Source Map icon displayed in editor footer. +# Displayed when the selected source is a regular source, without any source map. +sourceFooter.sourceMapButton.sourceNotMapped = No source map found + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.isOriginalSource): Label displayed next to the +# Source Map icon displayed in editor footer. +# Displayed when the selected source is an original source. +# i.e. a file which may not be in JavaScript and isn't being executed by Firefox. +# This file is transpiled by the web developer into a "bundle" JavaScript file, which is executed by the page. +sourceFooter.sourceMapButton.isOriginalSource = original file + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.isBundleSource): Label displayed next to the +# Source Map icon displayed in editor footer. +# Displayed when the selected source is a bundle. i.e. a file referring to a source map file, +# which will be mapped to one or many original sources. +sourceFooter.sourceMapButton.isBundleSource = bundle file + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.enable): Label displayed in the menu opened +# from the Source Map icon displayed in editor footer. +# This allows to toggle Source Map support. +sourceFooter.sourceMapButton.enable = Enable Source Maps + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.showOriginalSourceByDefault): Label displayed in the menu opened +# from the Source Map icon displayed in editor footer. +# This controls the settings which will make the debugger automatically show and open original source by default. +# This typically happens when you pause or hit a breakpoint. +sourceFooter.sourceMapButton.showOriginalSourceByDefault = Show and open original location by default + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.jumpToGeneratedSource): Label displayed in the menu opened +# from the Source Map icon displayed in editor footer. +# This allows to select the related bundle source, when we are currently selecting an original one. +sourceFooter.sourceMapButton.jumpToGeneratedSource = Jump to the related bundle source + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.jumpToOriginalSource): Label displayed in the menu opened +# from the Source Map icon displayed in editor footer. +# This allows to select the related original source, when we are currently selecting a bundle. +sourceFooter.sourceMapButton.jumpToOriginalSource = Jump to the related original source + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.openSourceMapInNewTab): Label displayed in the menu opened +# from the Source Map icon displayed in editor footer. +# When selecting a bundle with a valid source map, link to open the source map in a new tab. +sourceFooter.sourceMapButton.openSourceMapInNewTab = Open the Source Map file in a new tab + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.title): Tooltip displayed on +# the Source Map icon displayed in editor footer. +# This is the default title. +sourceFooter.sourceMapButton.title = Source Map status + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.loadingTitle): Tooltip displayed on +# the Source Map icon displayed in editor footer. +# This title is displayed when the source map is still loading. +sourceFooter.sourceMapButton.loadingTitle = Source Map is loading + +# LOCALIZATION NOTE (sourceFooter.sourceMapButton.errorTitle): Tooltip displayed on +# the Source Map icon displayed in editor footer. +# This title is displayed when the source map has an error. +# %S will be the error string. +sourceFooter.sourceMapButton.errorTitle = Source Map error: %S + # LOCALIZATION NOTE (editorNotificationFooter.noOriginalScopes): The notification message displayed in the editor notification footer # when paused in an original file and original variable mapping is turned off # %S is text from the label for checkbox to show original scopes diff --git a/devtools/client/locales/en-US/tooltips.ftl b/devtools/client/locales/en-US/tooltips.ftl index 0639d95434..df6170f5a3 100644 --- a/devtools/client/locales/en-US/tooltips.ftl +++ b/devtools/client/locales/en-US/tooltips.ftl @@ -82,6 +82,8 @@ inactive-css-text-wrap-balance-fragmented = <strong>{ $property }</strong> has n inactive-css-not-grid-or-flex-container-fix = Try adding <strong>display:grid</strong> or <strong>display:flex</strong>. { learn-more } +inactive-css-not-grid-or-flex-or-block-container-fix = Try adding <strong>display:grid</strong>, <strong>display:flex</strong> or <strong>display:block</strong>. { learn-more } + inactive-css-not-grid-or-flex-container-or-multicol-container-fix = Try adding either <strong>display:grid</strong>, <strong>display:flex</strong>, or <strong>columns:2</strong>. { learn-more } inactive-css-not-multicol-container-fix = Try adding either <strong>column-count</strong> or <strong>column-width</strong>. { learn-more } diff --git a/devtools/client/memory/actions/census-display.js b/devtools/client/memory/actions/census-display.js index d266fe04a5..9abd16d99b 100644 --- a/devtools/client/memory/actions/census-display.js +++ b/devtools/client/memory/actions/census-display.js @@ -10,7 +10,7 @@ const { } = require("resource://devtools/client/memory/actions/refresh.js"); exports.setCensusDisplayAndRefresh = function (heapWorker, display) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch(setCensusDisplay(display)); await dispatch(refresh(heapWorker)); }; diff --git a/devtools/client/memory/actions/filter.js b/devtools/client/memory/actions/filter.js index 1bc9fd35db..7f5295872d 100644 --- a/devtools/client/memory/actions/filter.js +++ b/devtools/client/memory/actions/filter.js @@ -26,7 +26,7 @@ const debouncedRefreshDispatcher = debounce( ); exports.setFilterStringAndRefresh = function (filterString, heapWorker) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch(setFilterString(filterString)); debouncedRefreshDispatcher(dispatch, heapWorker); }; diff --git a/devtools/client/memory/actions/io.js b/devtools/client/memory/actions/io.js index c811478df5..bedd5d8bfc 100644 --- a/devtools/client/memory/actions/io.js +++ b/devtools/client/memory/actions/io.js @@ -25,7 +25,7 @@ const { const VALID_EXPORT_STATES = [states.SAVED, states.READ]; exports.pickFileAndExportSnapshot = function (snapshot) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { const outputFile = await openFilePicker({ title: L10N.getFormatStr("snapshot.io.save.window"), defaultName: PathUtils.filename(snapshot.path), @@ -42,7 +42,7 @@ exports.pickFileAndExportSnapshot = function (snapshot) { }; const exportSnapshot = (exports.exportSnapshot = function (snapshot, dest) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch({ type: actions.EXPORT_SNAPSHOT_START, snapshot }); assert( @@ -62,7 +62,7 @@ const exportSnapshot = (exports.exportSnapshot = function (snapshot, dest) { }); exports.pickFileAndImportSnapshotAndCensus = function (heapWorker) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { const input = await openFilePicker({ title: L10N.getFormatStr("snapshot.io.import.window"), filters: [[L10N.getFormatStr("snapshot.io.filter"), "*.fxsnapshot"]], diff --git a/devtools/client/memory/actions/label-display.js b/devtools/client/memory/actions/label-display.js index c8a6db35ec..cd90fcff3b 100644 --- a/devtools/client/memory/actions/label-display.js +++ b/devtools/client/memory/actions/label-display.js @@ -14,7 +14,7 @@ const { * current data. */ exports.setLabelDisplayAndRefresh = function (heapWorker, display) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { // Clears out all stored census data and sets the display. dispatch(setLabelDisplay(display)); await dispatch(refresh(heapWorker)); diff --git a/devtools/client/memory/actions/snapshot.js b/devtools/client/memory/actions/snapshot.js index 63885be251..21b54e9e28 100644 --- a/devtools/client/memory/actions/snapshot.js +++ b/devtools/client/memory/actions/snapshot.js @@ -727,7 +727,7 @@ const computeAndFetchDominatorTree = (exports.computeAndFetchDominatorTree = return id; }, - async task(heapWorker, id, removeFromCache, dispatch, getState) { + async task(heapWorker, id, removeFromCache, dispatch) { const dominatorTreeId = await dispatch( computeDominatorTree(heapWorker, id) ); @@ -843,7 +843,7 @@ exports.clearSnapshots = function (heapWorker) { * @param {snapshotModel} snapshot */ exports.deleteSnapshot = function (heapWorker, snapshot) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch({ type: actions.DELETE_SNAPSHOTS_START, ids: [snapshot.id] }); try { diff --git a/devtools/client/memory/actions/tree-map-display.js b/devtools/client/memory/actions/tree-map-display.js index e1c4a21132..38de0478c3 100644 --- a/devtools/client/memory/actions/tree-map-display.js +++ b/devtools/client/memory/actions/tree-map-display.js @@ -13,7 +13,7 @@ const { * census. */ exports.setTreeMapAndRefresh = function (heapWorker, display) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch(setTreeMap(display)); await dispatch(refresh(heapWorker)); }; diff --git a/devtools/client/memory/actions/view.js b/devtools/client/memory/actions/view.js index af1bc7b21a..5f1ab5c263 100644 --- a/devtools/client/memory/actions/view.js +++ b/devtools/client/memory/actions/view.js @@ -49,7 +49,7 @@ const popView = (exports.popView = function () { * @param {HeapAnalysesClient} heapWorker */ exports.changeViewAndRefresh = function (view, heapWorker) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch(changeView(view)); await dispatch(refresh.refresh(heapWorker)); }; @@ -62,7 +62,7 @@ exports.changeViewAndRefresh = function (view, heapWorker) { * @param {HeapAnalysesClient} heapWorker */ exports.popViewAndRefresh = function (heapWorker) { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { dispatch(popView()); await dispatch(refresh.refresh(heapWorker)); }; diff --git a/devtools/client/memory/components/CensusTreeItem.js b/devtools/client/memory/components/CensusTreeItem.js index 39fdbeb052..b3dd5545de 100644 --- a/devtools/client/memory/components/CensusTreeItem.js +++ b/devtools/client/memory/components/CensusTreeItem.js @@ -45,7 +45,7 @@ class CensusTreeItem extends Component { this.toLabel = this.toLabel.bind(this); } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.item != nextProps.item || this.props.depth != nextProps.depth || diff --git a/devtools/client/memory/components/DominatorTree.js b/devtools/client/memory/components/DominatorTree.js index 9c767cece7..3cb1f89856 100644 --- a/devtools/client/memory/components/DominatorTree.js +++ b/devtools/client/memory/components/DominatorTree.js @@ -44,7 +44,7 @@ class DominatorTreeSubtreeFetchingClass extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.depth !== nextProps.depth || this.props.focused !== nextProps.focused @@ -84,7 +84,7 @@ class DominatorTreeSiblingLinkClass extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.depth !== nextProps.depth || this.props.focused !== nextProps.focused @@ -129,7 +129,7 @@ class DominatorTree extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { // Safe to use referential equality here because all of our mutations on // dominator tree models use immutableUpdate in a persistent manner. The // exception to the rule are mutations of the expanded set, however we take diff --git a/devtools/client/memory/components/DominatorTreeItem.js b/devtools/client/memory/components/DominatorTreeItem.js index 59cb542a3a..88dddf0563 100644 --- a/devtools/client/memory/components/DominatorTreeItem.js +++ b/devtools/client/memory/components/DominatorTreeItem.js @@ -47,7 +47,7 @@ class DominatorTreeItem extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.item != nextProps.item || this.props.depth != nextProps.depth || diff --git a/devtools/client/memory/components/Individuals.js b/devtools/client/memory/components/Individuals.js index dd0e9acc81..ed48232c68 100644 --- a/devtools/client/memory/components/Individuals.js +++ b/devtools/client/memory/components/Individuals.js @@ -42,9 +42,9 @@ class Individuals extends Component { autoExpandDepth: 0, preventNavigationOnArrowRight: false, focused: individuals.focused, - getParent: node => null, - getChildren: node => [], - isExpanded: node => false, + getParent: () => null, + getChildren: () => [], + isExpanded: () => false, onExpand: () => {}, onCollapse: () => {}, onFocus, diff --git a/devtools/client/memory/components/TreeMap.js b/devtools/client/memory/components/TreeMap.js index b9a3c39495..6dd404d3e9 100644 --- a/devtools/client/memory/components/TreeMap.js +++ b/devtools/client/memory/components/TreeMap.js @@ -38,7 +38,7 @@ class TreeMap extends Component { return oldTreeMap !== newTreeMap; } - componentDidUpdate(prevProps) { + componentDidUpdate() { this._stopVisualization(); if (this.props.treeMap && this.props.treeMap.report) { diff --git a/devtools/client/memory/components/tree-map/drag-zoom.js b/devtools/client/memory/components/tree-map/drag-zoom.js index 034017e086..f0f94a926a 100644 --- a/devtools/client/memory/components/tree-map/drag-zoom.js +++ b/devtools/client/memory/components/tree-map/drag-zoom.js @@ -295,10 +295,9 @@ function setScrollHandlers(container, dragZoom, emitChanged, update) { * Account for the various mouse wheel event types, per pixel or per line * * @param {WheelEvent} event - * @param {Window} window * @return {Number} The scroll size in pixels */ -function getScrollDelta(event, window) { +function getScrollDelta(event) { if (event.deltaMode === LINE_SCROLL_MODE) { // Update by a fixed arbitrary value to normalize scroll types return event.deltaY * SCROLL_LINE_SIZE; diff --git a/devtools/client/memory/models.js b/devtools/client/memory/models.js index 83ed3641b0..9429fdae4a 100644 --- a/devtools/client/memory/models.js +++ b/devtools/client/memory/models.js @@ -289,7 +289,7 @@ const snapshotModel = (exports.snapshot = PropTypes.shape({ creationTime: PropTypes.number, // The current state the snapshot is in. // @see ./constants.js - state: catchAndIgnore(function (snapshot, propName) { + state: catchAndIgnore(function (snapshot) { const current = snapshot.state; const shouldHavePath = [states.IMPORTING, states.SAVED, states.READ]; const shouldHaveCreationTime = [states.READ]; diff --git a/devtools/client/memory/reducers/allocations.js b/devtools/client/memory/reducers/allocations.js index f019705560..895e61676d 100644 --- a/devtools/client/memory/reducers/allocations.js +++ b/devtools/client/memory/reducers/allocations.js @@ -9,10 +9,7 @@ const { actions } = require("resource://devtools/client/memory/constants.js"); const handlers = Object.create(null); -handlers[actions.TOGGLE_RECORD_ALLOCATION_STACKS_START] = function ( - state, - action -) { +handlers[actions.TOGGLE_RECORD_ALLOCATION_STACKS_START] = function (state) { assert( !state.togglingInProgress, "Changing recording state must not be reentrant." @@ -24,10 +21,7 @@ handlers[actions.TOGGLE_RECORD_ALLOCATION_STACKS_START] = function ( }; }; -handlers[actions.TOGGLE_RECORD_ALLOCATION_STACKS_END] = function ( - state, - action -) { +handlers[actions.TOGGLE_RECORD_ALLOCATION_STACKS_END] = function (state) { assert( state.togglingInProgress, "Should not complete changing recording state if we weren't changing " + diff --git a/devtools/client/memory/reducers/individuals.js b/devtools/client/memory/reducers/individuals.js index 9b5a2c89a5..57b096f870 100644 --- a/devtools/client/memory/reducers/individuals.js +++ b/devtools/client/memory/reducers/individuals.js @@ -38,7 +38,7 @@ handlers[actions.FOCUS_INDIVIDUAL] = function (individuals, { node }) { return immutableUpdate(individuals, { focused: node }); }; -handlers[actions.FETCH_INDIVIDUALS_START] = function (individuals, action) { +handlers[actions.FETCH_INDIVIDUALS_START] = function (individuals) { assert(individuals, "Should have individuals"); return Object.freeze({ state: individualsState.FETCHING, diff --git a/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_01.js b/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_01.js index b526025b17..e145732b7a 100644 --- a/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_01.js +++ b/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_01.js @@ -20,7 +20,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const { getState, dispatch } = panel.panelWin.gStore; const front = getState().front; diff --git a/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_02.js b/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_02.js index 34492187a2..b9c80c394c 100644 --- a/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_02.js +++ b/devtools/client/memory/test/browser/browser_memory_allocationStackDisplay_02.js @@ -20,7 +20,7 @@ const { const TEST_URL = "https://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest("about:blank", async function ({ tab, panel }) { +this.test = makeMemoryTest("about:blank", async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const { getState, dispatch } = panel.panelWin.gStore; const doc = panel.panelWin.document; diff --git a/devtools/client/memory/test/browser/browser_memory_clear_snapshots.js b/devtools/client/memory/test/browser/browser_memory_clear_snapshots.js index 52eecd2838..333459cc3e 100644 --- a/devtools/client/memory/test/browser/browser_memory_clear_snapshots.js +++ b/devtools/client/memory/test/browser/browser_memory_clear_snapshots.js @@ -13,7 +13,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const { gStore, document } = panel.panelWin; const { getState } = gStore; diff --git a/devtools/client/memory/test/browser/browser_memory_diff_01.js b/devtools/client/memory/test/browser/browser_memory_diff_01.js index 7b6487565f..638586f667 100644 --- a/devtools/client/memory/test/browser/browser_memory_diff_01.js +++ b/devtools/client/memory/test/browser/browser_memory_diff_01.js @@ -13,7 +13,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const store = panel.panelWin.gStore; const { getState } = store; const doc = panel.panelWin.document; diff --git a/devtools/client/memory/test/browser/browser_memory_displays_01.js b/devtools/client/memory/test/browser/browser_memory_displays_01.js index 89296b77f4..7e9561796d 100644 --- a/devtools/client/memory/test/browser/browser_memory_displays_01.js +++ b/devtools/client/memory/test/browser/browser_memory_displays_01.js @@ -13,7 +13,7 @@ const { changeView, } = require("resource://devtools/client/memory/actions/view.js"); -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const { gStore, document } = panel.panelWin; const { dispatch } = panel.panelWin.gStore; diff --git a/devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js b/devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js index 1faaf365a1..39b984eadd 100644 --- a/devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js +++ b/devtools/client/memory/test/browser/browser_memory_dominator_trees_01.js @@ -20,7 +20,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_big_tree.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { // Taking snapshots and computing dominator trees is slow :-/ requestLongerTimeout(4); diff --git a/devtools/client/memory/test/browser/browser_memory_filter_01.js b/devtools/client/memory/test/browser/browser_memory_filter_01.js index 00dcfdb951..7f2e39ac20 100644 --- a/devtools/client/memory/test/browser/browser_memory_filter_01.js +++ b/devtools/client/memory/test/browser/browser_memory_filter_01.js @@ -17,7 +17,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const store = panel.panelWin.gStore; const { dispatch } = store; diff --git a/devtools/client/memory/test/browser/browser_memory_individuals_01.js b/devtools/client/memory/test/browser/browser_memory_individuals_01.js index f54154b949..7be5fb2ac4 100644 --- a/devtools/client/memory/test/browser/browser_memory_individuals_01.js +++ b/devtools/client/memory/test/browser/browser_memory_individuals_01.js @@ -17,7 +17,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const store = panel.panelWin.gStore; const { dispatch } = store; const doc = panel.panelWin.document; diff --git a/devtools/client/memory/test/browser/browser_memory_keyboard.js b/devtools/client/memory/test/browser/browser_memory_keyboard.js index 0fba33c456..642eacd43c 100644 --- a/devtools/client/memory/test/browser/browser_memory_keyboard.js +++ b/devtools/client/memory/test/browser/browser_memory_keyboard.js @@ -39,7 +39,7 @@ function waitUntilExpanded(store, node) { ); } -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const store = panel.panelWin.gStore; const { getState, dispatch } = store; diff --git a/devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js b/devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js index b8b09b35d0..086bc77ef5 100644 --- a/devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js +++ b/devtools/client/memory/test/browser/browser_memory_no_allocation_stacks.js @@ -17,7 +17,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const { getState, dispatch } = panel.panelWin.gStore; const front = getState().front; diff --git a/devtools/client/memory/test/browser/browser_memory_no_auto_expand.js b/devtools/client/memory/test/browser/browser_memory_no_auto_expand.js index 9704d925d1..f4e9800f28 100644 --- a/devtools/client/memory/test/browser/browser_memory_no_auto_expand.js +++ b/devtools/client/memory/test/browser/browser_memory_no_auto_expand.js @@ -17,7 +17,7 @@ const { const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const { getState, dispatch } = panel.panelWin.gStore; const front = getState().front; diff --git a/devtools/client/memory/test/browser/browser_memory_percents_01.js b/devtools/client/memory/test/browser/browser_memory_percents_01.js index c4bb254b07..8e9202b705 100644 --- a/devtools/client/memory/test/browser/browser_memory_percents_01.js +++ b/devtools/client/memory/test/browser/browser_memory_percents_01.js @@ -29,7 +29,7 @@ function checkCells(cells) { } } -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const heapWorker = panel.panelWin.gHeapAnalysesClient; const { getState, dispatch } = panel.panelWin.gStore; const front = getState().front; diff --git a/devtools/client/memory/test/browser/browser_memory_refresh_does_not_leak.js b/devtools/client/memory/test/browser/browser_memory_refresh_does_not_leak.js index e0ee1eee41..1ecb6275d4 100644 --- a/devtools/client/memory/test/browser/browser_memory_refresh_does_not_leak.js +++ b/devtools/client/memory/test/browser/browser_memory_refresh_does_not_leak.js @@ -53,7 +53,7 @@ const DESCRIPTION = { }, }; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { let front = panel.panelWin.gStore.getState().front; const startWindows = await getWindowsInSnapshot(front); diff --git a/devtools/client/memory/test/browser/browser_memory_simple_01.js b/devtools/client/memory/test/browser/browser_memory_simple_01.js index a983e23395..acafb46ca1 100644 --- a/devtools/client/memory/test/browser/browser_memory_simple_01.js +++ b/devtools/client/memory/test/browser/browser_memory_simple_01.js @@ -14,7 +14,7 @@ const { changeView, } = require("resource://devtools/client/memory/actions/view.js"); -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const { gStore, document } = panel.panelWin; const { getState, dispatch } = gStore; diff --git a/devtools/client/memory/test/browser/browser_memory_transferHeapSnapshot_e10s_01.js b/devtools/client/memory/test/browser/browser_memory_transferHeapSnapshot_e10s_01.js index c647836332..169a968653 100644 --- a/devtools/client/memory/test/browser/browser_memory_transferHeapSnapshot_e10s_01.js +++ b/devtools/client/memory/test/browser/browser_memory_transferHeapSnapshot_e10s_01.js @@ -11,7 +11,7 @@ const TEST_URL = "data:text/html,<html><body></body></html>"; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const memoryFront = panel.panelWin.gStore.getState().front; ok(memoryFront, "Should get the MemoryFront"); diff --git a/devtools/client/memory/test/browser/browser_memory_tree_map-01.js b/devtools/client/memory/test/browser/browser_memory_tree_map-01.js index c65b7fc079..97e69f6f6d 100644 --- a/devtools/client/memory/test/browser/browser_memory_tree_map-01.js +++ b/devtools/client/memory/test/browser/browser_memory_tree_map-01.js @@ -12,7 +12,7 @@ const D3_SCRIPT = 'src="chrome://global/content/third_party/d3/d3.js">'; const TEST_URL = `data:text/html,<html><body>${D3_SCRIPT}</body></html>`; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const document = panel.panelWin.document; const window = panel.panelWin; const div = document.createElement("div"); diff --git a/devtools/client/memory/test/browser/browser_memory_tree_map-02.js b/devtools/client/memory/test/browser/browser_memory_tree_map-02.js index 890ede23b5..f48bb66c13 100644 --- a/devtools/client/memory/test/browser/browser_memory_tree_map-02.js +++ b/devtools/client/memory/test/browser/browser_memory_tree_map-02.js @@ -14,7 +14,7 @@ const PIXEL_SCROLL_MODE = 0; const PIXEL_DELTA = 10; const MAX_RAF_LOOP = 1000; -this.test = makeMemoryTest(TEST_URL, async function ({ tab, panel }) { +this.test = makeMemoryTest(TEST_URL, async function ({ panel }) { const panelWin = panel.panelWin; const panelDoc = panelWin.document; const div = panelDoc.createElement("div"); diff --git a/devtools/client/memory/utils.js b/devtools/client/memory/utils.js index 5d97663810..c16da9c14a 100644 --- a/devtools/client/memory/utils.js +++ b/devtools/client/memory/utils.js @@ -434,7 +434,7 @@ exports.openFilePicker = function ({ title, filters, defaultName, mode }) { } const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); - fp.init(window, title, fpMode); + fp.init(window.browsingContext, title, fpMode); for (const filter of filters || []) { fp.appendFilter(filter[0], filter[1]); diff --git a/devtools/client/menus.js b/devtools/client/menus.js index e22a2beac6..e75115c220 100644 --- a/devtools/client/menus.js +++ b/devtools/client/menus.js @@ -179,7 +179,7 @@ exports.menuitems = [ id: "extensionsForDevelopers", l10nKey: "extensionsForDevelopersCmd", appMenuL10nId: "appmenu-developer-tools-extensions", - oncommand(event) { + oncommand() { openDocLink( "https://addons.mozilla.org/firefox/collections/mozilla/webdeveloper/" ); diff --git a/devtools/client/netmonitor/src/actions/http-custom-request.js b/devtools/client/netmonitor/src/actions/http-custom-request.js index e045107410..7b2da3b403 100644 --- a/devtools/client/netmonitor/src/actions/http-custom-request.js +++ b/devtools/client/netmonitor/src/actions/http-custom-request.js @@ -34,7 +34,7 @@ const { * @returns {Function} */ function openHTTPCustomRequest(isOpen) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: OPEN_ACTION_BAR, open: isOpen }); dispatch({ diff --git a/devtools/client/netmonitor/src/actions/request-blocking.js b/devtools/client/netmonitor/src/actions/request-blocking.js index 502999c79f..ab2a1430a9 100644 --- a/devtools/client/netmonitor/src/actions/request-blocking.js +++ b/devtools/client/netmonitor/src/actions/request-blocking.js @@ -114,7 +114,7 @@ function closeRequestBlocking() { } function openRequestBlockingAndAddUrl(url) { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { const showBlockingPanel = Services.prefs.getBoolPref( "devtools.netmonitor.features.requestBlocking" ); @@ -127,7 +127,7 @@ function openRequestBlockingAndAddUrl(url) { } function openRequestBlockingAndDisableUrls(url) { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { const showBlockingPanel = Services.prefs.getBoolPref( "devtools.netmonitor.features.requestBlocking" ); diff --git a/devtools/client/netmonitor/src/actions/search.js b/devtools/client/netmonitor/src/actions/search.js index 97b123d361..647164cc11 100644 --- a/devtools/client/netmonitor/src/actions/search.js +++ b/devtools/client/netmonitor/src/actions/search.js @@ -176,7 +176,7 @@ function clearSearchResults() { * @returns {Function} */ function clearSearchResultAndCancel() { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch(stopOngoingSearch()); dispatch(clearSearchResults()); }; @@ -196,7 +196,7 @@ function updateSearchStatus(status) { * Close the entire search panel. */ function closeSearch() { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch(stopOngoingSearch()); dispatch({ type: OPEN_ACTION_BAR, open: false }); }; @@ -207,7 +207,7 @@ function closeSearch() { * @returns {Function} */ function openSearch() { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: OPEN_ACTION_BAR, open: true }); dispatch({ @@ -222,7 +222,7 @@ function openSearch() { * @returns {Function} */ function toggleCaseSensitiveSearch() { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { dispatch({ type: TOGGLE_SEARCH_CASE_SENSITIVE_SEARCH }); }; } @@ -280,7 +280,7 @@ function stopOngoingSearch() { * clicked search result. */ function navigate(searchResult) { - return ({ dispatch, getState }) => { + return ({ dispatch }) => { // Store target search result in Search reducer. It's used // for search result navigation within the side panels. dispatch(setTargetSearchResult(searchResult)); diff --git a/devtools/client/netmonitor/src/app.js b/devtools/client/netmonitor/src/app.js index d7cf642d48..a41ae2156c 100644 --- a/devtools/client/netmonitor/src/app.js +++ b/devtools/client/netmonitor/src/app.js @@ -41,7 +41,7 @@ function NetMonitorApp(api) { } NetMonitorApp.prototype = { - async bootstrap({ toolbox, document, win }) { + async bootstrap({ toolbox, document }) { // Get the root element for mounting. this.mount = document.querySelector("#mount"); diff --git a/devtools/client/netmonitor/src/assets/styles/NetworkDetailsBar.css b/devtools/client/netmonitor/src/assets/styles/NetworkDetailsBar.css index 4ab1c2f2bc..6f91a78bc7 100644 --- a/devtools/client/netmonitor/src/assets/styles/NetworkDetailsBar.css +++ b/devtools/client/netmonitor/src/assets/styles/NetworkDetailsBar.css @@ -508,7 +508,7 @@ height: 12px; vertical-align: -1px; margin-inline-start: 5px; - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); background-size: cover; -moz-context-properties: fill; fill: var(--yellow-60); diff --git a/devtools/client/netmonitor/src/components/CustomRequestPanel.js b/devtools/client/netmonitor/src/components/CustomRequestPanel.js index 66f63b7d8d..14ca7ca214 100644 --- a/devtools/client/netmonitor/src/components/CustomRequestPanel.js +++ b/devtools/client/netmonitor/src/components/CustomRequestPanel.js @@ -361,7 +361,7 @@ class CustomRequestPanel extends Component { module.exports = connect( state => ({ request: getSelectedRequest(state) }), - (dispatch, props) => ({ + dispatch => ({ removeSelectedCustomRequest: () => dispatch(Actions.removeSelectedCustomRequest()), sendCustomRequest: () => dispatch(Actions.sendCustomRequest()), diff --git a/devtools/client/netmonitor/src/components/StatisticsPanel.js b/devtools/client/netmonitor/src/components/StatisticsPanel.js index e3d6787819..d7b2fb9ddf 100644 --- a/devtools/client/netmonitor/src/components/StatisticsPanel.js +++ b/devtools/client/netmonitor/src/components/StatisticsPanel.js @@ -108,7 +108,7 @@ class StatisticsPanel extends Component { }); } - componentDidUpdate(prevProps) { + componentDidUpdate() { MediaQueryList.addListener(this.onLayoutChange); const { hasLoad, requests } = this.props; diff --git a/devtools/client/netmonitor/src/components/Toolbar.js b/devtools/client/netmonitor/src/components/Toolbar.js index 0da3d826c2..d48d96b846 100644 --- a/devtools/client/netmonitor/src/components/Toolbar.js +++ b/devtools/client/netmonitor/src/components/Toolbar.js @@ -336,7 +336,7 @@ class Toolbar extends Component { /** * Render a blocking button. */ - renderBlockingButton(toggleSearchPanel) { + renderBlockingButton() { const { networkActionBarOpen, toggleRequestBlockingPanel, diff --git a/devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js b/devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js index 826f0317ba..1894f1be04 100644 --- a/devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js +++ b/devtools/client/netmonitor/src/components/new-request/HTTPCustomRequestPanel.js @@ -476,12 +476,12 @@ class HTTPCustomRequestPanel extends Component { url: this.state.url, cause: this.props.request?.cause, urlQueryParams: this.state.urlQueryParams.map( - ({ checked, ...params }) => params + ({ ...params }) => params ), requestHeaders: { headers: this.state.headers .filter(({ checked }) => checked) - .map(({ checked, ...headersValues }) => headersValues), + .map(({ ...headersValues }) => headersValues), }, }; @@ -504,7 +504,7 @@ class HTTPCustomRequestPanel extends Component { module.exports = connect( state => ({ request: getClickedRequest(state) }), - (dispatch, props) => ({ + dispatch => ({ sendCustomRequest: request => dispatch(Actions.sendHTTPCustomRequest(request)), }) diff --git a/devtools/client/netmonitor/src/components/request-details/HeadersPanel.js b/devtools/client/netmonitor/src/components/request-details/HeadersPanel.js index 09226b72c5..5b8822d53b 100644 --- a/devtools/client/netmonitor/src/components/request-details/HeadersPanel.js +++ b/devtools/client/netmonitor/src/components/request-details/HeadersPanel.js @@ -907,7 +907,7 @@ module.exports = connect( state => ({ shouldExpandPreview: state.ui.shouldExpandHeadersUrlPreview, }), - (dispatch, props) => ({ + dispatch => ({ setHeadersUrlPreviewExpanded: expanded => dispatch(Actions.setHeadersUrlPreviewExpanded(expanded)), openRequestBlockingAndAddUrl: url => diff --git a/devtools/client/netmonitor/src/components/request-details/ResponsePanel.js b/devtools/client/netmonitor/src/components/request-details/ResponsePanel.js index ac4435ea1d..d222f7bc5e 100644 --- a/devtools/client/netmonitor/src/components/request-details/ResponsePanel.js +++ b/devtools/client/netmonitor/src/components/request-details/ResponsePanel.js @@ -228,7 +228,7 @@ class ResponsePanel extends Component { image: "", priority: PriorityLevels.PRIORITY_INFO_HIGH, type: "info", - eventCallback: e => {}, + eventCallback: () => {}, buttons: [ { mdnUrl: getCORSErrorURL(blockedReason), @@ -394,7 +394,7 @@ class ResponsePanel extends Component { image: "", priority: PriorityLevels.PRIORITY_INFO_MEDIUM, type: "info", - eventCallback: e => {}, + eventCallback: () => {}, buttons: [], }); diff --git a/devtools/client/netmonitor/src/components/request-details/TimingsPanel.js b/devtools/client/netmonitor/src/components/request-details/TimingsPanel.js index 6cba22fa71..8452e0ecb9 100644 --- a/devtools/client/netmonitor/src/components/request-details/TimingsPanel.js +++ b/devtools/client/netmonitor/src/components/request-details/TimingsPanel.js @@ -78,7 +78,7 @@ class TimingsPanel extends Component { { className: "label-separator" }, L10N.getStr("netmonitor.timings.serviceWorkerTiming") ), - Object.entries(serviceWorkerTimings).map(([key, value], index) => { + Object.entries(serviceWorkerTimings).map(([key, value]) => { if (preValue > 0) { offset += preValue / totalTime; } diff --git a/devtools/client/netmonitor/src/connector/firefox-data-provider.js b/devtools/client/netmonitor/src/connector/firefox-data-provider.js index 9cdf6fc1d7..ea3cf9cd83 100644 --- a/devtools/client/netmonitor/src/connector/firefox-data-provider.js +++ b/devtools/client/netmonitor/src/connector/firefox-data-provider.js @@ -460,7 +460,7 @@ class FirefoxDataProvider { * @param {string} protocols webSocket protocols * @param {string} extensions */ - async onWebSocketOpened(httpChannelId, effectiveURI, protocols, extensions) {} + async onWebSocketOpened() {} /** * The "webSocketClosed" message type handler. diff --git a/devtools/client/netmonitor/src/har/har-automation.js b/devtools/client/netmonitor/src/har/har-automation.js index b3c4153d1e..f798b2965f 100644 --- a/devtools/client/netmonitor/src/har/har-automation.js +++ b/devtools/client/netmonitor/src/har/har-automation.js @@ -21,7 +21,7 @@ const prefDomain = "devtools.netmonitor.har."; // Helper tracer. Should be generic sharable by other modules (bug 1171927) const trace = { - log(...args) {}, + log() {}, }; /** @@ -88,7 +88,7 @@ HarAutomation.prototype = { ); }, - pageLoadBegin(response) { + pageLoadBegin() { this.resetCollector(); }, @@ -120,7 +120,7 @@ HarAutomation.prototype = { trace.log("HarAutomation.pageLoadDone; ", response); if (this.collector) { - this.collector.waitForHarLoad().then(collector => { + this.collector.waitForHarLoad().then(() => { return this.autoExport(); }); } diff --git a/devtools/client/netmonitor/src/har/har-builder.js b/devtools/client/netmonitor/src/har/har-builder.js index 8f1a9095c7..ee281e20f6 100644 --- a/devtools/client/netmonitor/src/har/har-builder.js +++ b/devtools/client/netmonitor/src/har/har-builder.js @@ -208,7 +208,7 @@ HarBuilder.prototype = { return entry; }, - buildPageTimings(page, networkEvent) { + buildPageTimings() { // Event timing info isn't available const timings = { onContentLoad: -1, diff --git a/devtools/client/netmonitor/src/har/har-collector.js b/devtools/client/netmonitor/src/har/har-collector.js index c5a4ae959d..c02669be6e 100644 --- a/devtools/client/netmonitor/src/har/har-collector.js +++ b/devtools/client/netmonitor/src/har/har-collector.js @@ -10,7 +10,7 @@ const { // Helper tracer. Should be generic sharable by other modules (bug 1171927) const trace = { - log(...args) {}, + log() {}, }; /** diff --git a/devtools/client/netmonitor/src/har/har-exporter.js b/devtools/client/netmonitor/src/har/har-exporter.js index fb401c2737..9204e98994 100644 --- a/devtools/client/netmonitor/src/har/har-exporter.js +++ b/devtools/client/netmonitor/src/har/har-exporter.js @@ -18,7 +18,7 @@ var uid = 1; // Helper tracer. Should be generic sharable by other modules (bug 1171927) const trace = { - log(...args) {}, + log() {}, }; /** diff --git a/devtools/client/netmonitor/src/har/har-menu-utils.js b/devtools/client/netmonitor/src/har/har-menu-utils.js index 756d9d9f96..7fb9f7aee7 100644 --- a/devtools/client/netmonitor/src/har/har-menu-utils.js +++ b/devtools/client/netmonitor/src/har/har-menu-utils.js @@ -57,7 +57,7 @@ var HarMenuUtils = { openHarFile(actions, openSplitConsole) { const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init( - window, + window.browsingContext, L10N.getStr("netmonitor.har.importHarDialogTitle"), Ci.nsIFilePicker.modeOpen ); diff --git a/devtools/client/netmonitor/src/har/test/browser.toml b/devtools/client/netmonitor/src/har/test/browser.toml index 7a11328f5a..6964b542dd 100644 --- a/devtools/client/netmonitor/src/har/test/browser.toml +++ b/devtools/client/netmonitor/src/har/test/browser.toml @@ -21,8 +21,9 @@ support-files = [ ["browser_net_har_copy_all_as_har.js"] skip-if = [ - "!debug && os == 'mac'", #Bug 1622925 - "!debug && os == 'linux'", #Bug 1622925 + "apple_catalina && !debug", #Bug 1622925 + "apple_silicon && !debug", #Bug 1622925 + "os == 'linux' && os_version == '18.04' && !debug", #Bug 1622925 "win11_2009", # Bug 1797751 ] diff --git a/devtools/client/netmonitor/src/har/test/browser_net_har_copy_all_as_har.js b/devtools/client/netmonitor/src/har/test/browser_net_har_copy_all_as_har.js index bcbb4bef2a..2faaf01b73 100644 --- a/devtools/client/netmonitor/src/har/test/browser_net_har_copy_all_as_har.js +++ b/devtools/client/netmonitor/src/har/test/browser_net_har_copy_all_as_har.js @@ -111,7 +111,7 @@ async function testManyReloads({ tab, monitor, toolbox }) { assertNavigationRequestEntry(entry); } -async function testClearedRequests({ tab, monitor, toolbox }) { +async function testClearedRequests({ tab, monitor }) { info("Navigate to an empty page"); const topDocumentURL = "https://example.org/document-builder.sjs?html=empty-document"; @@ -196,7 +196,6 @@ function assertNavigationRequestEntry(entry) { * Reload the page and copy all as HAR. */ async function reloadAndCopyAllAsHar({ - tab, monitor, toolbox, reloadTwice = false, diff --git a/devtools/client/netmonitor/src/har/test/html_har_post-data-test-page.html b/devtools/client/netmonitor/src/har/test/html_har_post-data-test-page.html index 5e42c6139d..9be2e3c16a 100644 --- a/devtools/client/netmonitor/src/har/test/html_har_post-data-test-page.html +++ b/devtools/client/netmonitor/src/har/test/html_har_post-data-test-page.html @@ -44,7 +44,7 @@ post(url, data); } - function executeTest3(size) { + function executeTest3() { const url = "html_har_post-data-test-page.html"; get(url); } diff --git a/devtools/client/netmonitor/src/middleware/batching.js b/devtools/client/netmonitor/src/middleware/batching.js index 9d8c57084c..c546cc2e22 100644 --- a/devtools/client/netmonitor/src/middleware/batching.js +++ b/devtools/client/netmonitor/src/middleware/batching.js @@ -20,7 +20,7 @@ const REQUESTS_REFRESH_RATE = 50; // ms * - BATCH_ENABLE can be used to enable and disable the batching. * - BATCH_RESET discards the actions that are currently in the queue. */ -function batchingMiddleware(store) { +function batchingMiddleware() { return next => { let queuedActions = []; let enabled = true; diff --git a/devtools/client/netmonitor/src/middleware/prefs.js b/devtools/client/netmonitor/src/middleware/prefs.js index 6034a95dbf..2ccbb4db3c 100644 --- a/devtools/client/netmonitor/src/middleware/prefs.js +++ b/devtools/client/netmonitor/src/middleware/prefs.js @@ -30,8 +30,8 @@ function prefsMiddleware(store) { const filters = Object.entries( store.getState().filters.requestFilterTypes ) - .filter(([type, check]) => check) - .map(([type, check]) => type); + .filter(([, check]) => check) + .map(([type]) => type); Services.prefs.setCharPref( "devtools.netmonitor.filters", JSON.stringify(filters) diff --git a/devtools/client/netmonitor/src/middleware/throttling.js b/devtools/client/netmonitor/src/middleware/throttling.js index 30f5a9b5f4..ac72b556bb 100644 --- a/devtools/client/netmonitor/src/middleware/throttling.js +++ b/devtools/client/netmonitor/src/middleware/throttling.js @@ -14,7 +14,7 @@ const { * according to user actions. */ function throttlingMiddleware(connector) { - return store => next => action => { + return () => next => action => { const res = next(action); if (action.type === CHANGE_NETWORK_THROTTLING) { connector.updateNetworkThrottling(action.enabled, action.profile); diff --git a/devtools/client/netmonitor/src/reducers/messages.js b/devtools/client/netmonitor/src/reducers/messages.js index 27d7da28c7..cb21a08b91 100644 --- a/devtools/client/netmonitor/src/reducers/messages.js +++ b/devtools/client/netmonitor/src/reducers/messages.js @@ -208,7 +208,7 @@ function toggleMessageFilterType(state, action) { /** * Toggle control frames for the WebSocket connection. */ -function toggleControlFrames(state, action) { +function toggleControlFrames(state) { return { ...state, showControlFrames: !state.showControlFrames, diff --git a/devtools/client/netmonitor/src/reducers/request-blocking.js b/devtools/client/netmonitor/src/reducers/request-blocking.js index ffd0d8c97a..18dbe574f8 100644 --- a/devtools/client/netmonitor/src/reducers/request-blocking.js +++ b/devtools/client/netmonitor/src/reducers/request-blocking.js @@ -99,14 +99,14 @@ function removeBlockedUrl(state, action) { }; } -function removeAllBlockedUrls(state, action) { +function removeAllBlockedUrls(state) { return { ...state, blockedUrls: [], }; } -function enableAllBlockedUrls(state, action) { +function enableAllBlockedUrls(state) { const blockedUrls = state.blockedUrls.map(item => ({ ...item, enabled: true, @@ -117,7 +117,7 @@ function enableAllBlockedUrls(state, action) { }; } -function disableAllBlockedUrls(state, action) { +function disableAllBlockedUrls(state) { const blockedUrls = state.blockedUrls.map(item => ({ ...item, enabled: false, diff --git a/devtools/client/netmonitor/src/reducers/timing-markers.js b/devtools/client/netmonitor/src/reducers/timing-markers.js index 4a41f9b495..1b63674833 100644 --- a/devtools/client/netmonitor/src/reducers/timing-markers.js +++ b/devtools/client/netmonitor/src/reducers/timing-markers.js @@ -51,7 +51,7 @@ function addTimingMarker(state, action) { return state; } -function clearTimingMarkers(state) { +function clearTimingMarkers() { return new TimingMarkers(); } diff --git a/devtools/client/netmonitor/src/utils/context-menu-utils.js b/devtools/client/netmonitor/src/utils/context-menu-utils.js index 3b44ff20cc..2643913d11 100644 --- a/devtools/client/netmonitor/src/utils/context-menu-utils.js +++ b/devtools/client/netmonitor/src/utils/context-menu-utils.js @@ -8,7 +8,7 @@ * The default format for the content copied to the * clipboard when the `Copy Value` option is selected. */ -function baseCopyFormatter({ name, value, object, hasChildren }) { +function baseCopyFormatter({ name, value, hasChildren }) { if (hasChildren) { return baseCopyAllFormatter({ [name]: value }); } diff --git a/devtools/client/netmonitor/src/widgets/WaterfallBackground.js b/devtools/client/netmonitor/src/widgets/WaterfallBackground.js index e2be7f5715..807b5a25b6 100644 --- a/devtools/client/netmonitor/src/widgets/WaterfallBackground.js +++ b/devtools/client/netmonitor/src/widgets/WaterfallBackground.js @@ -133,7 +133,11 @@ class WaterfallBackground { // Flush the image data and cache the waterfall background. pixelArray.set(view8bit); - this.ctx.putImageData(imageData, 0, 0); + try { + this.ctx.putImageData(imageData, 0, 0); + } catch (e) { + console.error("WaterfallBackground crash error", e); + } this.setImageElement("waterfall-background", this.canvas); } diff --git a/devtools/client/netmonitor/test/browser.toml b/devtools/client/netmonitor/test/browser.toml index 00f6ac2068..186810de06 100644 --- a/devtools/client/netmonitor/test/browser.toml +++ b/devtools/client/netmonitor/test/browser.toml @@ -124,9 +124,11 @@ fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and ["browser_net_block-pattern.js"] skip-if = [ - "os == 'linux'", - "debug && os == 'win'", # Bug 1603355 - "debug && os == 'mac'", # Bug 1603355 + "os == 'linux' && os_version == '18.04'", + "win11_2009 && debug", # Bug 1603355 + "win10_2009 && debug", # Bug 1603355 + "apple_catalina && debug", # Bug 1603355 + "apple_silicon && debug", # Bug 1603355 ] ["browser_net_block-serviceworker.js"] @@ -184,15 +186,17 @@ skip-if = [ ["browser_net_complex-params.js"] skip-if = [ - "verify && !debug && os == 'win'", "win11_2009", # Bug 1797751 ] ["browser_net_content-type.js"] -skip-if = ["!debug && os == 'mac'"] +skip-if = [ + "apple_catalina && !debug", + "apple_silicon && !debug", +] ["browser_net_cookies_sorted.js"] -skip-if = ["verify && debug && os == 'win'"] +skip-if = ["win11_2009 && debug && verify"] ["browser_net_copy_as_curl.js"] @@ -207,7 +211,8 @@ skip-if = ["verify && debug && os == 'win'"] ["browser_net_copy_params.js"] skip-if = [ "win11_2009", # Bug 1797751 - "verify && !debug && os == 'mac'", # bug 1328915, disable linux32 debug devtools for timeouts + "apple_catalina && !debug && verify", # bug 1328915 + "apple_silicon && !debug && verify", # bug 1328915 ] ["browser_net_copy_response.js"] @@ -361,7 +366,7 @@ skip-if = ["!fission"] ["browser_net_params_sorted.js"] ["browser_net_pause.js"] -skip-if = ["verify && debug && os == 'win'"] +skip-if = ["win11_2009 && debug && verify"] ["browser_net_persistent_logs.js"] skip-if = ["true"] #Bug 1661612 @@ -377,7 +382,10 @@ skip-if = ["true"] #Bug 1661612 ["browser_net_prefs-and-l10n.js"] ["browser_net_prefs-reload.js"] -skip-if = ["os == 'win'"] # bug 1391264 +skip-if = [ + "win10_2009", # bug 1391264 + "win11_2009", # bug 1391264 +] ["browser_net_raw_headers.js"] @@ -398,7 +406,7 @@ skip-if = ["os == 'win'"] # bug 1391264 ["browser_net_resend_xhr.js"] ["browser_net_response_CORS_blocked.js"] -skip-if = ["a11y_checks && os == 'linux' && !debug"] # bug 1732635 +skip-if = ["os == 'linux' && os_version == '18.04' && !debug && a11y_checks"] # bug 1732635 ["browser_net_response_node-expanded.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled @@ -406,7 +414,7 @@ fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and ["browser_net_save_response_as.js"] ["browser_net_search-results.js"] -skip-if = ["os == 'linux' && a11y_checks"] # Bug 1721160 +skip-if = ["os == 'linux' && os_version == '18.04' && a11y_checks"] # Bug 1721160 ["browser_net_security-details.js"] @@ -433,7 +441,7 @@ fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled ["browser_net_service-worker-status.js"] -skip-if = ["verify && !debug && os == 'linux'"] +skip-if = ["os == 'linux' && os_version == '18.04' && !debug && verify"] ["browser_net_service-worker-timings.js"] fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled diff --git a/devtools/client/netmonitor/test/browser_net_cached-status.js b/devtools/client/netmonitor/test/browser_net_cached-status.js index 77346e6842..b41362b398 100644 --- a/devtools/client/netmonitor/test/browser_net_cached-status.js +++ b/devtools/client/netmonitor/test/browser_net_cached-status.js @@ -94,7 +94,7 @@ add_task(async function () { // that the NS_BINDING_ABORTED status is never displayed for cached requests. const observer = { QueryInterface: ChromeUtils.generateQI(["nsIObserver"]), - observe(subject, topic, data) { + observe(subject) { subject = subject.QueryInterface(Ci.nsIHttpChannel); if (subject.URI.spec == STATUS_CODES_SJS + "?sts=ok&cached") { subject.cancel(Cr.NS_BINDING_ABORTED); diff --git a/devtools/client/netmonitor/test/browser_net_curl-utils.js b/devtools/client/netmonitor/test/browser_net_curl-utils.js index 32b7aca316..cdf64ad5f9 100644 --- a/devtools/client/netmonitor/test/browser_net_curl-utils.js +++ b/devtools/client/netmonitor/test/browser_net_curl-utils.js @@ -139,7 +139,7 @@ function testWritePostDataTextParams(data) { ); } -function testWriteEmptyPostDataTextParams(data) { +function testWriteEmptyPostDataTextParams() { const params = CurlUtils.writePostDataTextParams(null); is(params, "", "Should return a empty string when no parameters provided"); } diff --git a/devtools/client/netmonitor/test/browser_net_header-docs.js b/devtools/client/netmonitor/test/browser_net_header-docs.js index 91d2794d5f..e4cdcb5c61 100644 --- a/devtools/client/netmonitor/test/browser_net_header-docs.js +++ b/devtools/client/netmonitor/test/browser_net_header-docs.js @@ -48,9 +48,9 @@ add_task(async function () { * Tests that a "Learn More" button is only shown if * and only if a header is documented in MDN. */ - function testShowLearnMore(data) { + function testShowLearnMore() { const selector = ".properties-view .treeRow.stringRow"; - document.querySelectorAll(selector).forEach((rowEl, index) => { + document.querySelectorAll(selector).forEach(rowEl => { const headerName = rowEl.querySelectorAll(".treeLabelCell .treeLabel")[0] .textContent; const headerDocURL = getHeadersURL(headerName); diff --git a/devtools/client/netmonitor/test/browser_net_prefs-reload.js b/devtools/client/netmonitor/test/browser_net_prefs-reload.js index 523c4dc805..42c90a2f25 100644 --- a/devtools/client/netmonitor/test/browser_net_prefs-reload.js +++ b/devtools/client/netmonitor/test/browser_net_prefs-reload.js @@ -36,8 +36,8 @@ add_task(async function () { // to verify that the pref was applied properly. validateValue: () => Object.entries(getState().filters.requestFilterTypes) - .filter(([type, check]) => check) - .map(([type, check]) => type), + .filter(([, check]) => check) + .map(([type]) => type), // Predicate used to modify the frontend when setting the new pref value, // before trying to validate the changes. modifyFrontend: value => diff --git a/devtools/client/netmonitor/test/browser_net_save_response_as.js b/devtools/client/netmonitor/test/browser_net_save_response_as.js index e8e3918ecb..638fb50794 100644 --- a/devtools/client/netmonitor/test/browser_net_save_response_as.js +++ b/devtools/client/netmonitor/test/browser_net_save_response_as.js @@ -4,7 +4,7 @@ "use strict"; var MockFilePicker = SpecialPowers.MockFilePicker; -MockFilePicker.init(window); +MockFilePicker.init(window.browsingContext); /** * Tests if saving a response to a file works.. diff --git a/devtools/client/netmonitor/test/browser_net_simple-request-data.js b/devtools/client/netmonitor/test/browser_net_simple-request-data.js index 7b112ef7d8..450313a4c9 100644 --- a/devtools/client/netmonitor/test/browser_net_simple-request-data.js +++ b/devtools/client/netmonitor/test/browser_net_simple-request-data.js @@ -17,72 +17,67 @@ function test() { L10N, } = require("resource://devtools/client/netmonitor/src/utils/l10n.js"); - initNetMonitor(SIMPLE_SJS, { requestCount: 1 }).then( - async ({ tab, monitor }) => { - info("Starting test... "); - - const { document, store, windowRequire, connector } = monitor.panelWin; - const { EVENTS, TEST_EVENTS } = windowRequire( - "devtools/client/netmonitor/src/constants" - ); - const { getDisplayedRequests, getSelectedRequest, getSortedRequests } = - windowRequire("devtools/client/netmonitor/src/selectors/index"); - - const promiseList = []; - promiseList.push(waitForNetworkEvents(monitor, 1)); - - function expectEvent(evt, cb) { - promiseList.push( - new Promise((resolve, reject) => { - monitor.panelWin.api.once(evt, _ => { - cb().then(resolve, reject); - }); - }) - ); - } + initNetMonitor(SIMPLE_SJS, { requestCount: 1 }).then(async ({ monitor }) => { + info("Starting test... "); + + const { document, store, windowRequire, connector } = monitor.panelWin; + const { EVENTS, TEST_EVENTS } = windowRequire( + "devtools/client/netmonitor/src/constants" + ); + const { getDisplayedRequests, getSelectedRequest, getSortedRequests } = + windowRequire("devtools/client/netmonitor/src/selectors/index"); + + const promiseList = []; + promiseList.push(waitForNetworkEvents(monitor, 1)); + + function expectEvent(evt, cb) { + promiseList.push( + new Promise((resolve, reject) => { + monitor.panelWin.api.once(evt, _ => { + cb().then(resolve, reject); + }); + }) + ); + } - expectEvent(TEST_EVENTS.NETWORK_EVENT, async () => { - is( - getSelectedRequest(store.getState()), - undefined, - "There shouldn't be any selected item in the requests menu." - ); - is( - store.getState().requests.requests.length, - 1, - "The requests menu should not be empty after the first request." - ); - is( - !!document.querySelector(".network-details-bar"), - false, - "The network details panel should still be hidden after first request." - ); + expectEvent(TEST_EVENTS.NETWORK_EVENT, async () => { + is( + getSelectedRequest(store.getState()), + undefined, + "There shouldn't be any selected item in the requests menu." + ); + is( + store.getState().requests.requests.length, + 1, + "The requests menu should not be empty after the first request." + ); + is( + !!document.querySelector(".network-details-bar"), + false, + "The network details panel should still be hidden after first request." + ); - const requestItem = getSortedRequests(store.getState())[0]; + const requestItem = getSortedRequests(store.getState())[0]; - is( - typeof requestItem.id, - "string", - "The attached request id is incorrect." - ); - isnot( - requestItem.id, - "", - "The attached request id should not be empty." - ); + is( + typeof requestItem.id, + "string", + "The attached request id is incorrect." + ); + isnot(requestItem.id, "", "The attached request id should not be empty."); - is( - typeof requestItem.startedMs, - "number", - "The attached startedMs is incorrect." - ); - isnot( - requestItem.startedMs, - 0, - "The attached startedMs should not be zero." - ); + is( + typeof requestItem.startedMs, + "number", + "The attached startedMs is incorrect." + ); + isnot( + requestItem.startedMs, + 0, + "The attached startedMs should not be zero." + ); - /* + /* * Bug 1666495: this is not possible to assert not yet set attributes * because of throttling, which only updates the frontend after a few attributes * are already retrieved via onResourceUpdates events. @@ -162,328 +157,319 @@ function test() { ); */ - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS - ); - }); - - expectEvent(TEST_EVENTS.RECEIVED_REQUEST_HEADERS, async () => { - await waitForRequestData(store, ["requestHeaders"]); - - const requestItem = getSortedRequests(store.getState())[0]; + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS + ); + }); - ok( - requestItem.requestHeaders, - "There should be a requestHeaders data available." - ); - is( - requestItem.requestHeaders.headers.length, - 10, - "The requestHeaders data has an incorrect |headers| property." - ); - isnot( - requestItem.requestHeaders.headersSize, - 0, - "The requestHeaders data has an incorrect |headersSize| property." - ); - // Can't test for the exact request headers size because the value may - // vary across platforms ("User-Agent" header differs). - - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS - ); - }); + expectEvent(TEST_EVENTS.RECEIVED_REQUEST_HEADERS, async () => { + await waitForRequestData(store, ["requestHeaders"]); - expectEvent(TEST_EVENTS.RECEIVED_REQUEST_COOKIES, async () => { - await waitForRequestData(store, ["requestCookies"]); + const requestItem = getSortedRequests(store.getState())[0]; - const requestItem = getSortedRequests(store.getState())[0]; + ok( + requestItem.requestHeaders, + "There should be a requestHeaders data available." + ); + is( + requestItem.requestHeaders.headers.length, + 10, + "The requestHeaders data has an incorrect |headers| property." + ); + isnot( + requestItem.requestHeaders.headersSize, + 0, + "The requestHeaders data has an incorrect |headersSize| property." + ); + // Can't test for the exact request headers size because the value may + // vary across platforms ("User-Agent" header differs). + + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS + ); + }); - ok( - requestItem.requestCookies, - "There should be a requestCookies data available." - ); - is( - requestItem.requestCookies.length, - 2, - "The requestCookies data has an incorrect |cookies| property." - ); + expectEvent(TEST_EVENTS.RECEIVED_REQUEST_COOKIES, async () => { + await waitForRequestData(store, ["requestCookies"]); - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS - ); - }); + const requestItem = getSortedRequests(store.getState())[0]; - monitor.panelWin.api.once(TEST_EVENTS.RECEIVED_REQUEST_POST_DATA, () => { - ok(false, "Trap listener: this request doesn't have any post data."); - }); + ok( + requestItem.requestCookies, + "There should be a requestCookies data available." + ); + is( + requestItem.requestCookies.length, + 2, + "The requestCookies data has an incorrect |cookies| property." + ); - expectEvent(TEST_EVENTS.RECEIVED_RESPONSE_HEADERS, async () => { - await waitForRequestData(store, ["responseHeaders"]); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS + ); + }); - const requestItem = getSortedRequests(store.getState())[0]; + monitor.panelWin.api.once(TEST_EVENTS.RECEIVED_REQUEST_POST_DATA, () => { + ok(false, "Trap listener: this request doesn't have any post data."); + }); - ok( - requestItem.responseHeaders, - "There should be a responseHeaders data available." - ); - is( - requestItem.responseHeaders.headers.length, - 13, - "The responseHeaders data has an incorrect |headers| property." - ); - is( - requestItem.responseHeaders.headersSize, - 335, - "The responseHeaders data has an incorrect |headersSize| property." - ); + expectEvent(TEST_EVENTS.RECEIVED_RESPONSE_HEADERS, async () => { + await waitForRequestData(store, ["responseHeaders"]); - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS - ); - }); + const requestItem = getSortedRequests(store.getState())[0]; - expectEvent(TEST_EVENTS.RECEIVED_RESPONSE_COOKIES, async () => { - await waitForRequestData(store, ["responseCookies"]); + ok( + requestItem.responseHeaders, + "There should be a responseHeaders data available." + ); + is( + requestItem.responseHeaders.headers.length, + 13, + "The responseHeaders data has an incorrect |headers| property." + ); + is( + requestItem.responseHeaders.headersSize, + 335, + "The responseHeaders data has an incorrect |headersSize| property." + ); - const requestItem = getSortedRequests(store.getState())[0]; + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS + ); + }); - ok( - requestItem.responseCookies, - "There should be a responseCookies data available." - ); - is( - requestItem.responseCookies.length, - 2, - "The responseCookies data has an incorrect |cookies| property." - ); + expectEvent(TEST_EVENTS.RECEIVED_RESPONSE_COOKIES, async () => { + await waitForRequestData(store, ["responseCookies"]); - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS - ); - }); + const requestItem = getSortedRequests(store.getState())[0]; - expectEvent(TEST_EVENTS.STARTED_RECEIVING_RESPONSE, async () => { - await waitForRequestData(store, [ - "httpVersion", - "status", - "statusText", - "headersSize", - ]); + ok( + requestItem.responseCookies, + "There should be a responseCookies data available." + ); + is( + requestItem.responseCookies.length, + 2, + "The responseCookies data has an incorrect |cookies| property." + ); - const requestItem = getSortedRequests(store.getState())[0]; + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS + ); + }); - is( - requestItem.httpVersion, - "HTTP/1.1", - "The httpVersion data has an incorrect value." - ); - is( - requestItem.status, - "200", - "The status data has an incorrect value." - ); - is( - requestItem.statusText, - "Och Aye", - "The statusText data has an incorrect value." - ); - is( - requestItem.headersSize, - 335, - "The headersSize data has an incorrect value." - ); + expectEvent(TEST_EVENTS.STARTED_RECEIVING_RESPONSE, async () => { + await waitForRequestData(store, [ + "httpVersion", + "status", + "statusText", + "headersSize", + ]); - const requestListItem = document.querySelector(".request-list-item"); - requestListItem.scrollIntoView(); - const requestsListStatus = - requestListItem.querySelector(".status-code"); - EventUtils.sendMouseEvent({ type: "mouseover" }, requestsListStatus); - await waitUntil(() => requestsListStatus.title); - await waitForDOMIfNeeded( - requestListItem, - ".requests-list-timings-total" - ); + const requestItem = getSortedRequests(store.getState())[0]; - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS, - { - status: "200", - statusText: "Och Aye", - } - ); - }); + is( + requestItem.httpVersion, + "HTTP/1.1", + "The httpVersion data has an incorrect value." + ); + is(requestItem.status, "200", "The status data has an incorrect value."); + is( + requestItem.statusText, + "Och Aye", + "The statusText data has an incorrect value." + ); + is( + requestItem.headersSize, + 335, + "The headersSize data has an incorrect value." + ); - expectEvent(EVENTS.PAYLOAD_READY, async () => { - await waitForRequestData(store, [ - "transferredSize", - "contentSize", - "mimeType", - ]); + const requestListItem = document.querySelector(".request-list-item"); + requestListItem.scrollIntoView(); + const requestsListStatus = requestListItem.querySelector(".status-code"); + EventUtils.sendMouseEvent({ type: "mouseover" }, requestsListStatus); + await waitUntil(() => requestsListStatus.title); + await waitForDOMIfNeeded(requestListItem, ".requests-list-timings-total"); + + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS, + { + status: "200", + statusText: "Och Aye", + } + ); + }); - const requestItem = getSortedRequests(store.getState())[0]; + expectEvent(EVENTS.PAYLOAD_READY, async () => { + await waitForRequestData(store, [ + "transferredSize", + "contentSize", + "mimeType", + ]); - is( - requestItem.transferredSize, - 347, - "The transferredSize data has an incorrect value." - ); - is( - requestItem.contentSize, - 12, - "The contentSize data has an incorrect value." - ); - is( - requestItem.mimeType, - "text/plain; charset=utf-8", - "The mimeType data has an incorrect value." - ); + const requestItem = getSortedRequests(store.getState())[0]; - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS, - { - type: "plain", - fullMimeType: "text/plain; charset=utf-8", - transferred: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 347), - size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 12), - } - ); - }); + is( + requestItem.transferredSize, + 347, + "The transferredSize data has an incorrect value." + ); + is( + requestItem.contentSize, + 12, + "The contentSize data has an incorrect value." + ); + is( + requestItem.mimeType, + "text/plain; charset=utf-8", + "The mimeType data has an incorrect value." + ); - expectEvent(EVENTS.UPDATING_EVENT_TIMINGS, async () => { - await waitForRequestData(store, ["eventTimings"]); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS, + { + type: "plain", + fullMimeType: "text/plain; charset=utf-8", + transferred: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 347), + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 12), + } + ); + }); - const requestItem = getSortedRequests(store.getState())[0]; + expectEvent(EVENTS.UPDATING_EVENT_TIMINGS, async () => { + await waitForRequestData(store, ["eventTimings"]); - is( - typeof requestItem.totalTime, - "number", - "The attached totalTime is incorrect." - ); - Assert.greaterOrEqual( - requestItem.totalTime, - 0, - "The attached totalTime should be positive." - ); + const requestItem = getSortedRequests(store.getState())[0]; - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS, - { - time: true, - } - ); - }); + is( + typeof requestItem.totalTime, + "number", + "The attached totalTime is incorrect." + ); + Assert.greaterOrEqual( + requestItem.totalTime, + 0, + "The attached totalTime should be positive." + ); - expectEvent(EVENTS.RECEIVED_EVENT_TIMINGS, async () => { - await waitForRequestData(store, ["eventTimings"]); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS, + { + time: true, + } + ); + }); - const requestItem = getSortedRequests(store.getState())[0]; + expectEvent(EVENTS.RECEIVED_EVENT_TIMINGS, async () => { + await waitForRequestData(store, ["eventTimings"]); - ok( - requestItem.eventTimings, - "There should be a eventTimings data available." - ); - is( - typeof requestItem.eventTimings.timings.blocked, - "number", - "The eventTimings data has an incorrect |timings.blocked| property." - ); - is( - typeof requestItem.eventTimings.timings.dns, - "number", - "The eventTimings data has an incorrect |timings.dns| property." - ); - is( - typeof requestItem.eventTimings.timings.ssl, - "number", - "The eventTimings data has an incorrect |timings.ssl| property." - ); - is( - typeof requestItem.eventTimings.timings.connect, - "number", - "The eventTimings data has an incorrect |timings.connect| property." - ); - is( - typeof requestItem.eventTimings.timings.send, - "number", - "The eventTimings data has an incorrect |timings.send| property." - ); - is( - typeof requestItem.eventTimings.timings.wait, - "number", - "The eventTimings data has an incorrect |timings.wait| property." - ); - is( - typeof requestItem.eventTimings.timings.receive, - "number", - "The eventTimings data has an incorrect |timings.receive| property." - ); - is( - typeof requestItem.eventTimings.totalTime, - "number", - "The eventTimings data has an incorrect |totalTime| property." - ); + const requestItem = getSortedRequests(store.getState())[0]; - verifyRequestItemTarget( - document, - getDisplayedRequests(store.getState()), - requestItem, - "GET", - SIMPLE_SJS, - { - time: true, - } - ); - }); + ok( + requestItem.eventTimings, + "There should be a eventTimings data available." + ); + is( + typeof requestItem.eventTimings.timings.blocked, + "number", + "The eventTimings data has an incorrect |timings.blocked| property." + ); + is( + typeof requestItem.eventTimings.timings.dns, + "number", + "The eventTimings data has an incorrect |timings.dns| property." + ); + is( + typeof requestItem.eventTimings.timings.ssl, + "number", + "The eventTimings data has an incorrect |timings.ssl| property." + ); + is( + typeof requestItem.eventTimings.timings.connect, + "number", + "The eventTimings data has an incorrect |timings.connect| property." + ); + is( + typeof requestItem.eventTimings.timings.send, + "number", + "The eventTimings data has an incorrect |timings.send| property." + ); + is( + typeof requestItem.eventTimings.timings.wait, + "number", + "The eventTimings data has an incorrect |timings.wait| property." + ); + is( + typeof requestItem.eventTimings.timings.receive, + "number", + "The eventTimings data has an incorrect |timings.receive| property." + ); + is( + typeof requestItem.eventTimings.totalTime, + "number", + "The eventTimings data has an incorrect |totalTime| property." + ); - const wait = waitForNetworkEvents(monitor, 1); - await reloadBrowser(); - await wait; + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + requestItem, + "GET", + SIMPLE_SJS, + { + time: true, + } + ); + }); - const requestItem = getSortedRequests(store.getState())[0]; + const wait = waitForNetworkEvents(monitor, 1); + await reloadBrowser(); + await wait; - if (!requestItem.requestHeaders) { - connector.requestData(requestItem.id, "requestHeaders"); - } - if (!requestItem.responseHeaders) { - connector.requestData(requestItem.id, "responseHeaders"); - } + const requestItem = getSortedRequests(store.getState())[0]; - await Promise.all(promiseList); - await teardown(monitor); - finish(); + if (!requestItem.requestHeaders) { + connector.requestData(requestItem.id, "requestHeaders"); } - ); + if (!requestItem.responseHeaders) { + connector.requestData(requestItem.id, "responseHeaders"); + } + + await Promise.all(promiseList); + await teardown(monitor); + finish(); + }); } diff --git a/devtools/client/netmonitor/test/head.js b/devtools/client/netmonitor/test/head.js index 5ca3466964..b171b51715 100644 --- a/devtools/client/netmonitor/test/head.js +++ b/devtools/client/netmonitor/test/head.js @@ -878,7 +878,7 @@ function testFilterButtonsCustom(monitor, isChecked) { * */ function promiseXHR(data) { - return new Promise((resolve, reject) => { + return new Promise(resolve => { const xhr = new content.XMLHttpRequest(); const method = data.method || "GET"; @@ -891,7 +891,7 @@ function promiseXHR(data) { xhr.addEventListener( "loadend", - function (event) { + function () { resolve({ status: xhr.status, response: xhr.response }); }, { once: true } @@ -925,7 +925,7 @@ function promiseXHR(data) { * */ function promiseWS(data) { - return new Promise((resolve, reject) => { + return new Promise(resolve => { let url = data.url; if (data.nocache) { @@ -936,7 +936,7 @@ function promiseWS(data) { const socket = new content.WebSocket(url); /* Since we only use HTTP server to mock websocket, so just ignore the error */ - socket.onclose = e => { + socket.onclose = () => { socket.close(); resolve({ status: 101, @@ -944,7 +944,7 @@ function promiseWS(data) { }); }; - socket.onerror = e => { + socket.onerror = () => { socket.close(); resolve({ status: 101, @@ -1156,7 +1156,11 @@ function checkTelemetryEvent(expectedEvent, query) { is(events.length, 1, "There was only 1 event logged"); const [event] = events; - ok(event.session_id > 0, "There is a valid session_id in the logged event"); + Assert.greater( + Number(event.session_id), + 0, + "There is a valid session_id in the logged event" + ); const f = e => JSON.stringify(e, null, 2); is( @@ -1391,7 +1395,7 @@ function clickElement(element, monitor) { * Target browser to observe the favicon load. */ function registerFaviconNotifier(browser) { - const listener = async (name, data) => { + const listener = async name => { if (name == "SetIcon" || name == "SetFailedIcon") { await SpecialPowers.spawn(browser, [], async () => { content.document diff --git a/devtools/client/netmonitor/test/html_custom-get-page.html b/devtools/client/netmonitor/test/html_custom-get-page.html index b44bf754a4..db4e45e81c 100644 --- a/devtools/client/netmonitor/test/html_custom-get-page.html +++ b/devtools/client/netmonitor/test/html_custom-get-page.html @@ -45,7 +45,7 @@ // For testing the offline mode in the netmonitor let isOfflineEventFired = false; - window.addEventListener("offline", (event) => { + window.addEventListener("offline", () => { isOfflineEventFired = true }, { once: true }); diff --git a/devtools/client/netmonitor/test/html_pause-test-page.html b/devtools/client/netmonitor/test/html_pause-test-page.html index a4ed668ce8..a093ae9c06 100644 --- a/devtools/client/netmonitor/test/html_pause-test-page.html +++ b/devtools/client/netmonitor/test/html_pause-test-page.html @@ -19,7 +19,7 @@ "use strict"; function performRequests(url) { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { const xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onreadystatechange = function() { diff --git a/devtools/client/netmonitor/test/html_post-json-test-page.html b/devtools/client/netmonitor/test/html_post-json-test-page.html index 8c18e91dbb..b6c734c192 100644 --- a/devtools/client/netmonitor/test/html_post-json-test-page.html +++ b/devtools/client/netmonitor/test/html_post-json-test-page.html @@ -18,7 +18,7 @@ /* exported performRequests performLargePostDataRequest */ "use strict"; - function post(address, message, callback) { + function post(address, message) { return new Promise(resolve => { const xhr = new XMLHttpRequest(); xhr.open("POST", address, true); diff --git a/devtools/client/netmonitor/test/html_sse-test-page.html b/devtools/client/netmonitor/test/html_sse-test-page.html index bb726d4c1f..7f3fd33bfb 100644 --- a/devtools/client/netmonitor/test/html_sse-test-page.html +++ b/devtools/client/netmonitor/test/html_sse-test-page.html @@ -20,7 +20,7 @@ function openConnection() { return new Promise(resolve => { es = new EventSource("sjs_sse-test-server.sjs"); - es.onmessage = function (e) { + es.onmessage = function () { es.close(); resolve(); }; diff --git a/devtools/client/netmonitor/test/html_ws-sse-test-page.html b/devtools/client/netmonitor/test/html_ws-sse-test-page.html index 8936efa81e..637848eea3 100644 --- a/devtools/client/netmonitor/test/html_ws-sse-test-page.html +++ b/devtools/client/netmonitor/test/html_ws-sse-test-page.html @@ -22,7 +22,7 @@ "ws://mochi.test:8888/browser/devtools/client/netmonitor/test/file_ws_backend" ); - ws.onopen = e => { + ws.onopen = () => { for (let i = 0; i < numFramesToSend; i++) { ws.send("Payload " + i); } @@ -33,7 +33,7 @@ function closeWsConnection() { return new Promise(resolve => { - ws.onclose = e => { + ws.onclose = () => { resolve(); }; ws.close(); @@ -48,7 +48,7 @@ function openSseConnection() { return new Promise(resolve => { es = new EventSource("sjs_sse-test-server.sjs"); - es.onmessage = function(e) { + es.onmessage = function() { es.close(); resolve(); }; diff --git a/devtools/client/netmonitor/test/html_ws-test-page.html b/devtools/client/netmonitor/test/html_ws-test-page.html index de32b2a18a..7abcd033ed 100644 --- a/devtools/client/netmonitor/test/html_ws-test-page.html +++ b/devtools/client/netmonitor/test/html_ws-test-page.html @@ -21,7 +21,7 @@ ws = new WebSocket( "ws://mochi.test:8888/browser/devtools/client/netmonitor/test/file_ws_backend"); - ws.onopen = e => { + ws.onopen = () => { for (let i = 0; i < numFramesToSend; i++) { ws.send("Payload " + i); } @@ -41,7 +41,7 @@ function closeConnection() { return new Promise(resolve => { - ws.onclose = e => { + ws.onclose = () => { resolve(); } ws.close(); diff --git a/devtools/client/netmonitor/test/service-workers/status-codes.html b/devtools/client/netmonitor/test/service-workers/status-codes.html index 05664d13a7..cb6f8fc535 100644 --- a/devtools/client/netmonitor/test/service-workers/status-codes.html +++ b/devtools/client/netmonitor/test/service-workers/status-codes.html @@ -39,7 +39,7 @@ }, {once: true}); } }); - }).catch(err => { + }).catch(() => { console.error("Registration failed"); }); } diff --git a/devtools/client/performance-new/@types/gecko.d.ts b/devtools/client/performance-new/@types/gecko.d.ts index e03844cb34..f5da78697e 100644 --- a/devtools/client/performance-new/@types/gecko.d.ts +++ b/devtools/client/performance-new/@types/gecko.d.ts @@ -59,6 +59,8 @@ declare namespace MockedExports { addMessageListener: (event: string, listener: (event: any) => void) => void; } + // This is the thing in window.gBrowser, defined in + // https://searchfox.org/mozilla-central/source/browser/base/content/tabbrowser.js interface Browser { addWebTab: (url: string, options: any) => BrowserTab; contentPrincipal: any; @@ -68,28 +70,19 @@ declare namespace MockedExports { ownerDocument?: ChromeDocument; } + // This is a tab in a browser, defined in + // https://searchfox.org/mozilla-central/rev/6b8a3f804789fb865f42af54e9d2fef9dd3ec74d/browser/base/content/tabbrowser.js#2580 interface BrowserTab { - linkedBrowser: Browser; + linkedBrowser: ChromeBrowser; } - interface ChromeWindow { + interface BrowserWindow extends Window { gBrowser: Browser; focus(): void; - openWebLinkIn( - url: string, - where: "current" | "tab" | "window", - options: Partial<{ - // Not all possible options are present, please add more if/when needed. - userContextId: number; - forceNonPrivate: boolean; - relatedToCurrent: boolean; - resolveOnContentBrowserCreated: ( - contentBrowser: ChromeBrowser - ) => unknown; - }> - ): void; } + // The thing created in https://searchfox.org/mozilla-central/rev/6b8a3f804789fb865f42af54e9d2fef9dd3ec74d/browser/base/content/tabbrowser.js#2088 + // This is linked to BrowserTab. interface ChromeBrowser { browsingContext?: BrowsingContext; } @@ -196,11 +189,11 @@ declare namespace MockedExports { removeObserver: (observer: object, type: string) => void; }; wm: { - getMostRecentWindow: (name: string) => ChromeWindow; - getMostRecentNonPBWindow: (name: string) => ChromeWindow; + getMostRecentWindow: (name: string) => BrowserWindow; + getMostRecentNonPBWindow: (name: string) => BrowserWindow; }; focus: { - activeWindow: ChromeWindow; + activeWindow: BrowserWindow; }; io: { newURI(url: string): nsIURI; @@ -249,7 +242,7 @@ declare namespace MockedExports { class nsIFilePicker {} interface FilePicker { - init: (window: Window, title: string, mode: number) => void; + init: (browsingContext: BrowsingContext, title: string, mode: number) => void; open: (callback: (rv: number) => unknown) => void; // The following are enum values. modeGetFolder: number; @@ -404,22 +397,48 @@ declare interface XULElement extends HTMLElement { } declare interface XULIframeElement extends XULElement { - contentWindow: ChromeWindow; + contentWindow: Window; src: string; } -declare interface ChromeWindow extends Window { +// `declare interface Window` is TypeScript way to let us implicitely extend and +// augment the already existing Window interface defined in the TypeScript library. +// This makes it possible to define properties that exist in the window object +// while in a privileged context. We assume that all of the environments we run +// in this project will be pribileged, that's why we take this shortcut of +// globally extending the Window type. +// See the ChromeOnly attributes in https://searchfox.org/mozilla-central/rev/896042a1a71066254ceb5291f016ca3dbca21cb7/dom/webidl/Window.webidl#391 +// +// openWebLinkIn and openTrustedLinkIn aren't in all privileged windows, but +// they're also defined in the privileged environments we're dealing with in +// this project, so they're defined here for convenience. +declare interface Window { + browsingContext: MockedExports.BrowsingContext; openWebLinkIn: ( url: string, where: "current" | "tab" | "tabshifted" | "window" | "save", - // TS-TODO - params?: unknown + options?: Partial<{ + // Not all possible options are present, please add more if/when needed. + userContextId: number; + forceNonPrivate: boolean; + relatedToCurrent: boolean; + resolveOnContentBrowserCreated: ( + contentBrowser: MockedExports.ChromeBrowser + ) => unknown; + }> ) => void; openTrustedLinkIn: ( url: string, where: "current" | "tab" | "tabshifted" | "window" | "save", - // TS-TODO - params?: unknown + options?: Partial<{ + // Not all possible options are present, please add more if/when needed. + userContextId: number; + forceNonPrivate: boolean; + relatedToCurrent: boolean; + resolveOnContentBrowserCreated: ( + contentBrowser: MockedExports.ChromeBrowser + ) => unknown; + }> ) => void; } diff --git a/devtools/client/performance-new/@types/perf.d.ts b/devtools/client/performance-new/@types/perf.d.ts index 2c7ec7f0b4..fb8790bbc1 100644 --- a/devtools/client/performance-new/@types/perf.d.ts +++ b/devtools/client/performance-new/@types/perf.d.ts @@ -474,6 +474,7 @@ export type RequestFromFrontend = | StatusQueryRequest | EnableMenuButtonRequest | GetProfileRequest + | GetExternalMarkersRequest | GetExternalPowerTracksRequest | GetSymbolTableRequest | QuerySymbolicationApiRequest; @@ -481,6 +482,11 @@ export type RequestFromFrontend = type StatusQueryRequest = { type: "STATUS_QUERY" }; type EnableMenuButtonRequest = { type: "ENABLE_MENU_BUTTON" }; type GetProfileRequest = { type: "GET_PROFILE" }; +type GetExternalMarkersRequest = { + type: "GET_EXTERNAL_MARKERS", + startTime: number, + endTime: number, +}; type GetExternalPowerTracksRequest = { type: "GET_EXTERNAL_POWER_TRACKS", startTime: number, @@ -523,6 +529,7 @@ export type ResponseToFrontend = | StatusQueryResponse | EnableMenuButtonResponse | GetProfileResponse + | GetExternalMarkersResponse | GetExternalPowerTracksResponse | GetSymbolTableResponse | QuerySymbolicationApiResponse; @@ -549,6 +556,7 @@ type StatusQueryResponse = { }; type EnableMenuButtonResponse = void; type GetProfileResponse = ArrayBuffer | MinimallyTypedGeckoProfile; +type GetExternalMarkersResponse = Array<object>; type GetExternalPowerTracksResponse = Array<object>; type GetSymbolTableResponse = SymbolTableAsTuple; type QuerySymbolicationApiResponse = string; diff --git a/devtools/client/performance-new/panel/panel.js b/devtools/client/performance-new/panel/panel.js index d099f3c296..2377855d31 100644 --- a/devtools/client/performance-new/panel/panel.js +++ b/devtools/client/performance-new/panel/panel.js @@ -37,9 +37,9 @@ class PerformancePanel { * This is implemented (and overwritten) by the EventEmitter. Is there a way * to use mixins with JSDoc? * - * @param {string} eventName + * @param {string} _eventName */ - emit(eventName) {} + emit(_eventName) {} /** * Open is effectively an asynchronous constructor. diff --git a/devtools/client/performance-new/popup/logic.sys.mjs b/devtools/client/performance-new/popup/logic.sys.mjs index 174163d54b..9c10987ec1 100644 --- a/devtools/client/performance-new/popup/logic.sys.mjs +++ b/devtools/client/performance-new/popup/logic.sys.mjs @@ -36,6 +36,13 @@ const lazy = createLazyLoaders({ */ function selectElementsInPanelview(panelview) { const document = panelview.ownerDocument; + + // Forcefully cast the window to the type Window + /** @type {any} */ + const windowAny = document.defaultView; + /** @type {Window} */ + const window = windowAny; + /** * Get an element or throw an error if it's not found. This is more friendly * for TypeScript. @@ -54,16 +61,10 @@ function selectElementsInPanelview(panelview) { return element; } - // Forcefully cast the window to the type ChromeWindow. - /** @type {any} */ - const chromeWindowAny = document.defaultView; - /** @type {ChromeWindow} */ - const chromeWindow = chromeWindowAny; - return { document, panelview, - window: chromeWindow, + window, inactive: getElementById("PanelUI-profiler-inactive"), active: getElementById("PanelUI-profiler-active"), presetDescription: getElementById("PanelUI-profiler-content-description"), diff --git a/devtools/client/performance-new/popup/menu-button.sys.mjs b/devtools/client/performance-new/popup/menu-button.sys.mjs index f1aee09af4..3dfffb4098 100644 --- a/devtools/client/performance-new/popup/menu-button.sys.mjs +++ b/devtools/client/performance-new/popup/menu-button.sys.mjs @@ -32,10 +32,9 @@ const WIDGET_ID = "profiler-button"; /** * Add the profiler button to the navbar. * - * @param {ChromeDocument} document The browser's document. * @return {void} */ -function addToNavbar(document) { +function addToNavbar() { const { CustomizableUI } = lazy.CustomizableUI(); CustomizableUI.addWidgetToArea(WIDGET_ID, CustomizableUI.AREA_NAVBAR); @@ -173,7 +172,7 @@ function initialize(toggleProfilerKeyShortcuts) { /** * @type {(event: { target: ChromeHTMLElement | XULElement }) => void} */ - onViewHiding(event) { + onViewHiding() { // Clean-up the view. This removes all of the event listeners. for (const fn of panelState.cleanup) { fn(); @@ -292,8 +291,7 @@ function initialize(toggleProfilerKeyShortcuts) { }); }, - // @ts-ignore - Bug 1674368 - onCommand: event => { + onCommand: () => { if (Services.profiler.IsPaused()) { // A profile is already being captured, ignore this event. return; diff --git a/devtools/client/performance-new/shared/background.sys.mjs b/devtools/client/performance-new/shared/background.sys.mjs index f538500a42..4b19f68b71 100644 --- a/devtools/client/performance-new/shared/background.sys.mjs +++ b/devtools/client/performance-new/shared/background.sys.mjs @@ -63,7 +63,7 @@ const PREF_PREFIX = "devtools.performance.recording."; // capabilities of the WebChannel. The front-end can handle old WebChannel // versions and has a full list of versions and capabilities here: // https://github.com/firefox-devtools/profiler/blob/main/src/app-logic/web-channel.js -const CURRENT_WEBCHANNEL_VERSION = 2; +const CURRENT_WEBCHANNEL_VERSION = 3; const lazyRequire = {}; // eslint-disable-next-line mozilla/lazy-getter-object-name @@ -761,7 +761,7 @@ async function getResponseForMessage(request, browser) { // Enable the profiler menu button. const { ProfilerMenuButton } = lazy.ProfilerMenuButton(); - ProfilerMenuButton.addToNavbar(ownerDocument); + ProfilerMenuButton.addToNavbar(); // Dispatch the change event manually, so that the shortcuts will also be // added. @@ -817,6 +817,20 @@ async function getResponseForMessage(request, browser) { } return []; } + case "GET_EXTERNAL_MARKERS": { + const { startTime, endTime } = request; + const externalMarkersUrl = Services.prefs.getCharPref( + "devtools.performance.recording.markers.external-url", + "" + ); + if (externalMarkersUrl) { + const response = await fetch( + `${externalMarkersUrl}?start=${startTime}&end=${endTime}` + ); + return response.json(); + } + return []; + } default: console.error( "An unknown message type was received by the profiler's WebChannel handler.", diff --git a/devtools/client/performance-new/shared/browser.js b/devtools/client/performance-new/shared/browser.js index c97bb0a0ab..34f641cc1b 100644 --- a/devtools/client/performance-new/shared/browser.js +++ b/devtools/client/performance-new/shared/browser.js @@ -153,7 +153,11 @@ function openFilePickerForObjdir(window, objdirs, changeObjdirs) { const FilePicker = Cc["@mozilla.org/filepicker;1"].createInstance( Ci.nsIFilePicker ); - FilePicker.init(window, "Pick build directory", FilePicker.modeGetFolder); + FilePicker.init( + window.browsingContext, + "Pick build directory", + FilePicker.modeGetFolder + ); FilePicker.open(rv => { if (rv == FilePicker.returnOK) { const path = FilePicker.file.path; diff --git a/devtools/client/performance-new/store/actions.js b/devtools/client/performance-new/store/actions.js index 2bb7ce126c..970ce4e644 100644 --- a/devtools/client/performance-new/store/actions.js +++ b/devtools/client/performance-new/store/actions.js @@ -181,7 +181,7 @@ exports.startRecording = perfFront => { * @return {ThunkAction<Promise<MinimallyTypedGeckoProfile>>} */ exports.getProfileAndStopProfiler = perfFront => { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: "REQUESTING_PROFILE" }); const profile = await perfFront.getProfileAndStopProfiler(); dispatch({ type: "OBTAINED_PROFILE" }); @@ -195,7 +195,7 @@ exports.getProfileAndStopProfiler = perfFront => { * @return {ThunkAction<void>} */ exports.stopProfilerAndDiscardProfile = perfFront => { - return async ({ dispatch, getState }) => { + return async ({ dispatch }) => { dispatch({ type: "REQUESTING_TO_STOP_RECORDING" }); try { diff --git a/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button-preset.js b/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button-preset.js index 4732f8f037..aefcd175c9 100644 --- a/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button-preset.js +++ b/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button-preset.js @@ -33,7 +33,7 @@ add_task(async function test() { ); // Enable the profiler menu button with web channel. - await withWebChannelTestDocument(async browser => { + await withWebChannelTestDocument(async _browser => { await waitForTabTitle("WebChannel Page Ready"); await waitForProfilerMenuButton(); ok(true, "The profiler menu button was enabled by the WebChannel."); diff --git a/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button.js b/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button.js index a1864c475d..23d72225e5 100644 --- a/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button.js +++ b/devtools/client/performance-new/test/browser/browser_webchannel-enable-menu-button.js @@ -8,7 +8,7 @@ add_task(async function test() { info("Test the WebChannel mechanism works for turning on the menu button."); await makeSureProfilerPopupIsDisabled(); - await withWebChannelTestDocument(async browser => { + await withWebChannelTestDocument(async () => { await waitForTabTitle("WebChannel Page Ready"); await waitForProfilerMenuButton(); ok(true, "The profiler menu button was enabled by the WebChannel."); diff --git a/devtools/client/preferences/debugger.js b/devtools/client/preferences/debugger.js index d0c06158e4..1916d7a3df 100644 --- a/devtools/client/preferences/debugger.js +++ b/devtools/client/preferences/debugger.js @@ -61,3 +61,4 @@ pref("devtools.debugger.features.log-points", true); pref("devtools.debugger.features.inline-preview", true); pref("devtools.debugger.features.javascript-tracing", false); pref("devtools.debugger.features.codemirror-next", false); +pref("devtools.debugger.features.overlay", true); diff --git a/devtools/client/responsive/reducers/devices.js b/devtools/client/responsive/reducers/devices.js index 98f0602175..960ecc336a 100644 --- a/devtools/client/responsive/reducers/devices.js +++ b/devtools/client/responsive/reducers/devices.js @@ -70,21 +70,21 @@ const reducers = { }; }, - [LOAD_DEVICE_LIST_START](devices, action) { + [LOAD_DEVICE_LIST_START](devices) { return { ...devices, listState: Types.loadableState.LOADING, }; }, - [LOAD_DEVICE_LIST_ERROR](devices, action) { + [LOAD_DEVICE_LIST_ERROR](devices) { return { ...devices, listState: Types.loadableState.ERROR, }; }, - [LOAD_DEVICE_LIST_END](devices, action) { + [LOAD_DEVICE_LIST_END](devices) { return { ...devices, listState: Types.loadableState.LOADED, diff --git a/devtools/client/responsive/reducers/screenshot.js b/devtools/client/responsive/reducers/screenshot.js index 67f26f1f9a..dcf962a9eb 100644 --- a/devtools/client/responsive/reducers/screenshot.js +++ b/devtools/client/responsive/reducers/screenshot.js @@ -14,14 +14,14 @@ const INITIAL_SCREENSHOT = { }; const reducers = { - [TAKE_SCREENSHOT_END](screenshot, action) { + [TAKE_SCREENSHOT_END](screenshot) { return { ...screenshot, isCapturing: false, }; }, - [TAKE_SCREENSHOT_START](screenshot, action) { + [TAKE_SCREENSHOT_START](screenshot) { return { ...screenshot, isCapturing: true, diff --git a/devtools/client/responsive/test/browser/browser_device_pixel_ratio_change.js b/devtools/client/responsive/test/browser/browser_device_pixel_ratio_change.js index c11313a188..798cec8c5d 100644 --- a/devtools/client/responsive/test/browser/browser_device_pixel_ratio_change.js +++ b/devtools/client/responsive/test/browser/browser_device_pixel_ratio_change.js @@ -27,7 +27,7 @@ addDeviceForTest(testDevice); addRDMTask( TEST_URL, - async function ({ ui, manager }) { + async function ({ ui }) { await waitStartup(ui); await testDefaults(ui); diff --git a/devtools/client/responsive/test/browser/browser_device_state_restore.js b/devtools/client/responsive/test/browser/browser_device_state_restore.js index f8778795c2..8bfda3e5c6 100644 --- a/devtools/client/responsive/test/browser/browser_device_state_restore.js +++ b/devtools/client/responsive/test/browser/browser_device_state_restore.js @@ -75,7 +75,7 @@ addRDMTask( addRDMTaskWithPreAndPost( TEST_URL, - function rdmPreTask({ browser }) { + function rdmPreTask() { reloadOnUAChange(true); }, async function ({ ui }) { @@ -115,7 +115,7 @@ addRDMTaskWithPreAndPost( reloadOnUAChange(false); }, - function rdmPostTask({ browser }) {}, + function rdmPostTask() {}, { waitForDeviceList: true } ); diff --git a/devtools/client/responsive/test/browser/browser_ext_messaging.js b/devtools/client/responsive/test/browser/browser_ext_messaging.js index 5d1b5cf317..4704946976 100644 --- a/devtools/client/responsive/test/browser/browser_ext_messaging.js +++ b/devtools/client/responsive/test/browser/browser_ext_messaging.js @@ -120,7 +120,7 @@ addRDMTask(TEST_URL, async function test_tab_sender() { let extTab; const contentMessage = new Promise(resolve => { browser.test.log("Listen to content"); - const listener = async (msg, sender, respond) => { + const listener = async (msg, sender) => { browser.test.assertEq( msg, "hello-from-content", diff --git a/devtools/client/responsive/test/browser/browser_many_toggles.js b/devtools/client/responsive/test/browser/browser_many_toggles.js index a0fe19dba4..beb8e0eafa 100644 --- a/devtools/client/responsive/test/browser/browser_many_toggles.js +++ b/devtools/client/responsive/test/browser/browser_many_toggles.js @@ -21,7 +21,7 @@ addRDMTask( info(`Toggling RDM #${i + 1}`); // This may throw when we were just closing is still ongoing, // ignore any exception. - openRDM(tab).catch(e => {}); + openRDM(tab).catch(() => {}); // Sometime pause in order to cover both full synchronous opening and close // but also the same but with some pause between each operation. if (i % 2 == 0) { diff --git a/devtools/client/responsive/test/browser/browser_network_throttling.js b/devtools/client/responsive/test/browser/browser_network_throttling.js index fbf97b172a..a9d1c1f076 100644 --- a/devtools/client/responsive/test/browser/browser_network_throttling.js +++ b/devtools/client/responsive/test/browser/browser_network_throttling.js @@ -10,7 +10,7 @@ const { // Tests changing network throttling const TEST_URL = "data:text/html;charset=utf-8,Network throttling test"; -addRDMTask(TEST_URL, async function ({ ui, manager }) { +addRDMTask(TEST_URL, async function ({ ui }) { // Test defaults testNetworkThrottlingSelectorLabel(ui, "No Throttling", "No Throttling"); await testNetworkThrottlingState(ui, null); diff --git a/devtools/client/responsive/test/browser/browser_page_style.js b/devtools/client/responsive/test/browser/browser_page_style.js index c59ba03b47..7f470baa94 100644 --- a/devtools/client/responsive/test/browser/browser_page_style.js +++ b/devtools/client/responsive/test/browser/browser_page_style.js @@ -8,7 +8,7 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const TEST_URL = `${URL_ROOT}page_style.html`; -addRDMTask(TEST_URL, async function ({ ui, manager }) { +addRDMTask(TEST_URL, async function ({ ui }) { // Store the RDM body text color for later. const rdmWindow = ui.toolWindow; const rdmTextColor = rdmWindow.getComputedStyle( diff --git a/devtools/client/responsive/test/browser/browser_picker_link.js b/devtools/client/responsive/test/browser/browser_picker_link.js index 1aedb06dd0..6a7df43130 100644 --- a/devtools/client/responsive/test/browser/browser_picker_link.js +++ b/devtools/client/responsive/test/browser/browser_picker_link.js @@ -9,7 +9,7 @@ */ const TEST_URI = `${URL_ROOT}doc_picker_link.html`; -addRDMTask(TEST_URI, async function ({ ui, manager }) { +addRDMTask(TEST_URI, async function ({ ui }) { info("Open the rule-view and select the test node before opening RDM"); const { inspector, toolbox } = await openRuleView(); await selectNode("body", inspector); diff --git a/devtools/client/responsive/test/browser/browser_telemetry_activate_rdm.js b/devtools/client/responsive/test/browser/browser_telemetry_activate_rdm.js index 7c3927fb11..1ec8e5976d 100644 --- a/devtools/client/responsive/test/browser/browser_telemetry_activate_rdm.js +++ b/devtools/client/responsive/test/browser/browser_telemetry_activate_rdm.js @@ -111,6 +111,6 @@ async function checkResults() { // extras is(extra.host, expected.extra.host, "host is correct"); - ok(extra.width > 0, "width is greater than 0"); + Assert.greater(Number(extra.width), 0, "width is greater than 0"); } } diff --git a/devtools/client/responsive/test/browser/browser_touch_event_iframes.js b/devtools/client/responsive/test/browser/browser_touch_event_iframes.js index 11b94d2ab1..6ad963f4c0 100644 --- a/devtools/client/responsive/test/browser/browser_touch_event_iframes.js +++ b/devtools/client/responsive/test/browser/browser_touch_event_iframes.js @@ -72,7 +72,7 @@ for (const mvcontent of META_VIEWPORT_CONTENTS) { `style="margin:0; border:0; width:100%; height:100%"></iframe>` + `</body></html>`; - addRDMTask(TEST_URL, async function ({ ui, manager, browser }) { + addRDMTask(TEST_URL, async function ({ ui, manager }) { await setViewportSize(ui, manager, VIEWPORT_DIMENSION, VIEWPORT_DIMENSION); await setTouchAndMetaViewportSupport(ui, true); diff --git a/devtools/client/responsive/test/browser/browser_typeahead_find.js b/devtools/client/responsive/test/browser/browser_typeahead_find.js index 7bc22de1ef..2d162c074f 100644 --- a/devtools/client/responsive/test/browser/browser_typeahead_find.js +++ b/devtools/client/responsive/test/browser/browser_typeahead_find.js @@ -17,7 +17,7 @@ const TEST_URL = "data:text/html;charset=utf-8," + '<body id="body"><input id="input" type="text"/><p>text</body>'; -addRDMTask(TEST_URL, async function ({ ui, manager }) { +addRDMTask(TEST_URL, async function ({ ui }) { // Turn on the pref that allows meta viewport support. await pushPref("accessibility.typeaheadfind", true); diff --git a/devtools/client/responsive/test/browser/browser_viewport_changed_meta.js b/devtools/client/responsive/test/browser/browser_viewport_changed_meta.js index f0bafdd551..c5a13b407a 100644 --- a/devtools/client/responsive/test/browser/browser_viewport_changed_meta.js +++ b/devtools/client/responsive/test/browser/browser_viewport_changed_meta.js @@ -71,7 +71,7 @@ const TEST_URL = `data:text/html;charset=utf-8, </body> </html>`; -addRDMTask(TEST_URL, async function ({ ui, manager, browser }) { +addRDMTask(TEST_URL, async function ({ ui, manager }) { await setViewportSize(ui, manager, WIDTH, HEIGHT); await setTouchAndMetaViewportSupport(ui, true); diff --git a/devtools/client/responsive/test/browser/browser_viewport_zoom_toggle.js b/devtools/client/responsive/test/browser/browser_viewport_zoom_toggle.js index 400bfa99a9..d6d2625492 100644 --- a/devtools/client/responsive/test/browser/browser_viewport_zoom_toggle.js +++ b/devtools/client/responsive/test/browser/browser_viewport_zoom_toggle.js @@ -17,7 +17,7 @@ function setZoomForBrowser(browser, zoom) { addRDMTask( null, - async function ({ message }) { + async function () { const INITIAL_ZOOM_LEVEL = 1; const PRE_RDM_ZOOM_LEVEL = 1.5; const MID_RDM_ZOOM_LEVEL = 2; diff --git a/devtools/client/responsive/test/browser/geolocation.html b/devtools/client/responsive/test/browser/geolocation.html index df0014dd02..086bd7eaa8 100644 --- a/devtools/client/responsive/test/browser/geolocation.html +++ b/devtools/client/responsive/test/browser/geolocation.html @@ -7,7 +7,7 @@ <body> <script type="text/javascript"> "use strict"; - navigator.geolocation.getCurrentPosition(function(pos) {}); + navigator.geolocation.getCurrentPosition(function() {}); </script> </body> </html> diff --git a/devtools/client/responsive/test/browser/touch.html b/devtools/client/responsive/test/browser/touch.html index eed55426bd..c19f26cd8f 100644 --- a/devtools/client/responsive/test/browser/touch.html +++ b/devtools/client/responsive/test/browser/touch.html @@ -41,18 +41,18 @@ } }, true); - div.addEventListener("mouseenter", function (evt) { + div.addEventListener("mouseenter", function () { div.style.backgroundColor = "red"; }, true); - div.addEventListener("mouseover", function(evt) { + div.addEventListener("mouseover", function() { div.style.backgroundColor = "red"; }, true); - div.addEventListener("mouseout", function (evt) { + div.addEventListener("mouseout", function () { div.style.backgroundColor = "blue"; }, true); - div.addEventListener("mouseleave", function (evt) { + div.addEventListener("mouseleave", function () { div.style.backgroundColor = "blue"; }, true); diff --git a/devtools/client/responsive/ui.js b/devtools/client/responsive/ui.js index 713158d654..7784887eb3 100644 --- a/devtools/client/responsive/ui.js +++ b/devtools/client/responsive/ui.js @@ -56,8 +56,8 @@ const RELOAD_CONDITION_PREF_PREFIX = "devtools.responsive.reloadConditions."; const RELOAD_NOTIFICATION_PREF = "devtools.responsive.reloadNotification.enabled"; -function debug(msg) { - // console.log(`RDM manager: ${msg}`); +function debug(_msg) { + // console.log(`RDM manager: ${_msg}`); } /** diff --git a/devtools/client/shared/async-store-helper.js b/devtools/client/shared/async-store-helper.js index 0919a07b98..b24d56e629 100644 --- a/devtools/client/shared/async-store-helper.js +++ b/devtools/client/shared/async-store-helper.js @@ -41,7 +41,7 @@ function asyncStoreHelper(root, mappings) { ); store = new Proxy(store, { - set(target, property, value, receiver) { + set(target, property) { if (!mappings.hasOwnProperty(property)) { throw new Error(`AsyncStore: ${property} is not defined in mappings`); } diff --git a/devtools/client/shared/autocomplete-popup.js b/devtools/client/shared/autocomplete-popup.js index 93ebc8d688..81e6070f80 100644 --- a/devtools/client/shared/autocomplete-popup.js +++ b/devtools/client/shared/autocomplete-popup.js @@ -184,7 +184,7 @@ AutocompletePopup.prototype = { } }, - onInputBlur(event) { + onInputBlur() { if (this.isOpen) { this.clearItems(); this.hidePopup(); diff --git a/devtools/client/shared/components/SmartTrace.js b/devtools/client/shared/components/SmartTrace.js index d9613be7b8..a427bca86e 100644 --- a/devtools/client/shared/components/SmartTrace.js +++ b/devtools/client/shared/components/SmartTrace.js @@ -27,6 +27,9 @@ const { const { getDisplayURL, } = require("resource://devtools/client/debugger/src/utils/sources-tree/getURL.js"); +const { + getFormattedSourceId, +} = require("resource://devtools/client/debugger/src/utils/source.js"); class SmartTrace extends Component { static get propTypes() { @@ -253,8 +256,10 @@ class SmartTrace extends Component { // 'id' isn't used by Frames, but by selectFrame callback below id: sourceId, url: sourceUrl, - // 'displayURL' might be used by FrameComponent via getFilename - displayURL: getDisplayURL(sourceUrl), + // Used by FrameComponent + shortName: sourceUrl + ? getDisplayURL(sourceUrl).filename + : getFormattedSourceId(sourceId), }, }; let location = generatedLocation; @@ -265,8 +270,8 @@ class SmartTrace extends Component { column: originalLocation.column, source: { url: originalLocation.url, - // 'displayURL' might be used by FrameComponent via getFilename - displayURL: getDisplayURL(originalLocation.url), + // Used by FrameComponent + shortName: getDisplayURL(originalLocation.url).filename, }, }; } diff --git a/devtools/client/shared/components/Tree.js b/devtools/client/shared/components/Tree.js index b1e9e18780..23b725bcfe 100644 --- a/devtools/client/shared/components/Tree.js +++ b/devtools/client/shared/components/Tree.js @@ -51,7 +51,7 @@ class ArrowExpander extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return this.props.expanded !== nextProps.expanded; } @@ -555,11 +555,11 @@ class Tree extends Component { } // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507 - UNSAFE_componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps() { this._autoExpand(); } - componentDidUpdate(prevProps, prevState) { + componentDidUpdate(prevProps) { if (this.props.focused && prevProps.focused !== this.props.focused) { this._scrollNodeIntoView(this.props.focused); } diff --git a/devtools/client/shared/components/VirtualizedTree.js b/devtools/client/shared/components/VirtualizedTree.js index 4f8dab1bd5..de388a2e09 100644 --- a/devtools/client/shared/components/VirtualizedTree.js +++ b/devtools/client/shared/components/VirtualizedTree.js @@ -300,7 +300,7 @@ class Tree extends Component { } // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507 - UNSAFE_componentWillReceiveProps(nextProps) { + UNSAFE_componentWillReceiveProps() { this._autoExpand(); this._updateHeight(); } @@ -559,10 +559,8 @@ class Tree extends Component { /** * Fired on a scroll within the tree's container, updates * the stored position of the view port to handle virtual view rendering. - * - * @param {Event} e */ - _onScroll(e) { + _onScroll() { this.setState({ scroll: Math.max(this.refs.tree.scrollTop, 0), height: this.refs.tree.clientHeight, @@ -882,7 +880,7 @@ class ArrowExpanderClass extends Component { }; } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { return ( this.props.item !== nextProps.item || this.props.visible !== nextProps.visible || diff --git a/devtools/client/shared/components/menu/MenuButton.js b/devtools/client/shared/components/menu/MenuButton.js index 3367987c3c..4a3b1e5c48 100644 --- a/devtools/client/shared/components/menu/MenuButton.js +++ b/devtools/client/shared/components/menu/MenuButton.js @@ -427,9 +427,12 @@ class MenuButton extends PureComponent { buttonProps.className = buttonProps.className ? `${buttonProps.className} ${iconClass}` : iconClass; - buttonProps.style = { - "--menuitem-icon-image": "url(" + this.props.icon + ")", - }; + // `icon` may be a boolean and the icon URL will be set in CSS. + if (typeof this.props.icon == "string") { + buttonProps.style = { + "--menuitem-icon-image": "url(" + this.props.icon + ")", + }; + } } if (this.state.isMenuInitialized) { diff --git a/devtools/client/shared/components/menu/MenuList.js b/devtools/client/shared/components/menu/MenuList.js index 4c355cca10..dafcc407bc 100644 --- a/devtools/client/shared/components/menu/MenuList.js +++ b/devtools/client/shared/components/menu/MenuList.js @@ -55,7 +55,7 @@ class MenuList extends PureComponent { this.notifyHighlightedChildChange(e.target.id); } - onMouseOutOrBlur(e) { + onMouseOutOrBlur() { const hoveredElem = this.wrapperRef.querySelector(":hover"); if (!hoveredElem) { this.notifyHighlightedChildChange(null); diff --git a/devtools/client/shared/components/object-inspector/utils/node.js b/devtools/client/shared/components/object-inspector/utils/node.js index 1ee0255d1d..0d049e1c4b 100644 --- a/devtools/client/shared/components/object-inspector/utils/node.js +++ b/devtools/client/shared/components/object-inspector/utils/node.js @@ -282,7 +282,11 @@ function nodeHasEntries(item) { className === "FormData" || className === "MIDIInputMap" || className === "MIDIOutputMap" || - className === "HighlightRegistry" + className === "HighlightRegistry" || + // @backward-compat { version 125 } Support for enumerate CustomStateSet items was + // added in 125. When connecting to older server, we don't want to show the <entries> + // node for them. The extra check can be removed once 125 hits release. + (className === "CustomStateSet" && Array.isArray(value.preview?.items)) ); } diff --git a/devtools/client/shared/components/reps/reps/element-node.js b/devtools/client/shared/components/reps/reps/element-node.js index a31fb4225b..af38cc0f6f 100644 --- a/devtools/client/shared/components/reps/reps/element-node.js +++ b/devtools/client/shared/components/reps/reps/element-node.js @@ -180,7 +180,7 @@ define(function (require, exports, module) { attributeKeys.splice(attributeKeys.indexOf("id"), 1); attributeKeys.unshift("id"); } - const attributeElements = attributeKeys.reduce((arr, name, i, keys) => { + const attributeElements = attributeKeys.reduce((arr, name) => { const value = attributes[name]; let title = isLongString(value) ? value.initial : value; diff --git a/devtools/client/shared/components/reps/reps/error.js b/devtools/client/shared/components/reps/reps/error.js index 617bf8c8a2..688d10ba89 100644 --- a/devtools/client/shared/components/reps/reps/error.js +++ b/devtools/client/shared/components/reps/reps/error.js @@ -161,7 +161,7 @@ define(function (require, exports, module) { return stack; } - parseStackString(preview.stack).forEach((frame, index, frames) => { + parseStackString(preview.stack).forEach((frame, index) => { let onLocationClick; const { filename, lineNumber, columnNumber, functionName, location } = frame; diff --git a/devtools/client/shared/components/reps/reps/function.js b/devtools/client/shared/components/reps/reps/function.js index 54d8905c20..93d77b1392 100644 --- a/devtools/client/shared/components/reps/reps/function.js +++ b/devtools/client/shared/components/reps/reps/function.js @@ -118,7 +118,7 @@ define(function (require, exports, module) { return returnSpan; } - function getClassTitle(grip) { + function getClassTitle() { return span( { className: "objectTitle", diff --git a/devtools/client/shared/components/reps/reps/grip-map.js b/devtools/client/shared/components/reps/reps/grip-map.js index dcb7c50972..918e37ac8c 100644 --- a/devtools/client/shared/components/reps/reps/grip-map.js +++ b/devtools/client/shared/components/reps/reps/grip-map.js @@ -168,7 +168,7 @@ define(function (require, exports, module) { return a - b; }); - return indexes.map((index, i) => { + return indexes.map(index => { const [key, entryValue] = entries[index]; const value = entryValue.value !== undefined ? entryValue.value : entryValue; diff --git a/devtools/client/shared/components/reps/reps/grip.js b/devtools/client/shared/components/reps/reps/grip.js index 68f356858a..606ecfab8d 100644 --- a/devtools/client/shared/components/reps/reps/grip.js +++ b/devtools/client/shared/components/reps/reps/grip.js @@ -375,7 +375,7 @@ define(function (require, exports, module) { } // Registration - function supportsObject(object, noGrip = false) { + function supportsObject(object) { if (object?.class === "DeadObject") { return true; } diff --git a/devtools/client/shared/components/reps/reps/text-node.js b/devtools/client/shared/components/reps/reps/text-node.js index ae9a7bb109..474e647a9d 100644 --- a/devtools/client/shared/components/reps/reps/text-node.js +++ b/devtools/client/shared/components/reps/reps/text-node.js @@ -123,13 +123,13 @@ define(function (require, exports, module) { }); } - function getTitle(grip) { + function getTitle() { const title = "#text"; return span({}, title); } // Registration - function supportsObject(grip, noGrip = false) { + function supportsObject(grip) { return grip?.preview && grip?.class == "Text"; } diff --git a/devtools/client/shared/components/tabs/TabBar.js b/devtools/client/shared/components/tabs/TabBar.js index 730e8c7802..cbd1e927ae 100644 --- a/devtools/client/shared/components/tabs/TabBar.js +++ b/devtools/client/shared/components/tabs/TabBar.js @@ -73,7 +73,7 @@ class Tabbar extends Component { super(props, context); const { activeTabId, children = [] } = props; const tabs = this.createTabs(children); - const activeTab = tabs.findIndex((tab, index) => tab.id === activeTabId); + const activeTab = tabs.findIndex(tab => tab.id === activeTabId); this.state = { activeTab: activeTab === -1 ? 0 : activeTab, @@ -103,7 +103,7 @@ class Tabbar extends Component { UNSAFE_componentWillReceiveProps(nextProps) { const { activeTabId, children = [] } = nextProps; const tabs = this.createTabs(children); - const activeTab = tabs.findIndex((tab, index) => tab.id === activeTabId); + const activeTab = tabs.findIndex(tab => tab.id === activeTabId); if ( activeTab !== this.state.activeTab || diff --git a/devtools/client/shared/components/tabs/Tabs.js b/devtools/client/shared/components/tabs/Tabs.js index a265032f9e..bbb061503e 100644 --- a/devtools/client/shared/components/tabs/Tabs.js +++ b/devtools/client/shared/components/tabs/Tabs.js @@ -4,7 +4,7 @@ "use strict"; -define(function (require, exports, module) { +define(function (require, exports) { const { Component, createRef, diff --git a/devtools/client/shared/components/test/chrome/test_list_keyboard.html b/devtools/client/shared/components/test/chrome/test_list_keyboard.html index 7558404ed2..f350c1241c 100644 --- a/devtools/client/shared/components/test/chrome/test_list_keyboard.html +++ b/devtools/client/shared/components/test/chrome/test_list_keyboard.html @@ -76,6 +76,27 @@ window.onload = function() { el.focus(); } + function getExpectedActiveElementForFinalShiftTab() { + if (!SpecialPowers.getBoolPref("dom.disable_tab_focus_to_root_element")) { + return listEl.ownerDocument.documentElement; + } + + // When tab focus mode is applied, the "Run Chrome Tests" button is not + // focusable, so this Shift+Tab moves the focus to a Chrome UI element + // instead of the "Run Chrome Tests" button, which makes the focus to + // move to a browsing context that has a different top level browsing context + // than the current browsing context. Since top level browsing contexts are + // different, the activeElement in the old document is not cleared. Also + // this is only the case when e10s is enabled. + if (SpecialPowers.getBoolPref("accessibility.tabfocus_applies_to_xul") && + SpecialPowers.Services.appinfo.browserTabsRemoteAutostart) { + return listEl; + } + + // <body> + return defaultFocus; + } + const tests = [{ name: "Test default List state. Keyboard focus is set to document body by default.", state: { current: null, active: null }, @@ -246,7 +267,7 @@ window.onload = function() { synthesizeKey("KEY_Tab", { shiftKey: true }); }, state: { current: 0, active: null }, - activeElement: listEl.ownerDocument.documentElement, + activeElement: getExpectedActiveElementForFinalShiftTab(), }]; for (const test of tests) { diff --git a/devtools/client/shared/components/test/chrome/test_notification_box_04.html b/devtools/client/shared/components/test/chrome/test_notification_box_04.html index 07ad9af25c..fde11a7bff 100644 --- a/devtools/client/shared/components/test/chrome/test_notification_box_04.html +++ b/devtools/client/shared/components/test/chrome/test_notification_box_04.html @@ -43,7 +43,7 @@ window.onload = async function () { null, PriorityLevels.PRIORITY_INFO_LOW, [mdnLinkButton], - (e) => false, + () => false, ); const linkNode = notificationNode.querySelector( diff --git a/devtools/client/shared/components/test/chrome/test_notification_box_05.html b/devtools/client/shared/components/test/chrome/test_notification_box_05.html index b3a4e96378..10d6b8971f 100644 --- a/devtools/client/shared/components/test/chrome/test_notification_box_05.html +++ b/devtools/client/shared/components/test/chrome/test_notification_box_05.html @@ -42,7 +42,7 @@ window.onload = async function () { null, PriorityLevels.PRIORITY_INFO_LOW, [], - (e) => false, + () => false, ); // Ensure close button is not present diff --git a/devtools/client/shared/components/test/chrome/test_tree-view_01.html b/devtools/client/shared/components/test/chrome/test_tree-view_01.html index 0acae4c1dc..7a97dfa917 100644 --- a/devtools/client/shared/components/test/chrome/test_tree-view_01.html +++ b/devtools/client/shared/components/test/chrome/test_tree-view_01.html @@ -63,6 +63,26 @@ window.onload = function() { el.focus(); } + function getExpectedActiveElementForFinalShiftTab() { + if (!SpecialPowers.getBoolPref("dom.disable_tab_focus_to_root_element")) { + return treeViewEl.ownerDocument.documentElement; + } + + // When tab focus mode is applied, the "Run Chrome Tests" button is not + // focusable, so this Shift+Tab moves the focus to a Chrome UI element + // instead of the "Run Chrome Tests" button, which makes the focus to + // move to a browsing context that has a different top level browsing context + // than the current browsing context. Since top level browsing contexts are + // different, the activeElement in the old document is not cleared. Also + // this is only the case when e10s is enabled. + if (SpecialPowers.getBoolPref("accessibility.tabfocus_applies_to_xul") && + SpecialPowers.Services.appinfo.browserTabsRemoteAutostart) { + return treeViewEl; + } + + return treeViewEl.ownerDocument.body; + } + const tests = [{ name: "Test default TreeView state. Keyboard focus is set to document " + "body by default.", @@ -255,8 +275,9 @@ window.onload = function() { synthesizeKey("KEY_Tab", { shiftKey: true }); }, state: { selected: "/B", active: null }, - activeElement: treeViewEl.ownerDocument.documentElement, - }]; + activeElement: getExpectedActiveElementForFinalShiftTab(), + } + ]; for (const test of tests) { const { action, event, state, name } = test; diff --git a/devtools/client/shared/components/test/chrome/test_tree_14.html b/devtools/client/shared/components/test/chrome/test_tree_14.html index d68d87d6c5..65557b167c 100644 --- a/devtools/client/shared/components/test/chrome/test_tree_14.html +++ b/devtools/client/shared/components/test/chrome/test_tree_14.html @@ -82,6 +82,26 @@ window.onload = async function() { }, }; + function getExpectedActiveElementForFinalShiftTab() { + if (!SpecialPowers.getBoolPref("dom.disable_tab_focus_to_root_element")) { + return document.documentElement; + } + + // When tab focus mode is applied, the "Run Chrome Tests" button is not + // focusable, so this Shift+Tab moves the focus to a Chrome UI element + // instead of the "Run Chrome Tests" button, which makes the focus to + // move to a browsing context that has a different top level browsing context + // than the current browsing context. Since top level browsing contexts are + // different, the activeElement in the old document is not cleared. Also + // this is only the case when e10s is enabled. + if (SpecialPowers.getBoolPref("accessibility.tabfocus_applies_to_xul") && + SpecialPowers.Services.appinfo.browserTabsRemoteAutostart) { + return "tree"; + } + + return document.body; + } + const tests = [{ name: "Test default Tree props. Keyboard focus is set to document body by default.", props: { focused: undefined, active: undefined }, @@ -204,7 +224,7 @@ window.onload = async function() { synthesizeKey("KEY_Tab", { shiftKey: true }); }, props: { focused: "A", active: null }, - activeElement: document.documentElement, + activeElement: getExpectedActiveElementForFinalShiftTab(), }]; for (const test of tests) { diff --git a/devtools/client/shared/components/test/node/__mocks__/object-front.js b/devtools/client/shared/components/test/node/__mocks__/object-front.js index def182111d..5913deb82e 100644 --- a/devtools/client/shared/components/test/node/__mocks__/object-front.js +++ b/devtools/client/shared/components/test/node/__mocks__/object-front.js @@ -14,7 +14,7 @@ function ObjectFront(grip, overrides) { }) ); }, - enumProperties(options) { + enumProperties() { return Promise.resolve( this.getIterator({ ownProperties: {}, @@ -43,7 +43,7 @@ function ObjectFront(grip, overrides) { // Declared here so we can override it. getIterator(res) { return { - slice(start, count) { + slice() { return Promise.resolve(res); }, }; diff --git a/devtools/client/shared/components/test/node/components/tree.test.js b/devtools/client/shared/components/test/node/components/tree.test.js index c70b66e8ff..eb6f95fa7d 100644 --- a/devtools/client/shared/components/test/node/components/tree.test.js +++ b/devtools/client/shared/components/test/node/components/tree.test.js @@ -50,12 +50,12 @@ function mountTree(overrides = {}) { getKey: x => `key-${x}`, itemHeight: 1, onFocus: x => { - this.setState(previousState => { + this.setState(() => { return { focused: x }; }); }, onActivate: x => { - this.setState(previousState => { + this.setState(() => { return { active: x }; }); }, @@ -207,7 +207,7 @@ describe("Tree", () => { }); it("calls shouldItemUpdate when provided", () => { - const shouldItemUpdate = jest.fn((prev, next) => true); + const shouldItemUpdate = jest.fn(() => true); const wrapper = mountTree({ shouldItemUpdate, }); @@ -636,7 +636,7 @@ describe("Tree", () => { it("renders as expected navigating with arrows on unexpandable roots", () => { const wrapper = mountTree({ focused: "A", - isExpandable: item => false, + isExpandable: () => false, }); expect(formatTree(wrapper)).toMatchSnapshot(); diff --git a/devtools/client/shared/components/tree/ObjectProvider.js b/devtools/client/shared/components/tree/ObjectProvider.js index 48d577ff4d..80543df73a 100644 --- a/devtools/client/shared/components/tree/ObjectProvider.js +++ b/devtools/client/shared/components/tree/ObjectProvider.js @@ -4,7 +4,7 @@ "use strict"; // Make this available to both AMD and CJS environments -define(function (require, exports, module) { +define(function (require, exports) { /** * Implementation of the default data provider. A provider is state less * object responsible for transformation data (usually a state) to diff --git a/devtools/client/shared/fluent-l10n/fluent-l10n.js b/devtools/client/shared/fluent-l10n/fluent-l10n.js index d3a5c33408..3a27b225fd 100644 --- a/devtools/client/shared/fluent-l10n/fluent-l10n.js +++ b/devtools/client/shared/fluent-l10n/fluent-l10n.js @@ -49,13 +49,13 @@ class FluentL10n { /** * Returns the localized string for the provided id, formatted using args. */ - getString(id, args, fallback) { + getString(...args) { // Forward arguments via .apply() so that the original method can: // - perform asserts based on the number of arguments // - add new arguments return this._reactLocalization.getString.apply( this._reactLocalization, - arguments + args ); } } diff --git a/devtools/client/shared/output-parser.js b/devtools/client/shared/output-parser.js index 4ae1a60b11..fc1afca5a0 100644 --- a/devtools/client/shared/output-parser.js +++ b/devtools/client/shared/output-parser.js @@ -1445,7 +1445,7 @@ class OutputParser { nodes[nodeIndex].classList.add(point); } - nodes.forEach((node, j, array) => { + nodes.forEach((node, j) => { for (const text of otherText[j]) { appendText(container, text); } diff --git a/devtools/client/shared/redux/middleware/debounce.js b/devtools/client/shared/redux/middleware/debounce.js index fc5625a0fe..c630398ffa 100644 --- a/devtools/client/shared/redux/middleware/debounce.js +++ b/devtools/client/shared/redux/middleware/debounce.js @@ -24,7 +24,7 @@ function debounceActions(wait, maxWait) { let queuedActions = []; - return store => next => { + return () => next => { const debounced = debounce( () => { next(batchActions(queuedActions)); diff --git a/devtools/client/shared/redux/middleware/log.js b/devtools/client/shared/redux/middleware/log.js index 4ea09491ca..c9af48f1d3 100644 --- a/devtools/client/shared/redux/middleware/log.js +++ b/devtools/client/shared/redux/middleware/log.js @@ -7,7 +7,7 @@ * A middleware that logs all actions coming through the system * to the console. */ -function log({ dispatch, getState }) { +function log() { return next => action => { try { // Only print the action type, rather than printing the whole object diff --git a/devtools/client/shared/redux/middleware/promise.js b/devtools/client/shared/redux/middleware/promise.js index 7f88651a61..c640ec6a99 100644 --- a/devtools/client/shared/redux/middleware/promise.js +++ b/devtools/client/shared/redux/middleware/promise.js @@ -18,7 +18,7 @@ loader.lazyRequireGetter( const PROMISE = (exports.PROMISE = "@@dispatch/promise"); -function promiseMiddleware({ dispatch, getState }) { +function promiseMiddleware({ dispatch }) { return next => action => { if (!(PROMISE in action)) { return next(action); diff --git a/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-02.js b/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-02.js index eaa573a8ae..a515acd2a4 100644 --- a/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-02.js +++ b/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-02.js @@ -56,7 +56,7 @@ add_task(async function () { }); function comboAction() { - return async function ({ dispatch, getState }) { + return async function ({ dispatch }) { const data = {}; data.async = await dispatch(fetchAsync("async")); data.sync = await dispatch(fetchSync("sync")); diff --git a/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-03.js b/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-03.js index 94087e31de..31c83a3122 100644 --- a/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-03.js +++ b/devtools/client/shared/redux/middleware/xpcshell/test_middleware-task-03.js @@ -35,7 +35,7 @@ add_task(async function () { }); function asyncError() { - return async ({ dispatch, getState }) => { + return async () => { const error = "task-middleware-error-generator"; throw error; }; diff --git a/devtools/client/shared/remote-debugging/adb/adb-addon.js b/devtools/client/shared/remote-debugging/adb/adb-addon.js index ddce411cb3..e597d34231 100644 --- a/devtools/client/shared/remote-debugging/adb/adb-addon.js +++ b/devtools/client/shared/remote-debugging/adb/adb-addon.js @@ -7,7 +7,7 @@ const { AddonManager } = ChromeUtils.importESModule( "resource://gre/modules/AddonManager.sys.mjs", // AddonManager is a singleton, never create two instances of it. - { loadInDevToolsLoader: false } + { global: "shared" } ); const EventEmitter = require("resource://devtools/shared/event-emitter.js"); diff --git a/devtools/client/shared/remote-debugging/adb/adb-process.js b/devtools/client/shared/remote-debugging/adb/adb-process.js index ade509125e..f916388124 100644 --- a/devtools/client/shared/remote-debugging/adb/adb-process.js +++ b/devtools/client/shared/remote-debugging/adb/adb-process.js @@ -68,7 +68,7 @@ class AdbProcess extends EventEmitter { params, params.length, { - observe(subject, topic, data) { + observe(subject, topic) { switch (topic) { case "process-finished": resolve(); diff --git a/devtools/client/shared/remote-debugging/adb/adb-running-checker.js b/devtools/client/shared/remote-debugging/adb/adb-running-checker.js index 7f952ca39b..5660e3ddc7 100644 --- a/devtools/client/shared/remote-debugging/adb/adb-running-checker.js +++ b/devtools/client/shared/remote-debugging/adb/adb-running-checker.js @@ -64,18 +64,18 @@ exports.check = async function check() { }; const setupSocket = function () { - socket.s.onerror = function (event) { + socket.s.onerror = function () { dumpn("running checker onerror"); finish(false); }; - socket.s.onopen = function (event) { + socket.s.onopen = function () { dumpn("running checker onopen"); state = "start"; runFSM(); }; - socket.s.onclose = function (event) { + socket.s.onclose = function () { dumpn("running checker onclose"); }; diff --git a/devtools/client/shared/remote-debugging/adb/commands/shell.js b/devtools/client/shared/remote-debugging/adb/commands/shell.js index 03f4bfcf78..e891ab218d 100644 --- a/devtools/client/shared/remote-debugging/adb/commands/shell.js +++ b/devtools/client/shared/remote-debugging/adb/commands/shell.js @@ -81,18 +81,18 @@ const shell = async function (deviceId, command) { }; const socket = client.connect(); - socket.s.onerror = function (event) { + socket.s.onerror = function () { dumpn("shell onerror"); reject("SOCKET_ERROR"); }; - socket.s.onopen = function (event) { + socket.s.onopen = function () { dumpn("shell onopen"); state = "start"; runFSM(); }; - socket.s.onclose = function (event) { + socket.s.onclose = function () { resolve(stdout); dumpn("shell onclose"); }; diff --git a/devtools/client/shared/source-map-loader/wasm-dwarf/wasmAsset.js b/devtools/client/shared/source-map-loader/wasm-dwarf/wasmAsset.js index b4de822ffd..9d02da0f54 100644 --- a/devtools/client/shared/source-map-loader/wasm-dwarf/wasmAsset.js +++ b/devtools/client/shared/source-map-loader/wasm-dwarf/wasmAsset.js @@ -4,7 +4,7 @@ "use strict"; -async function getDwarfToWasmData(name) { +async function getDwarfToWasmData() { const response = await fetch( "resource://devtools/client/shared/source-map-loader/wasm-dwarf/dwarf_to_json.wasm" ); diff --git a/devtools/client/shared/sourceeditor/README b/devtools/client/shared/sourceeditor/README index e4a88f6d4e..0676d12b1d 100644 --- a/devtools/client/shared/sourceeditor/README +++ b/devtools/client/shared/sourceeditor/README @@ -8,7 +8,7 @@ code, and optionally help with indentation. We're currently migrating to CodeMirror 6, which means we have bundle for version 6 _and_ 5, until we successfully migrated all consumers to CodeMirror 6. -For version 6, we're generating a bundle (codemirror6/codemirror6.bundle.js) using rollup. +For version 6, we're generating a bundle (codemirror6/codemirror6.bundle.mjs) using rollup. The entry point for the bundle is codemirror6/index.mjs, where we export all the classes and functions that the editor needs. When adding new exported item, the bundle needs to be updated, which can be done by running: diff --git a/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.js b/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.js deleted file mode 100644 index cbedb3ca53..0000000000 --- a/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.js +++ /dev/null @@ -1 +0,0 @@ -var CodeMirror=function(t){"use strict";class e{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,i){[t,e]=c(this,t,e);let s=[];return this.decompose(0,t,s,2),i.length&&i.decompose(0,i.length,s,3),this.decompose(e,this.length,s,1),n.from(s,this.length-(e-t)+i.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=c(this,t,e);let i=[];return this.decompose(t,e,i,0),n.from(i,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new o(this),s=new o(t);for(let t=e,r=e;;){if(n.next(t),s.next(t),t=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(t=1){return new o(this,t)}iterRange(t,e=this.length){return new a(this,t,e)}iterLines(t,e){let i;if(null==t)i=this.iter();else{null==e&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new l(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(t){if(0==t.length)throw new RangeError("A document must have at least one line");return 1!=t.length||t[0]?t.length<=32?new i(t):n.from(i.split(t,[])):e.empty}}class i extends e{constructor(t,e=function(t){let e=-1;for(let i of t)e+=i.length+1;return e}(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((e?i:o)>=t)return new h(n,o,i,r);n=o+1,i++}}decompose(t,e,n,o){let a=t<=0&&e>=this.length?this:new i(r(this.text,t,e),Math.min(e,this.length)-Math.max(0,t));if(1&o){let t=n.pop(),e=s(a.text,t.text.slice(),0,a.length);if(e.length<=32)n.push(new i(e,t.length+a.length));else{let t=e.length>>1;n.push(new i(e.slice(0,t)),new i(e.slice(t)))}}else n.push(a)}replace(t,e,o){if(!(o instanceof i))return super.replace(t,e,o);[t,e]=c(this,t,e);let a=s(this.text,s(o.text,r(this.text,0,t)),e),l=this.length+o.length-(e-t);return a.length<=32?new i(a,l):n.from(i.split(a,[]),l)}sliceString(t,e=this.length,i="\n"){[t,e]=c(this,t,e);let n="";for(let s=0,r=0;s<=e&&r<this.text.length;r++){let o=this.text[r],a=s+o.length;s>t&&r&&(n+=i),t<a&&e>s&&(n+=o.slice(Math.max(0,t-s),e-s)),s=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,e){let n=[],s=-1;for(let r of t)n.push(r),s+=r.length+1,32==n.length&&(e.push(new i(n,s)),n=[],s=-1);return s>-1&&e.push(new i(n,s)),e}}class n extends e{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let e of t)this.lines+=e.lines}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,a=i+r.lines-1;if((e?a:o)>=t)return r.lineInner(t,e,i,n);n=o+1,i=a+1}}decompose(t,e,i,n){for(let s=0,r=0;r<=e&&s<this.children.length;s++){let o=this.children[s],a=r+o.length;if(t<=a&&e>=r){let s=n&((r<=t?1:0)|(a>=e?2:0));r>=t&&a<=e&&!s?i.push(o):o.decompose(t-r,e-r,i,s)}r=a+1}}replace(t,e,i){if([t,e]=c(this,t,e),i.lines<this.lines)for(let s=0,r=0;s<this.children.length;s++){let o=this.children[s],a=r+o.length;if(t>=r&&e<=a){let l=o.replace(t-r,e-r,i),h=this.lines-o.lines+l.lines;if(l.lines<h>>4&&l.lines>h>>6){let r=this.children.slice();return r[s]=l,new n(r,this.length-(e-t)+i.length)}return super.replace(r,a,l)}r=a+1}return super.replace(t,e,i)}sliceString(t,e=this.length,i="\n"){[t,e]=c(this,t,e);let n="";for(let s=0,r=0;s<this.children.length&&r<=e;s++){let o=this.children[s],a=r+o.length;r>t&&s&&(n+=i),t<a&&e>r&&(n+=o.sliceString(t-r,e-r,i)),r=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof n))return 0;let i=0,[s,r,o,a]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==a)return i;let n=this.children[s],l=t.children[r];if(n!=l)return i+n.scanIdentical(l,e);i+=n.length+1}}static from(t,e=t.reduce(((t,e)=>t+e.length+1),-1)){let s=0;for(let e of t)s+=e.lines;if(s<32){let n=[];for(let e of t)e.flatten(n);return new i(n,e)}let r=Math.max(32,s>>5),o=r<<1,a=r>>1,l=[],h=0,c=-1,f=[];function u(t){let e;if(t.lines>o&&t instanceof n)for(let e of t.children)u(e);else t.lines>a&&(h>a||!h)?(d(),l.push(t)):t instanceof i&&h&&(e=f[f.length-1])instanceof i&&t.lines+e.lines<=32?(h+=t.lines,c+=t.length+1,f[f.length-1]=new i(e.text.concat(t.text),e.length+1+t.length)):(h+t.lines>r&&d(),h+=t.lines,c+=t.length+1,f.push(t))}function d(){0!=h&&(l.push(1==f.length?f[0]:n.from(f,c)),c=-1,h=f.length=0)}for(let e of t)u(e);return d(),1==l.length?l[0]:new n(l,e)}}function s(t,e,i=0,n=1e9){for(let s=0,r=0,o=!0;r<t.length&&s<=n;r++){let a=t[r],l=s+a.length;l>=i&&(l>n&&(a=a.slice(0,n-s)),s<i&&(a=a.slice(i-s)),o?(e[e.length-1]+=a,o=!1):e.push(a)),s=l+1}return e}function r(t,e,i){return s(t,[""],e,i)}e.empty=new i([""],0);class o{constructor(t,e=1){this.dir=e,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[t],this.offsets=[e>0?1:(t instanceof i?t.text.length:t.children.length)<<1]}nextInner(t,e){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,a=s instanceof i?s.text.length:s.children.length;if(o==(e>0?a:0)){if(0==n)return this.done=!0,this.value="",this;e>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(e>0?0:1)){if(this.offsets[n]+=e,0==t)return this.lineBreak=!0,this.value="\n",this;t--}else if(s instanceof i){let i=s.text[o+(e<0?-1:0)];if(this.offsets[n]+=e,i.length>Math.max(0,t))return this.value=0==t?i:e>0?i.slice(t):i.slice(0,i.length-t),this;t-=i.length}else{let r=s.children[o+(e<0?-1:0)];t>r.length?(t-=r.length,this.offsets[n]+=e):(e<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(e>0?1:(r instanceof i?r.text.length:r.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}}class a{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new o(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class l{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(e.prototype[Symbol.iterator]=function(){return this.iter()},o.prototype[Symbol.iterator]=a.prototype[Symbol.iterator]=l.prototype[Symbol.iterator]=function(){return this});class h{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}}function c(t,e,i){return[e=Math.max(0,Math.min(t.length,e)),Math.max(e,Math.min(t.length,i))]}let f="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((t=>t?parseInt(t,36):1));for(let t=1;t<f.length;t++)f[t]+=f[t-1];function u(t){for(let e=1;e<f.length;e+=2)if(f[e]>t)return f[e-1]<=t;return!1}function d(t){return t>=127462&&t<=127487}const p=8205;function O(t,e,i=!0,n=!0){return(i?g:m)(t,e,n)}function g(t,e,i){if(e==t.length)return e;e&&w(t.charCodeAt(e))&&v(t.charCodeAt(e-1))&&e--;let n=b(t,e);for(e+=S(n);e<t.length;){let s=b(t,e);if(n==p||s==p||i&&u(s))e+=S(s),n=s;else{if(!d(s))break;{let i=0,n=e-2;for(;n>=0&&d(b(t,n));)i++,n-=2;if(i%2==0)break;e+=2}}}return e}function m(t,e,i){for(;e>0;){let n=g(t,e-2,i);if(n<e)return n;e--}return 0}function w(t){return t>=56320&&t<57344}function v(t){return t>=55296&&t<56320}function b(t,e){let i=t.charCodeAt(e);if(!v(i)||e+1==t.length)return i;let n=t.charCodeAt(e+1);return w(n)?n-56320+(i-55296<<10)+65536:i}function y(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t)))}function S(t){return t<65536?1:2}const x=/\r\n?|\n/;var k=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(k||(k={}));class Q{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;e<this.sections.length;e+=2)t+=this.sections[e];return t}get newLength(){let t=0;for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e+1];t+=i<0?this.sections[e]:i}return t}get empty(){return 0==this.sections.length||2==this.sections.length&&this.sections[1]<0}iterGaps(t){for(let e=0,i=0,n=0;e<this.sections.length;){let s=this.sections[e++],r=this.sections[e++];r<0?(t(i,n,s),n+=s):n+=r,i+=s}}iterChangedRanges(t,e=!1){C(this,t,e)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let i=this.sections[e++],n=this.sections[e++];n<0?t.push(i,n):t.push(n,i)}return new Q(t)}composeDesc(t){return this.empty?t:t.empty?this:A(this,t)}mapDesc(t,e=!1){return t.empty?this:T(this,t,e)}mapPos(t,e=-1,i=k.Simple){let n=0,s=0;for(let r=0;r<this.sections.length;){let o=this.sections[r++],a=this.sections[r++],l=n+o;if(a<0){if(l>t)return s+(t-n);s+=o}else{if(i!=k.Simple&&l>=t&&(i==k.TrackDel&&n<t&&l>t||i==k.TrackBefore&&n<t||i==k.TrackAfter&&l>t))return null;if(l>t||l==t&&e<0&&!o)return t==n||e<0?s:s+a;s+=a}n=l}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return s}touchesRange(t,e=t){for(let i=0,n=0;i<this.sections.length&&n<=e;){let s=n+this.sections[i++];if(this.sections[i++]>=0&&n<=e&&s>=t)return!(n<t&&s>e)||"cover";n=s}return!1}toString(){let t="";for(let e=0;e<this.sections.length;){let i=this.sections[e++],n=this.sections[e++];t+=(t?" ":"")+i+(n>=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some((t=>"number"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new Q(t)}static create(t){return new Q(t)}}class $ extends Q{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return C(this,((e,i,n,s,r)=>t=t.replace(n,n+(i-e),r)),!1),t}mapDesc(t,e=!1){return T(this,t,e,!0)}invert(t){let i=this.sections.slice(),n=[];for(let s=0,r=0;s<i.length;s+=2){let o=i[s],a=i[s+1];if(a>=0){i[s]=a,i[s+1]=o;let l=s>>1;for(;n.length<l;)n.push(e.empty);n.push(o?t.slice(r,r+o):e.empty)}r+=o}return new $(i,n)}compose(t){return this.empty?t:t.empty?this:A(this,t,!0)}map(t,e=!1){return t.empty?this:T(this,t,e,!0)}iterChanges(t,e=!1){C(this,t,e)}get desc(){return Q.create(this.sections)}filter(t){let e=[],i=[],n=[],s=new R(this);t:for(let r=0,o=0;;){let a=r==t.length?1e9:t[r++];for(;o<a||o==a&&0==s.len;){if(s.done)break t;let t=Math.min(s.len,a-o);P(n,t,-1);let r=-1==s.ins?-1:0==s.off?s.ins:0;P(e,t,r),r>0&&Z(i,e,s.text),s.forward(t),o+=t}let l=t[r++];for(;o<l;){if(s.done)break t;let t=Math.min(s.len,l-o);P(e,t,-1),P(n,t,-1==s.ins?-1:0==s.off?s.ins:0),s.forward(t),o+=t}}return{changes:new $(e,i),filtered:Q.create(n)}}toJSON(){let t=[];for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e],n=this.sections[e+1];n<0?t.push(i):0==n?t.push([i]):t.push([i].concat(this.inserted[e>>1].toJSON()))}return t}static of(t,i,n){let s=[],r=[],o=0,a=null;function l(t=!1){if(!t&&!s.length)return;o<i&&P(s,i-o,-1);let e=new $(s,r);a=a?a.compose(e.map(a)):e,s=[],r=[],o=0}return function t(h){if(Array.isArray(h))for(let e of h)t(e);else if(h instanceof $){if(h.length!=i)throw new RangeError(`Mismatched change set length (got ${h.length}, expected ${i})`);l(),a=a?a.compose(h.map(a)):h}else{let{from:t,to:a=t,insert:c}=h;if(t>a||t<0||a>i)throw new RangeError(`Invalid change range ${t} to ${a} (in doc of length ${i})`);let f=c?"string"==typeof c?e.of(c.split(n||x)):c:e.empty,u=f.length;if(t==a&&0==u)return;t<o&&l(),t>o&&P(s,t-o,-1),P(s,a-t,u),Z(r,s,f),o=a}}(t),l(!a),a}static empty(t){return new $(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;s<t.length;s++){let r=t[s];if("number"==typeof r)i.push(r,-1);else{if(!Array.isArray(r)||"number"!=typeof r[0]||r.some(((t,e)=>e&&"string"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length<s;)n.push(e.empty);n[s]=e.of(r.slice(1)),i.push(r[0],n[s].length)}}}return new $(i,n)}static createSet(t,e){return new $(t,e)}}function P(t,e,i,n=!1){if(0==e&&i<=0)return;let s=t.length-2;s>=0&&i<=0&&i==t[s+1]?t[s]+=e:0==e&&0==t[s]?t[s+1]+=i:n?(t[s]+=e,t[s+1]+=i):t.push(e,i)}function Z(t,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s<t.length)t[t.length-1]=t[t.length-1].append(n);else{for(;t.length<s;)t.push(e.empty);t.push(n)}}function C(t,i,n){let s=t.inserted;for(let r=0,o=0,a=0;a<t.sections.length;){let l=t.sections[a++],h=t.sections[a++];if(h<0)r+=l,o+=l;else{let c=r,f=o,u=e.empty;for(;c+=l,f+=h,h&&s&&(u=u.append(s[a-2>>1])),!(n||a==t.sections.length||t.sections[a+1]<0);)l=t.sections[a++],h=t.sections[a++];i(r,c,o,f,u),r=c,o=f}}}function T(t,e,i,n=!1){let s=[],r=n?[]:null,o=new R(t),a=new R(e);for(let t=-1;;)if(-1==o.ins&&-1==a.ins){let t=Math.min(o.len,a.len);P(s,t,-1),o.forward(t),a.forward(t)}else if(a.ins>=0&&(o.ins<0||t==o.i||0==o.off&&(a.len<o.len||a.len==o.len&&!i))){let e=a.len;for(P(s,a.ins,-1);e;){let i=Math.min(o.len,e);o.ins>=0&&t<o.i&&o.len<=i&&(P(s,0,o.ins),r&&Z(r,s,o.text),t=o.i),o.forward(i),e-=i}a.next()}else{if(!(o.ins>=0)){if(o.done&&a.done)return r?$.createSet(s,r):Q.create(s);throw new Error("Mismatched change set lengths")}{let e=0,i=o.len;for(;i;)if(-1==a.ins){let t=Math.min(i,a.len);e+=t,i-=t,a.forward(t)}else{if(!(0==a.ins&&a.len<i))break;i-=a.len,a.next()}P(s,e,t<o.i?o.ins:0),r&&t<o.i&&Z(r,s,o.text),t=o.i,o.forward(o.len-i)}}}function A(t,e,i=!1){let n=[],s=i?[]:null,r=new R(t),o=new R(e);for(let t=!1;;){if(r.done&&o.done)return s?$.createSet(n,s):Q.create(n);if(0==r.ins)P(n,r.len,0,t),r.next();else if(0!=o.len||o.done){if(r.done||o.done)throw new Error("Mismatched change set lengths");{let e=Math.min(r.len2,o.len),i=n.length;if(-1==r.ins){let i=-1==o.ins?-1:o.off?0:o.ins;P(n,e,i,t),s&&i&&Z(s,n,o.text)}else-1==o.ins?(P(n,r.off?0:r.len,e,t),s&&Z(s,n,r.textBit(e))):(P(n,r.off?0:r.len,o.off?0:o.ins,t),s&&!o.off&&Z(s,n,o.text));t=(r.ins>e||o.ins>=0&&o.len>e)&&(t||n.length>i),r.forward2(e),o.forward(e)}}else P(n,0,o.ins,t),s&&Z(s,n,o.text),o.next()}}class R{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i<t.length?(this.len=t[this.i++],this.ins=t[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return-2==this.ins}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length?e.empty:t[i]}textBit(t){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!t?e.empty:i[n].slice(this.off,null==t?void 0:this.off+t)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){-1==this.ins?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}}class X{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let t=7&this.flags;return 7==t?null:t}get goalColumn(){let t=this.flags>>6;return 16777215==t?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new X(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return Y.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return Y.range(this.anchor,i)}eq(t,e=!1){return!(this.anchor!=t.anchor||this.head!=t.head||e&&this.empty&&this.assoc!=t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||"number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid JSON representation for SelectionRange");return Y.range(t.anchor,t.head)}static create(t,e,i){return new X(t,e,i)}}class Y{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:Y.create(this.ranges.map((i=>i.map(t,e))),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;i<this.ranges.length;i++)if(!this.ranges[i].eq(t.ranges[i],e))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return 1==this.ranges.length?this:new Y([this.main],0)}addRange(t,e=!0){return Y.create([t].concat(this.ranges),e?0:this.mainIndex+1)}replaceRange(t,e=this.mainIndex){let i=this.ranges.slice();return i[e]=t,Y.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map((t=>t.toJSON())),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||"number"!=typeof t.main||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new Y(t.ranges.map((t=>X.fromJSON(t))),t.main)}static single(t,e=t){return new Y([Y.range(t,e)],0)}static create(t,e=0){if(0==t.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;n<t.length;n++){let s=t[n];if(s.empty?s.from<=i:s.from<i)return Y.normalized(t.slice(),e);i=s.to}return new Y(t,e)}static cursor(t,e=0,i,n){return X.create(t,t,(0==e?0:e<0?8:16)|(null==i?7:Math.min(6,i))|(null!=n?n:16777215)<<6)}static range(t,e,i,n){let s=(null!=i?i:16777215)<<6|(null==n?7:Math.min(6,n));return e<t?X.create(e,t,48|s):X.create(t,e,(e>t?8:0)|s)}static normalized(t,e=0){let i=t[e];t.sort(((t,e)=>t.from-e.from)),e=t.indexOf(i);for(let i=1;i<t.length;i++){let n=t[i],s=t[i-1];if(n.empty?n.from<=s.to:n.from<s.to){let r=s.from,o=Math.max(n.to,s.to);i<=e&&e--,t.splice(--i,2,n.anchor>n.head?Y.range(o,r):Y.range(r,o))}}return new Y(t,e)}}function W(t,e){for(let i of t.ranges)if(i.to>e)throw new RangeError("Selection points outside of document")}let M=0;class j{constructor(t,e,i,n,s){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=M++,this.default=t([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(t={}){return new j(t.combine||(t=>t),t.compareInput||((t,e)=>t===e),t.compare||(t.combine?(t,e)=>t===e:D),!!t.static,t.enables)}of(t){return new E([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new E(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new E(t,this,2,e)}from(t,e){return e||(e=t=>t),this.compute([t],(i=>e(i.field(t))))}}function D(t,e){return t==e||t.length==e.length&&t.every(((t,i)=>t===e[i]))}class E{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=M++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,s=this.id,r=t[s]>>1,o=2==this.type,a=!1,l=!1,h=[];for(let i of this.dependencies)"doc"==i?a=!0:"selection"==i?l=!0:0==(1&(null!==(e=t[i.id])&&void 0!==e?e:1))&&h.push(t[i.id]);return{create:t=>(t.values[r]=i(t),1),update(t,e){if(a&&e.docChanged||l&&(e.docChanged||e.selection)||_(t,h)){let e=i(t);if(o?!q(e,t.values[r],n):!n(e,t.values[r]))return t.values[r]=e,1}return 0},reconfigure:(t,e)=>{let a,l=e.config.address[s];if(null!=l){let s=it(e,l);if(this.dependencies.every((i=>i instanceof j?e.facet(i)===t.facet(i):!(i instanceof z)||e.field(i,!1)==t.field(i,!1)))||(o?q(a=i(t),s,n):n(a=i(t),s)))return t.values[r]=s,0}else a=i(t);return t.values[r]=a,1}}}}function q(t,e,i){if(t.length!=e.length)return!1;for(let n=0;n<t.length;n++)if(!i(t[n],e[n]))return!1;return!0}function _(t,e){let i=!1;for(let n of e)1&et(t,n)&&(i=!0);return i}function V(t,e,i){let n=i.map((e=>t[e.id])),s=i.map((t=>t.type)),r=n.filter((t=>!(1&t))),o=t[e.id]>>1;function a(t){let i=[];for(let e=0;e<n.length;e++){let r=it(t,n[e]);if(2==s[e])for(let t of r)i.push(t);else i.push(r)}return e.combine(i)}return{create(t){for(let e of n)et(t,e);return t.values[o]=a(t),1},update(t,i){if(!_(t,r))return 0;let n=a(t);return e.compare(n,t.values[o])?0:(t.values[o]=n,1)},reconfigure(t,s){let r=_(t,n),l=s.config.facets[e.id],h=s.facet(e);if(l&&!r&&D(i,l))return t.values[o]=h,0;let c=a(t);return e.compare(c,h)?(t.values[o]=h,0):(t.values[o]=c,1)}}}const I=j.define({static:!0});class z{constructor(t,e,i,n,s){this.id=t,this.createF=e,this.updateF=i,this.compareF=n,this.spec=s,this.provides=void 0}static define(t){let e=new z(M++,t.create,t.update,t.compare||((t,e)=>t===e),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(I).find((t=>t.field==this));return((null==e?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:t=>(t.values[e]=this.create(t),1),update:(t,i)=>{let n=t.values[e],s=this.updateF(n,i);return this.compareF(n,s)?0:(t.values[e]=s,1)},reconfigure:(t,i)=>null!=i.config.address[this.id]?(t.values[e]=i.field(this),0):(t.values[e]=this.create(t),1)}}init(t){return[this,I.of({field:this,create:t})]}get extension(){return this}}const B=4,G=3,L=2,N=1;function U(t){return e=>new F(e,t)}const H={highest:U(0),high:U(N),default:U(L),low:U(G),lowest:U(B)};class F{constructor(t,e){this.inner=t,this.prec=e}}class J{of(t){return new K(this,t)}reconfigure(t){return J.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}}class K{constructor(t,e){this.compartment=t,this.inner=e}}class tt{constructor(t,e,i,n,s,r){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(t){let e=this.address[t.id];return null==e?t.default:this.staticValues[e>>1]}static resolve(t,e,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(t,e,i){let n=[[],[],[],[],[]],s=new Map;function r(t,o){let a=s.get(t);if(null!=a){if(a<=o)return;let e=n[a].indexOf(t);e>-1&&n[a].splice(e,1),t instanceof K&&i.delete(t.compartment)}if(s.set(t,o),Array.isArray(t))for(let e of t)r(e,o);else if(t instanceof K){if(i.has(t.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=e.get(t.compartment)||t.inner;i.set(t.compartment,n),r(n,o)}else if(t instanceof F)r(t.inner,t.prec);else if(t instanceof z)n[o].push(t),t.provides&&r(t.provides,o);else if(t instanceof E)n[o].push(t),t.facet.extensions&&r(t.facet.extensions,L);else{let e=t.extension;if(!e)throw new Error(`Unrecognized extension value in extension set (${t}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(e,o)}}return r(t,L),n.reduce(((t,e)=>t.concat(e)))}(t,e,r))i instanceof z?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),a=[],l=[];for(let t of n)o[t.id]=l.length<<1,l.push((e=>t.slot(e)));let h=null==i?void 0:i.config.facets;for(let t in s){let e=s[t],n=e[0].facet,r=h&&h[t]||[];if(e.every((t=>0==t.type)))if(o[n.id]=a.length<<1|1,D(r,e))a.push(i.facet(n));else{let t=n.combine(e.map((t=>t.value)));a.push(i&&n.compare(t,i.facet(n))?i.facet(n):t)}else{for(let t of e)0==t.type?(o[t.id]=a.length<<1|1,a.push(t.value)):(o[t.id]=l.length<<1,l.push((e=>t.dynamicSlot(e))));o[n.id]=l.length<<1,l.push((t=>V(t,n,e)))}}let c=l.map((t=>t(o)));return new tt(t,r,c,o,a,s)}}function et(t,e){if(1&e)return 2;let i=e>>1,n=t.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;t.status[i]=4;let s=t.computeSlot(t,t.config.dynamicSlots[i]);return t.status[i]=2|s}function it(t,e){return 1&e?t.config.staticValues[e>>1]:t.values[e>>1]}const nt=j.define(),st=j.define({combine:t=>t.some((t=>t)),static:!0}),rt=j.define({combine:t=>t.length?t[0]:void 0,static:!0}),ot=j.define(),at=j.define(),lt=j.define(),ht=j.define({combine:t=>!!t.length&&t[0]});class ct{constructor(t,e){this.type=t,this.value=e}static define(){return new ft}}class ft{of(t){return new ct(this,t)}}class ut{constructor(t){this.map=t}of(t){return new dt(this,t)}}class dt{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return void 0===e?void 0:e==this.value?this:new dt(this.type,e)}is(t){return this.type==t}static define(t={}){return new ut(t.map||(t=>t))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let t=n.map(e);t&&i.push(t)}return i}}dt.reconfigure=dt.define(),dt.appendConfig=dt.define();class pt{constructor(t,e,i,n,s,r){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&W(i,e.newLength),s.some((t=>t.type==pt.time))||(this.annotations=s.concat(pt.time.of(Date.now())))}static create(t,e,i,n,s,r){return new pt(t,e,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(pt.userEvent);return!(!e||!(e==t||e.length>t.length&&e.slice(0,t.length)==t&&"."==e[t.length]))}}function Ot(t,e){let i=[];for(let n=0,s=0;;){let r,o;if(n<t.length&&(s==e.length||e[s]>=t[n]))r=t[n++],o=t[n++];else{if(!(s<e.length))return i;r=e[s++],o=e[s++]}!i.length||i[i.length-1]<r?i.push(r,o):i[i.length-1]<o&&(i[i.length-1]=o)}}function gt(t,e,i){var n;let s,r,o;return i?(s=e.changes,r=$.empty(e.changes.length),o=t.changes.compose(e.changes)):(s=e.changes.map(t.changes),r=t.changes.mapDesc(e.changes,!0),o=t.changes.compose(s)),{changes:o,selection:e.selection?e.selection.map(r):null===(n=t.selection)||void 0===n?void 0:n.map(s),effects:dt.mapEffects(t.effects,s).concat(dt.mapEffects(e.effects,r)),annotations:t.annotations.length?t.annotations.concat(e.annotations):e.annotations,scrollIntoView:t.scrollIntoView||e.scrollIntoView}}function mt(t,e,i){let n=e.selection,s=bt(e.annotations);return e.userEvent&&(s=s.concat(pt.userEvent.of(e.userEvent))),{changes:e.changes instanceof $?e.changes:$.of(e.changes||[],i,t.facet(rt)),selection:n&&(n instanceof Y?n:Y.single(n.anchor,n.head)),effects:bt(e.effects),annotations:s,scrollIntoView:!!e.scrollIntoView}}function wt(t,e,i){let n=mt(t,e.length?e[0]:{},t.doc.length);e.length&&!1===e[0].filter&&(i=!1);for(let s=1;s<e.length;s++){!1===e[s].filter&&(i=!1);let r=!!e[s].sequential;n=gt(n,mt(t,e[s],r?n.changes.newLength:t.doc.length),r)}let s=pt.create(t,n.changes,n.selection,n.effects,n.annotations,n.scrollIntoView);return function(t){let e=t.startState,i=e.facet(lt),n=t;for(let s=i.length-1;s>=0;s--){let r=i[s](t);r&&Object.keys(r).length&&(n=gt(n,mt(e,r,t.changes.newLength),!0))}return n==t?t:pt.create(e,t.changes,t.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(t){let e=t.startState,i=!0;for(let n of e.facet(ot)){let e=n(t);if(!1===e){i=!1;break}Array.isArray(e)&&(i=!0===i?e:Ot(i,e))}if(!0!==i){let n,s;if(!1===i)s=t.changes.invertedDesc,n=$.empty(e.doc.length);else{let e=t.changes.filter(i);n=e.changes,s=e.filtered.mapDesc(e.changes).invertedDesc}t=pt.create(e,n,t.selection&&t.selection.map(s),dt.mapEffects(t.effects,s),t.annotations,t.scrollIntoView)}let n=e.facet(at);for(let i=n.length-1;i>=0;i--){let s=n[i](t);t=s instanceof pt?s:Array.isArray(s)&&1==s.length&&s[0]instanceof pt?s[0]:wt(e,bt(s),!1)}return t}(s):s)}pt.time=ct.define(),pt.userEvent=ct.define(),pt.addToHistory=ct.define(),pt.remote=ct.define();const vt=[];function bt(t){return null==t?vt:Array.isArray(t)?t:[t]}var yt=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(yt||(yt={}));const St=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let xt;try{xt=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function kt(t){return e=>{if(!/\S/.test(e))return yt.Space;if(function(t){if(xt)return xt.test(t);for(let e=0;e<t.length;e++){let i=t[e];if(/\w/.test(i)||i>""&&(i.toUpperCase()!=i.toLowerCase()||St.test(i)))return!0}return!1}(e))return yt.Word;for(let i=0;i<t.length;i++)if(e.indexOf(t[i])>-1)return yt.Word;return yt.Other}}class Qt{constructor(t,e,i,n,s,r){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let t=0;t<this.config.dynamicSlots.length;t++)et(this,t<<1);this.computeSlot=null}field(t,e=!0){let i=this.config.address[t.id];if(null!=i)return et(this,i),it(this,i);if(e)throw new RangeError("Field is not present in this state")}update(...t){return wt(this,t,!0)}applyTransaction(t){let e,i=this.config,{base:n,compartments:s}=i;for(let e of t.effects)e.is(J.reconfigure)?(i&&(s=new Map,i.compartments.forEach(((t,e)=>s.set(e,t))),i=null),s.set(e.value.compartment,e.value.extension)):e.is(dt.reconfigure)?(i=null,n=e.value):e.is(dt.appendConfig)&&(i=null,n=bt(n).concat(e.value));if(i)e=t.startState.values.slice();else{i=tt.resolve(n,s,this),e=new Qt(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((t,e)=>e.reconfigure(t,this)),null).values}let r=t.startState.facet(st)?t.newSelection:t.newSelection.asSingle();new Qt(i,t.newDoc,r,e,((e,i)=>i.update(e,t)),t)}replaceSelection(t){return"string"==typeof t&&(t=this.toText(t)),this.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t},range:Y.cursor(e.from+t.length)})))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),s=[i.range],r=bt(i.effects);for(let i=1;i<e.ranges.length;i++){let o=t(e.ranges[i]),a=this.changes(o.changes),l=a.map(n);for(let t=0;t<i;t++)s[t]=s[t].map(l);let h=n.mapDesc(a,!0);s.push(o.range.map(h)),n=n.compose(l),r=dt.mapEffects(r,l).concat(dt.mapEffects(bt(o.effects),h))}return{changes:n,selection:Y.create(s,e.mainIndex),effects:r}}changes(t=[]){return t instanceof $?t:$.of(t,this.doc.length,this.facet(Qt.lineSeparator))}toText(t){return e.of(t.split(this.facet(Qt.lineSeparator)||x))}sliceDoc(t=0,e=this.doc.length){return this.doc.sliceString(t,e,this.lineBreak)}facet(t){let e=this.config.address[t.id];return null==e?t.default:(et(this,e),it(this,e))}toJSON(t){let e={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(t)for(let i in t){let n=t[i];n instanceof z&&null!=this.config.address[n.id]&&(e[i]=n.spec.toJSON(this.field(t[i]),this))}return e}static fromJSON(t,e={},i){if(!t||"string"!=typeof t.doc)throw new RangeError("Invalid JSON representation for EditorState");let n=[];if(i)for(let e in i)if(Object.prototype.hasOwnProperty.call(t,e)){let s=i[e],r=t[e];n.push(s.init((t=>s.spec.fromJSON(r,t))))}return Qt.create({doc:t.doc,selection:Y.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(t={}){let i=tt.resolve(t.extensions||[],new Map),n=t.doc instanceof e?t.doc:e.of((t.doc||"").split(i.staticFacet(Qt.lineSeparator)||x)),s=t.selection?t.selection instanceof Y?t.selection:Y.single(t.selection.anchor,t.selection.head):Y.single(0);return W(s,n.length),i.staticFacet(st)||(s=s.asSingle()),new Qt(i,n,s,i.dynamicSlots.map((()=>null)),((t,e)=>e.create(t)),null)}get tabSize(){return this.facet(Qt.tabSize)}get lineBreak(){return this.facet(Qt.lineSeparator)||"\n"}get readOnly(){return this.facet(ht)}phrase(t,...e){for(let e of this.facet(Qt.phrases))if(Object.prototype.hasOwnProperty.call(e,t)){t=e[t];break}return e.length&&(t=t.replace(/\$(\$|\d*)/g,((t,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>e.length?t:e[n-1]}))),t}languageDataAt(t,e,i=-1){let n=[];for(let s of this.facet(nt))for(let r of s(this,e,i))Object.prototype.hasOwnProperty.call(r,t)&&n.push(r[t]);return n}charCategorizer(t){return kt(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),s=this.charCategorizer(t),r=t-i,o=t-i;for(;r>0;){let t=O(e,r,!1);if(s(e.slice(t,r))!=yt.Word)break;r=t}for(;o<n;){let t=O(e,o);if(s(e.slice(o,t))!=yt.Word)break;o=t}return r==o?null:Y.range(r+i,o+i)}}function $t(t,e,i={}){let n={};for(let e of t)for(let t of Object.keys(e)){let s=e[t],r=n[t];if(void 0===r)n[t]=s;else if(r===s||void 0===s);else{if(!Object.hasOwnProperty.call(i,t))throw new Error("Config merge conflict for field "+t);n[t]=i[t](r,s)}}for(let t in e)void 0===n[t]&&(n[t]=e[t]);return n}Qt.allowMultipleSelections=st,Qt.tabSize=j.define({combine:t=>t.length?t[0]:4}),Qt.lineSeparator=rt,Qt.readOnly=ht,Qt.phrases=j.define({compare(t,e){let i=Object.keys(t),n=Object.keys(e);return i.length==n.length&&i.every((i=>t[i]==e[i]))}}),Qt.languageData=nt,Qt.changeFilter=ot,Qt.transactionFilter=at,Qt.transactionExtender=lt,J.reconfigure=dt.define();class Pt{eq(t){return this==t}range(t,e=t){return Zt.create(t,e,this)}}Pt.prototype.startSide=Pt.prototype.endSide=0,Pt.prototype.point=!1,Pt.prototype.mapMode=k.TrackDel;let Zt=class t{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(e,i,n){return new t(e,i,n)}};function Ct(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}class Tt{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,a=s[n]-t||(i?this.value[n].endSide:this.value[n].startSide)-e;if(n==r)return a>=0?r:o;a>=0?o=n:r=n+1}}between(t,e,i,n){for(let s=this.findIndex(e,-1e9,!0),r=this.findIndex(i,1e9,!1,s);s<r;s++)if(!1===n(this.from[s]+t,this.to[s]+t,this.value[s]))return!1}map(t,e){let i=[],n=[],s=[],r=-1,o=-1;for(let a=0;a<this.value.length;a++){let l,h,c=this.value[a],f=this.from[a]+t,u=this.to[a]+t;if(f==u){let t=e.mapPos(f,c.startSide,c.mapMode);if(null==t)continue;if(l=h=t,c.startSide!=c.endSide&&(h=e.mapPos(f,c.endSide),h<l))continue}else if(l=e.mapPos(f,c.startSide),h=e.mapPos(u,c.endSide),l>h||l==h&&c.startSide>0&&c.endSide<=0)continue;(h-l||c.endSide-c.startSide)<0||(r<0&&(r=l),c.point&&(o=Math.max(o,h-l)),i.push(c),n.push(l-r),s.push(h-r))}return{mapped:i.length?new Tt(n,s,i,o):null,pos:r}}}class At{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new At(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=t,r=t.filter;if(0==e.length&&!r)return this;if(i&&(e=e.slice().sort(Ct)),this.isEmpty)return e.length?At.of(e):this;let o=new Yt(this,null,-1).goto(0),a=0,l=[],h=new Rt;for(;o.value||a<e.length;)if(a<e.length&&(o.from-e[a].from||o.startSide-e[a].value.startSide)>=0){let t=e[a++];h.addInner(t.from,t.to,t.value)||l.push(t)}else 1==o.rangeIndex&&o.chunkIndex<this.chunk.length&&(a==e.length||this.chunkEnd(o.chunkIndex)<e[a].from)&&(!r||n>this.chunkEnd(o.chunkIndex)||s<this.chunkPos[o.chunkIndex])&&h.addChunk(this.chunkPos[o.chunkIndex],this.chunk[o.chunkIndex])?o.nextChunk():((!r||n>o.to||s<o.from||r(o.from,o.to,o.value))&&(h.addInner(o.from,o.to,o.value)||l.push(Zt.create(o.from,o.to,o.value))),o.next());return h.finishInner(this.nextLayer.isEmpty&&!l.length?At.empty:this.nextLayer.update({add:l,filter:r,filterFrom:n,filterTo:s}))}map(t){if(t.empty||this.isEmpty)return this;let e=[],i=[],n=-1;for(let s=0;s<this.chunk.length;s++){let r=this.chunkPos[s],o=this.chunk[s],a=t.touchesRange(r,r+o.length);if(!1===a)n=Math.max(n,o.maxPoint),e.push(o),i.push(t.mapPos(r));else if(!0===a){let{mapped:s,pos:a}=o.map(r,t);s&&(n=Math.max(n,s.maxPoint),e.push(s),i.push(a))}}let s=this.nextLayer.map(t);return 0==e.length?s:new At(i,e,s||At.empty,n)}between(t,e,i){if(!this.isEmpty){for(let n=0;n<this.chunk.length;n++){let s=this.chunkPos[n],r=this.chunk[n];if(e>=s&&t<=s+r.length&&!1===r.between(s,t-s,e-s,i))return}this.nextLayer.between(t,e,i)}}iter(t=0){return Wt.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Wt.from(t).goto(e)}static compare(t,e,i,n,s=-1){let r=t.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),o=e.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),a=Xt(r,o,i),l=new jt(r,a,s),h=new jt(o,a,s);i.iterGaps(((t,e,i)=>Dt(l,t,h,e,i,n))),i.empty&&0==i.length&&Dt(l,0,h,0,0,n)}static eq(t,e,i=0,n){null==n&&(n=999999999);let s=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0)),r=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Xt(s,r),a=new jt(s,o,0).goto(i),l=new jt(r,o,0).goto(i);for(;;){if(a.to!=l.to||!Et(a.active,l.active)||a.point&&(!l.point||!a.point.eq(l.point)))return!1;if(a.to>n)return!0;a.next(),l.next()}}static spans(t,e,i,n,s=-1){let r=new jt(t,null,s).goto(e),o=e,a=r.openStart;for(;;){let t=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFrom<e?i.length+1:Math.min(i.length,a);n.point(o,t,r.point,i,s,r.pointRank),a=Math.min(r.openEnd(t),i.length)}else t>o&&(n.span(o,t,r.active,a),a=r.openEnd(t));if(r.to>i)return a+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(t,e=!1){let i=new Rt;for(let n of t instanceof Zt?[t]:e?function(t){if(t.length>1)for(let e=t[0],i=1;i<t.length;i++){let n=t[i];if(Ct(e,n)>0)return t.slice().sort(Ct);e=n}return t}(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return At.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=At.empty;n=n.nextLayer)e=new At(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}}At.empty=new At([],[],null,-1),At.empty.nextLayer=At.empty;class Rt{finishChunk(t){this.chunks.push(new Tt(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new Rt)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0)&&(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(At.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return t;let e=At.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}}function Xt(t,e,i){let n=new Map;for(let e of t)for(let t=0;t<e.chunk.length;t++)e.chunk[t].maxPoint<=0&&n.set(e.chunk[t],e.chunkPos[t]);let s=new Set;for(let t of e)for(let e=0;e<t.chunk.length;e++){let r=n.get(t.chunk[e]);null==r||(i?i.mapPos(r):r)!=t.chunkPos[e]||(null==i?void 0:i.touchesRange(r,r+t.chunk[e].length))||s.add(t.chunk[e])}return s}class Yt{constructor(t,e,i,n=0){this.layer=t,this.skip=e,this.minPoint=i,this.rank=n}get startSide(){return this.value?this.value.startSide:0}get endSide(){return this.value?this.value.endSide:0}goto(t,e=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(t,e,!1),this}gotoInner(t,e,i){for(;this.chunkIndex<this.layer.chunk.length;){let e=this.layer.chunk[this.chunkIndex];if(!(this.skip&&this.skip.has(e)||this.layer.chunkEnd(this.chunkIndex)<t||e.maxPoint<this.minPoint))break;this.chunkIndex++,i=!1}if(this.chunkIndex<this.layer.chunk.length){let n=this.layer.chunk[this.chunkIndex].findIndex(t-this.layer.chunkPos[this.chunkIndex],e,!0);(!i||this.rangeIndex<n)&&this.setRangeIndex(n)}this.next()}forward(t,e){(this.to-t||this.endSide-e)<0&&this.gotoInner(t,e,!0)}next(){for(;;){if(this.chunkIndex==this.layer.chunk.length){this.from=this.to=1e9,this.value=null;break}{let t=this.layer.chunkPos[this.chunkIndex],e=this.layer.chunk[this.chunkIndex],i=t+e.from[this.rangeIndex];if(this.from=i,this.to=t+e.to[this.rangeIndex],this.value=e.value[this.rangeIndex],this.setRangeIndex(this.rangeIndex+1),this.minPoint<0||this.value.point&&this.to-this.from>=this.minPoint)break}}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex<this.layer.chunk.length&&this.skip.has(this.layer.chunk[this.chunkIndex]);)this.chunkIndex++;this.rangeIndex=0}else this.rangeIndex=t}nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}compare(t){return this.from-t.from||this.startSide-t.startSide||this.rank-t.rank||this.to-t.to||this.endSide-t.endSide}}class Wt{constructor(t){this.heap=t}static from(t,e=null,i=-1){let n=[];for(let s=0;s<t.length;s++)for(let r=t[s];!r.isEmpty;r=r.nextLayer)r.maxPoint>=i&&n.push(new Yt(r,e,i,s));return 1==n.length?n[0]:new Wt(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let t=this.heap.length>>1;t>=0;t--)Mt(this.heap,t);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let t=this.heap.length>>1;t>=0;t--)Mt(this.heap,t);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Mt(this.heap,0)}}}function Mt(t,e){for(let i=t[e];;){let n=1+(e<<1);if(n>=t.length)break;let s=t[n];if(n+1<t.length&&s.compare(t[n+1])>=0&&(s=t[n+1],n++),i.compare(s)<0)break;t[n]=i,t[e]=s,e=n}}class jt{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Wt.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){qt(this.active,t),qt(this.activeTo,t),qt(this.activeRank,t),this.minActive=Vt(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:s}=this.cursor;for(;e<this.activeRank.length&&(s-this.activeRank[e]||n-this.activeTo[e])>0;)e++;_t(this.active,e,i),_t(this.activeTo,e,n),_t(this.activeRank,e,s),t&&_t(t,e,this.cursor.from),this.minActive=Vt(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&qt(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let t=this.cursor.value;if(t.point){if(!(e&&this.cursor.to==this.to&&this.cursor.from<this.cursor.to)){this.point=t,this.pointFrom=this.cursor.from,this.pointRank=this.cursor.rank,this.to=this.cursor.to,this.endSide=t.endSide,this.cursor.next(),this.forward(this.to,this.endSide);break}this.cursor.next()}else this.addActive(i),this.cursor.next()}}}if(i){this.openStart=0;for(let e=i.length-1;e>=0&&i[e]<t;e--)this.openStart++}}activeForPoint(t){if(!this.active.length)return this.active;let e=[];for(let i=this.active.length-1;i>=0&&!(this.activeRank[i]<this.pointRank);i--)(this.activeTo[i]>t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}}function Dt(t,e,i,n,s,r){t.goto(e),i.goto(n);let o=n+s,a=n,l=n-e;for(;;){let e=t.to+l-i.to||t.endSide-i.endSide,n=e<0?t.to+l:i.to,s=Math.min(n,o);if(t.point||i.point?t.point&&i.point&&(t.point==i.point||t.point.eq(i.point))&&Et(t.activeForPoint(t.to),i.activeForPoint(i.to))||r.comparePoint(a,s,t.point,i.point):s>a&&!Et(t.active,i.active)&&r.compareRange(a,s,t.active,i.active),n>o)break;a=n,e<=0&&t.next(),e>=0&&i.next()}}function Et(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!=e[i]&&!t[i].eq(e[i]))return!1;return!0}function qt(t,e){for(let i=e,n=t.length-1;i<n;i++)t[i]=t[i+1];t.pop()}function _t(t,e,i){for(let i=t.length-1;i>=e;i--)t[i+1]=t[i];t[e]=i}function Vt(t,e){let i=-1,n=1e9;for(let s=0;s<e.length;s++)(e[s]-n||t[s].endSide-t[i].endSide)<0&&(i=s,n=e[s]);return i}function It(t,e,i=t.length){let n=0;for(let s=0;s<i;)9==t.charCodeAt(s)?(n+=e-n%e,s++):(n++,s=O(t,s));return n}function zt(t,e,i,n){for(let n=0,s=0;;){if(s>=e)return n;if(n==t.length)break;s+=9==t.charCodeAt(n)?i-s%i:1,n=O(t,n)}return!0===n?-1:t.length}var Bt=Object.freeze({__proto__:null,Annotation:ct,AnnotationType:ft,ChangeDesc:Q,ChangeSet:$,get CharCategory(){return yt},Compartment:J,EditorSelection:Y,EditorState:Qt,Facet:j,Line:h,get MapMode(){return k},Prec:H,Range:Zt,RangeSet:At,RangeSetBuilder:Rt,RangeValue:Pt,SelectionRange:X,StateEffect:dt,StateEffectType:ut,StateField:z,Text:e,Transaction:pt,codePointAt:b,codePointSize:S,combineConfig:$t,countColumn:It,findClusterBreak:O,findColumn:zt,fromCodePoint:y});const Gt="undefined"==typeof Symbol?"__ͼ":Symbol.for("ͼ"),Lt="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Nt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class Ut{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(t){return/^@/.test(t)?[t]:t.split(/,\s*/)}function s(t,e,r,o){let a=[],l=/^@(\w+)\b/.exec(t[0]),h=l&&"keyframes"==l[1];if(l&&null==e)return r.push(t[0]+";");for(let i in e){let o=e[i];if(/&/.test(i))s(i.split(/,\s*/).map((e=>t.map((t=>e.replace(/&/,t))))).reduce(((t,e)=>t.concat(e))),o,r);else if(o&&"object"==typeof o){if(!l)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,a,h)}else null!=o&&a.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(t=>"-"+t.toLowerCase()))+": "+o+";")}(a.length||h)&&r.push((!i||l||o?t:t.map(i)).join(", ")+" {"+a.join(" ")+"}")}for(let e in t)s(n(e),t[e],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let t=Nt[Gt]||1;return Nt[Gt]=t+1,"ͼ"+t.toString(36)}static mount(t,e,i){let n=t[Lt],s=i&&i.nonce;n?s&&n.setNonce(s):n=new Ft(t,s),n.mount(Array.isArray(e)?e:[e])}}let Ht=new Map;class Ft{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let e=Ht.get(i);if(e)return t.adoptedStyleSheets=[e.sheet,...t.adoptedStyleSheets],t[Lt]=e;this.sheet=new n.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],Ht.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let n=t.head||t;n.insertBefore(this.styleTag,n.firstChild)}this.modules=[],t[Lt]=this}mount(t){let e=this.sheet,i=0,n=0;for(let s=0;s<t.length;s++){let r=t[s],o=this.modules.indexOf(r);if(o<n&&o>-1&&(this.modules.splice(o,1),n--,o=-1),-1==o){if(this.modules.splice(n++,0,r),e)for(let t=0;t<r.rules.length;t++)e.insertRule(r.rules[t],i++)}else{for(;n<o;)i+=this.modules[n++].rules.length;i+=r.rules.length,n++}}if(!e){let t="";for(let e=0;e<this.modules.length;e++)t+=this.modules[e].getRules()+"\n";this.styleTag.textContent=t}}setNonce(t){this.styleTag&&this.styleTag.getAttribute("nonce")!=t&&this.styleTag.setAttribute("nonce",t)}}for(var Jt={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Kt={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},te="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),ee="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),ie=0;ie<10;ie++)Jt[48+ie]=Jt[96+ie]=String(ie);for(ie=1;ie<=24;ie++)Jt[ie+111]="F"+ie;for(ie=65;ie<=90;ie++)Jt[ie]=String.fromCharCode(ie+32),Kt[ie]=String.fromCharCode(ie);for(var ne in Jt)Kt.hasOwnProperty(ne)||(Kt[ne]=Jt[ne]);function se(t){let e;return e=11==t.nodeType?t.getSelection?t:t.ownerDocument:t,e.getSelection()}function re(t,e){return!!e&&(t==e||t.contains(1!=e.nodeType?e.parentNode:e))}function oe(t,e){if(!e.anchorNode)return!1;try{return re(t,e.anchorNode)}catch(t){return!1}}function ae(t){return 3==t.nodeType?ve(t,0,t.nodeValue.length).getClientRects():1==t.nodeType?t.getClientRects():[]}function le(t,e,i,n){return!!i&&(ce(t,e,i,n,-1)||ce(t,e,i,n,1))}function he(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e}function ce(t,e,i,n,s){for(;;){if(t==i&&e==n)return!0;if(e==(s<0?0:fe(t))){if("DIV"==t.nodeName)return!1;let i=t.parentNode;if(!i||1!=i.nodeType)return!1;e=he(t)+(s<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if(1==(t=t.childNodes[e+(s<0?-1:0)]).nodeType&&"false"==t.contentEditable)return!1;e=s<0?fe(t):0}}}function fe(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function ue(t,e){let i=e?t.left:t.right;return{left:i,right:i,top:t.top,bottom:t.bottom}}function de(t){return{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function pe(t,e){let i=e.width/t.offsetWidth,n=e.height/t.offsetHeight;return(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.width-t.offsetWidth)<1)&&(i=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-t.offsetHeight)<1)&&(n=1),{scaleX:i,scaleY:n}}class Oe{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?fe(e):0),i,Math.min(t.focusOffset,i?fe(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}}let ge,me=null;function we(t){if(t.setActive)return t.setActive();if(me)return t.focus(me);let e=[];for(let i=t;i&&(e.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(t.focus(null==me?{get preventScroll(){return me={preventScroll:!0},!0}}:void 0),!me){me=!1;for(let t=0;t<e.length;){let i=e[t++],n=e[t++],s=e[t++];i.scrollTop!=n&&(i.scrollTop=n),i.scrollLeft!=s&&(i.scrollLeft=s)}}}function ve(t,e,i=e){let n=ge||(ge=document.createRange());return n.setEnd(t,i),n.setStart(t,e),n}function be(t,e,i){let n={key:e,code:e,keyCode:i,which:i,cancelable:!0},s=new KeyboardEvent("keydown",n);s.synthetic=!0,t.dispatchEvent(s);let r=new KeyboardEvent("keyup",n);return r.synthetic=!0,t.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function ye(t){for(;t.attributes.length;)t.removeAttributeNode(t.attributes[0])}function Se(t){return t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}class xe{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new xe(t.parentNode,he(t),e)}static after(t,e){return new xe(t.parentNode,he(t)+1,e)}}const ke=[];class Qe{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(2&this.flags){let i,n=this.dom,s=null;for(let r of this.children){if(7&r.flags){if(!r.dom&&(i=s?s.nextSibling:n.firstChild)){let t=Qe.get(i);(!t||!t.parent&&t.canReuseDOM(r))&&r.reuseDOM(i)}r.sync(t,e),r.flags&=-8}if(i=s?s.nextSibling:n.firstChild,e&&!e.written&&e.node==n&&i!=r.dom&&(e.written=!0),r.dom.parentNode==n)for(;i&&i!=r.dom;)i=$e(i);else n.insertBefore(r.dom,i);s=r.dom}for(i=s?s.nextSibling:n.firstChild,i&&e&&e.node==n&&(e.written=!0);i;)i=$e(i)}else if(1&this.flags)for(let i of this.children)7&i.flags&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let n=0==fe(t)?0:0==e?-1:1;for(;;){let e=t.parentNode;if(e==this.dom)break;0==n&&e.firstChild!=e.lastChild&&(n=t==e.firstChild?-1:1),t=e}i=n<0?t:t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!Qe.get(i);)i=i.nextSibling;if(!i)return this.length;for(let t=0,e=0;;t++){let n=this.children[t];if(n.dom==i)return e;e+=n.length+n.breakAfter}}domBoundsAround(t,e,i=0){let n=-1,s=-1,r=-1,o=-1;for(let a=0,l=i,h=i;a<this.children.length;a++){let i=this.children[a],c=l+i.length;if(l<t&&c>e)return i.domBoundsAround(t,e,l);if(c>=t&&-1==n&&(n=a,s=l),l>e&&i.dom.parentNode==this.dom){r=a,o=h;break}h=c,l=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r<this.children.length&&r>=0?this.children[r].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),1&e.flags)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,7&this.flags&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=ke){this.markDirty();for(let n=t;n<e;n++){let t=this.children[n];t.parent==this&&i.indexOf(t)<0&&t.destroy()}this.children.splice(t,e-t,...i);for(let t=0;t<i.length;t++)i[t].setParent(this)}ignoreMutation(t){return!1}ignoreEvent(t){return!1}childCursor(t=this.length){return new Pe(this.children,t,this.children.length)}childPos(t,e=1){return this.childCursor().findPos(t,e)}toString(){let t=this.constructor.name.replace("View","");return t+(this.children.length?"("+this.children.join()+")":this.length?"["+("Text"==t?this.text:this.length)+"]":"")+(this.breakAfter?"#":"")}static get(t){return t.cmView}get isEditable(){return!0}get isWidget(){return!1}get isHidden(){return!1}merge(t,e,i,n,s,r){return!1}become(t){return!1}canReuseDOM(t){return t.constructor==this.constructor&&!(8&(this.flags|t.flags))}getSide(){return 0}destroy(){for(let t of this.children)t.parent==this&&t.destroy();this.parent=null}}function $e(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}Qe.prototype.breakAfter=0;class Pe{constructor(t,e,i){this.children=t,this.pos=e,this.i=i,this.off=0}findPos(t,e=1){for(;;){if(t>this.pos||t==this.pos&&(e>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function Ze(t,e,i,n,s,r,o,a,l){let{children:h}=t,c=h.length?h[e]:null,f=r.length?r[r.length-1]:null,u=f?f.breakAfter:o;if(!(e==n&&c&&!o&&!u&&r.length<2&&c.merge(i,s,r.length?f:null,0==i,a,l))){if(n<h.length){let t=h[n];t&&(s<t.length||t.breakAfter&&(null==f?void 0:f.breakAfter))?(e==n&&(t=t.split(s),s=0),!u&&f&&t.merge(0,s,f,!0,0,l)?r[r.length-1]=t:((s||t.children.length&&!t.children[0].length)&&t.merge(0,s,null,!1,0,l),r.push(t))):(null==t?void 0:t.breakAfter)&&(f?f.breakAfter=1:o=1),n++}for(c&&(c.breakAfter=o,i>0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,a,0)?c.breakAfter=r.shift().breakAfter:(i<c.length||c.children.length&&0==c.children[c.children.length-1].length)&&c.merge(i,c.length,null,!1,a,0),e++));e<n&&r.length;)if(h[n-1].become(r[r.length-1]))n--,r.pop(),l=r.length?0:a;else{if(!h[e].become(r[0]))break;e++,r.shift(),a=r.length?0:l}!r.length&&e&&n<h.length&&!h[e-1].breakAfter&&h[n].merge(0,0,h[e-1],!1,a,l)&&e--,(e<n||r.length)&&t.replaceChildren(e,n,r)}}function Ce(t,e,i,n,s,r){let o=t.childCursor(),{i:a,off:l}=o.findPos(i,1),{i:h,off:c}=o.findPos(e,-1),f=e-i;for(let t of n)f+=t.length;t.length+=f,Ze(t,h,c,a,l,n,0,s,r)}let Te="undefined"!=typeof navigator?navigator:{userAgent:"",vendor:"",platform:""},Ae="undefined"!=typeof document?document:{documentElement:{style:{}}};const Re=/Edge\/(\d+)/.exec(Te.userAgent),Xe=/MSIE \d/.test(Te.userAgent),Ye=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Te.userAgent),We=!!(Xe||Ye||Re),Me=!We&&/gecko\/(\d+)/i.test(Te.userAgent),je=!We&&/Chrome\/(\d+)/.exec(Te.userAgent),De="webkitFontSmoothing"in Ae.documentElement.style,Ee=!We&&/Apple Computer/.test(Te.vendor),qe=Ee&&(/Mobile\/\w+/.test(Te.userAgent)||Te.maxTouchPoints>2);var _e={mac:qe||/Mac/.test(Te.platform),windows:/Win/.test(Te.platform),linux:/Linux|X11/.test(Te.platform),ie:We,ie_version:Xe?Ae.documentMode||6:Ye?+Ye[1]:Re?+Re[1]:0,gecko:Me,gecko_version:Me?+(/Firefox\/(\d+)/.exec(Te.userAgent)||[0,0])[1]:0,chrome:!!je,chrome_version:je?+je[1]:0,ios:qe,android:/Android\b/.test(Te.userAgent),webkit:De,safari:Ee,webkit_version:De?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:null!=Ae.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class Ve extends Qe{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){3==t.nodeType&&this.createDOM(t)}merge(t,e,i){return!(8&this.flags||i&&(!(i instanceof Ve)||this.length-(e-t)+i.length>256||8&i.flags))&&(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new Ve(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=8&this.flags,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new xe(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return function(t,e,i){let n=t.nodeValue.length;e>n&&(e=n);let s=e,r=e,o=0;0==e&&i<0||e==n&&i>=0?_e.chrome||_e.gecko||(e?(s--,o=1):r<n&&(r++,o=-1)):i<0?s--:r<n&&r++;let a=ve(t,s,r).getClientRects();if(!a.length)return null;let l=a[(o?o<0:i>=0)?0:a.length-1];_e.safari&&!o&&0==l.width&&(l=Array.prototype.find.call(a,(t=>t.width))||l);return o?ue(l,o<0):l||null}(this.dom,t,e)}}class Ie extends Qe{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let t of e)t.setParent(this)}setAttrs(t){if(ye(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!(8&(this.flags|t.flags))}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,s,r){return(!i||!(!(i instanceof Ie&&i.mark.eq(this.mark))||t&&s<=0||e<this.length&&r<=0))&&(Ce(this,t,e,i?i.children.slice():[],s-1,r-1),this.markDirty(),!0)}split(t){let e=[],i=0,n=-1,s=0;for(let r of this.children){let o=i+r.length;o>t&&e.push(i<t?r.split(t-i):r),n<0&&i>=t&&(n=s),i=o,s++}let r=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new Ie(this.mark,e,r)}domAtPos(t){return Ge(this,t)}coordsAt(t,e){return Ne(this,t,e)}}class ze extends Qe{static create(t,e,i){return new ze(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=ze.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof ze&&this.widget.compare(i.widget))||t>0&&s<=0||e<this.length&&r<=0))&&(this.length=t+(i?i.length:0)+(this.length-e),!0)}become(t){return t instanceof ze&&t.side==this.side&&this.widget.constructor==t.widget.constructor&&(this.widget.compare(t.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,!0)}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get overrideDOMText(){if(0==this.length)return e.empty;let t=this;for(;t.parent;)t=t.parent;let{view:i}=t,n=i&&i.state.doc,s=this.posAtStart;return n?n.slice(s,s+this.length):e.empty}domAtPos(t){return(this.length?0==t:this.side>0)?xe.before(this.dom):xe.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:t>0;for(let e=r?n.length-1:0;s=n[e],!(t>0?0==e:e==n.length-1||s.top<s.bottom);e+=r?-1:1);return ue(s,!r)}get isEditable(){return!1}get isWidget(){return!0}get isHidden(){return this.widget.isHidden}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}}class Be extends Qe{constructor(t){super(),this.side=t}get length(){return 0}merge(){return!1}become(t){return t instanceof Be&&t.side==this.side}split(){return new Be(this.side)}sync(){if(!this.dom){let t=document.createElement("img");t.className="cm-widgetBuffer",t.setAttribute("aria-hidden","true"),this.setDOM(t)}}getSide(){return this.side}domAtPos(t){return this.side>0?xe.before(this.dom):xe.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return e.empty}get isHidden(){return!0}}function Ge(t,e){let i=t.dom,{children:n}=t,s=0;for(let t=0;s<n.length;s++){let r=n[s],o=t+r.length;if(!(o==t&&r.getSide()<=0)){if(e>t&&e<o&&r.dom.parentNode==i)return r.domAtPos(e-t);if(e<=t)break;t=o}}for(let t=s;t>0;t--){let e=n[t-1];if(e.dom.parentNode==i)return e.domAtPos(e.length)}for(let t=s;t<n.length;t++){let e=n[t];if(e.dom.parentNode==i)return e.domAtPos(0)}return new xe(i,0)}function Le(t,e,i){let n,{children:s}=t;i>0&&e instanceof Ie&&s.length&&(n=s[s.length-1])instanceof Ie&&n.mark.eq(e.mark)?Le(n,e.children[0],i-1):(s.push(e),e.setParent(t)),t.length+=e.length}function Ne(t,e,i){let n=null,s=-1,r=null,o=-1;!function t(e,a){for(let l=0,h=0;l<e.children.length&&h<=a;l++){let c=e.children[l],f=h+c.length;f>=a&&(c.children.length?t(c,a-h):(!r||r.isHidden&&i>0)&&(f>a||h==f&&c.getSide()>0)?(r=c,o=a-h):(h<a||h==f&&c.getSide()<0&&!c.isHidden)&&(n=c,s=a-h)),h=f}}(t,e);let a=(i<0?n:r)||n||r;return a?a.coordsAt(Math.max(0,a==n?s:o),i):function(t){let e=t.dom.lastChild;if(!e)return t.dom.getBoundingClientRect();let i=ae(e);return i[i.length-1]||null}(t)}function Ue(t,e){for(let i in t)"class"==i&&e.class?e.class+=" "+t.class:"style"==i&&e.style?e.style+=";"+t.style:e[i]=t[i];return e}Ve.prototype.children=ze.prototype.children=Be.prototype.children=ke;const He=Object.create(null);function Fe(t,e,i){if(t==e)return!0;t||(t=He),e||(e=He);let n=Object.keys(t),s=Object.keys(e);if(n.length-(i&&n.indexOf(i)>-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||t[r]!==e[r]))return!1;return!0}function Je(t,e,i){let n=!1;if(e)for(let s in e)i&&s in i||(n=!0,"style"==s?t.style.cssText="":t.removeAttribute(s));if(i)for(let s in i)e&&e[s]==i[s]||(n=!0,"style"==s?t.style.cssText=i[s]:t.setAttribute(s,i[s]));return n}function Ke(t){let e=Object.create(null);for(let i=0;i<t.attributes.length;i++){let n=t.attributes[i];e[n.name]=n.value}return e}class ti extends Qe{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,s,r){if(i){if(!(i instanceof ti))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),Ce(this,t,e,i?i.children.slice():[],s,r),!0}split(t){let e=new ti;if(e.breakAfter=this.breakAfter,0==this.length)return e;let{i:i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let t=i;t<this.children.length;t++)e.append(this.children[t],0);for(;i>0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Fe(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Le(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ue(e,this.attrs||{})),i&&(this.attrs=Ue({class:i},this.attrs||{}))}domAtPos(t){return Ge(this,t)}reuseDOM(t){"DIV"==t.nodeName&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?4&this.flags&&(ye(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Je(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&Qe.get(n)instanceof Ie;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=Qe.get(n))||void 0===i?void 0:i.isEditable)||_e.ios&&this.children.some((t=>t instanceof Ve))))){let t=document.createElement("BR");t.cmIgnore=!0,this.dom.appendChild(t)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let t,e=0;for(let i of this.children){if(!(i instanceof Ve)||/[^ -~]/.test(i.text))return null;let n=ae(i.dom);if(1!=n.length)return null;e+=n[0].width,t=n[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:t}:null}coordsAt(t,e){let i=Ne(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:t}=this.parent.view.viewState,e=i.bottom-i.top;if(Math.abs(e-t.lineHeight)<2&&t.textHeight<e){let n=(e-t.textHeight)/2;return{top:i.top+n,bottom:i.bottom-n,left:i.left,right:i.left}}}return i}become(t){return!1}covers(){return!0}static find(t,e){for(let i=0,n=0;i<t.children.length;i++){let s=t.children[i],r=n+s.length;if(r>=e){if(s instanceof ti)return s;if(r>e)break}n=r+s.breakAfter}return null}}class ei extends Qe{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof ei&&this.widget.compare(i.widget))||t>0&&s<=0||e<this.length&&r<=0))&&(this.length=t+(i?i.length:0)+(this.length-e),!0)}domAtPos(t){return 0==t?xe.before(this.dom):xe.after(this.dom,t==this.length)}split(t){let e=this.length-t;this.length=t;let i=new ei(this.widget,e,this.deco);return i.breakAfter=this.breakAfter,i}get children(){return ke}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}get overrideDOMText(){return this.parent?this.parent.view.state.doc.slice(this.posAtStart,this.posAtEnd):e.empty}domBoundsAround(){return null}become(t){return t instanceof ei&&t.widget.constructor==this.widget.constructor&&(t.widget.compare(this.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,this.deco=t.deco,this.breakAfter=t.breakAfter,!0)}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get isEditable(){return!1}get isWidget(){return!0}coordsAt(t,e){return this.widget.coordsAt(this.dom,t,e)}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}covers(t){let{startSide:e,endSide:i}=this.deco;return e!=i&&(t<0?e<0:i>0)}}class ii{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}}var ni=function(t){return t[t.Text=0]="Text",t[t.WidgetBefore=1]="WidgetBefore",t[t.WidgetAfter=2]="WidgetAfter",t[t.WidgetRange=3]="WidgetRange",t}(ni||(ni={}));class si extends Pt{constructor(t,e,i,n){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(t){return new ri(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new ai(t,e,e,i,t.widget||null,!1)}static replace(t){let e,i,n=!!t.block;if(t.isBlockGap)e=-5e8,i=4e8;else{let{start:s,end:r}=li(t,n);e=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new ai(t,e,i,n,t.widget||null,!0)}static line(t){return new oi(t)}static set(t,e=!1){return At.of(t,e)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}si.none=At.empty;class ri extends si{constructor(t){let{start:e,end:i}=li(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof ri&&this.tagName==t.tagName&&(this.class||(null===(e=this.attrs)||void 0===e?void 0:e.class))==(t.class||(null===(i=t.attrs)||void 0===i?void 0:i.class))&&Fe(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}}ri.prototype.point=!1;class oi extends si{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof oi&&this.spec.class==t.spec.class&&Fe(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}}oi.prototype.mapMode=k.TrackBefore,oi.prototype.point=!0;class ai extends si{constructor(t,e,i,n,s,r){super(e,i,s,t),this.block=n,this.isReplace=r,this.mapMode=n?e<=0?k.TrackBefore:k.TrackAfter:k.TrackDel}get type(){return this.startSide!=this.endSide?ni.WidgetRange:this.startSide<=0?ni.WidgetBefore:ni.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof ai&&(e=this.widget,i=t.widget,e==i||!!(e&&i&&e.compare(i)))&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide;var e,i}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}}function li(t,e=!1){let{inclusiveStart:i,inclusiveEnd:n}=t;return null==i&&(i=t.inclusive),null==n&&(n=t.inclusive),{start:null!=i?i:e,end:null!=n?n:e}}function hi(t,e,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=t?i[s]=Math.max(i[s],e):i.push(t,e)}ai.prototype.point=!0;class ci{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ei&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new ti),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(fi(new Be(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||t&&this.content.length&&this.content[this.content.length-1]instanceof ei||this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:e,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}this.text=e,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(fi(new Ve(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof ai){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=e-t;if(i instanceof ai)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ei(i.widget||new ui("div"),o,i));else{let r=ze.create(i.widget||new ui("span"),o,o?0:i.startSide),a=this.atCursorPos&&!r.isEditable&&s<=n.length&&(t<e||i.startSide>0),l=!r.isEditable&&(t<e||s>n.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||a||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),a&&(h.append(fi(new Be(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(fi(r,n),s),this.atCursorPos=l,this.pendingBuffer=l?t<e||s>n.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=s)}static build(t,e,i,n,s){let r=new ci(t,e,i,s);return r.openEnd=At.spans(n,e,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function fi(t,e){for(let i of e)t=new Ie(i,[t],t.length);return t}class ui extends ii{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}var di=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(di||(di={}));const pi=di.LTR,Oi=di.RTL;function gi(t){let e=[];for(let i=0;i<t.length;i++)e.push(1<<+t[i]);return e}const mi=gi("88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008"),wi=gi("4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333"),vi=Object.create(null),bi=[];for(let t of["()","[]","{}"]){let e=t.charCodeAt(0),i=t.charCodeAt(1);vi[e]=i,vi[i]=-e}function yi(t){return t<=247?mi[t]:1424<=t&&t<=1524?2:1536<=t&&t<=1785?wi[t-1536]:1774<=t&&t<=2220?4:8192<=t&&t<=8204?256:64336<=t&&t<=65023?4:1}const Si=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/;class xi{get dir(){return this.level%2?Oi:pi}constructor(t,e,i){this.from=t,this.to=e,this.level=i}side(t,e){return this.dir==e==t?this.to:this.from}forward(t,e){return t==(this.dir==e)}static find(t,e,i,n){let s=-1;for(let r=0;r<t.length;r++){let o=t[r];if(o.from<=e&&o.to>=e){if(o.level==i)return r;(s<0||(0!=n?n<0?o.from<e:o.to>e:t[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function ki(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let n=t[i],s=e[i];if(n.from!=s.from||n.to!=s.to||n.direction!=s.direction||!ki(n.inner,s.inner))return!1}return!0}const Qi=[];function $i(t,e,i,n,s,r,o){let a=n%2?2:1;if(n%2==s%2)for(let l=e,h=0;l<i;){let e=!0,c=!1;if(h==r.length||l<r[h].from){let t=Qi[l];t!=a&&(e=!1,c=16==t)}let f=e||1!=a?null:[],u=e?n:n+1,d=l;t:for(;;)if(h<r.length&&d==r[h].from){if(c)break t;let p=r[h];if(!e)for(let t=p.to,e=h+1;;){if(t==i)break t;if(!(e<r.length&&r[e].from==t)){if(Qi[t]==a)break t;break}t=r[e++].to}if(h++,f)f.push(p);else{p.from>l&&o.push(new xi(l,p.from,u)),Pi(t,p.direction==pi!=!(u%2)?n+1:n,s,p.inner,p.from,p.to,o),l=p.to}d=p.to}else{if(d==i||(e?Qi[d]!=a:Qi[d]==a))break;d++}f?$i(t,l,d,n+1,s,f,o):l<d&&o.push(new xi(l,d,u)),l=d}else for(let l=i,h=r.length;l>e;){let i=!0,c=!1;if(!h||l>r[h-1].to){let t=Qi[l-1];t!=a&&(i=!1,c=16==t)}let f=i||1!=a?null:[],u=i?n:n+1,d=l;t:for(;;)if(h&&d==r[h-1].to){if(c)break t;let p=r[--h];if(!i)for(let t=p.from,i=h;;){if(t==e)break t;if(!i||r[i-1].to!=t){if(Qi[t-1]==a)break t;break}t=r[--i].from}if(f)f.push(p);else{p.to<l&&o.push(new xi(p.to,l,u)),Pi(t,p.direction==pi!=!(u%2)?n+1:n,s,p.inner,p.from,p.to,o),l=p.from}d=p.from}else{if(d==e||(i?Qi[d-1]!=a:Qi[d-1]==a))break;d--}f?$i(t,d,l,n+1,s,f,o):d<l&&o.push(new xi(d,l,u)),l=d}}function Pi(t,e,i,n,s,r,o){let a=e%2?2:1;!function(t,e,i,n,s){for(let r=0;r<=n.length;r++){let o=r?n[r-1].to:e,a=r<n.length?n[r].from:i,l=r?256:s;for(let e=o,i=l,n=l;e<a;e++){let s=yi(t.charCodeAt(e));512==s?s=i:8==s&&4==n&&(s=16),Qi[e]=4==s?2:s,7&s&&(n=s),i=s}for(let t=o,e=l,n=l;t<a;t++){let s=Qi[t];if(128==s)t<a-1&&e==Qi[t+1]&&24&e?s=Qi[t]=e:Qi[t]=256;else if(64==s){let s=t+1;for(;s<a&&64==Qi[s];)s++;let r=t&&8==e||s<i&&8==Qi[s]?1==n?1:8:256;for(let e=t;e<s;e++)Qi[e]=r;t=s-1}else 8==s&&1==n&&(Qi[t]=1);e=s,7&s&&(n=s)}}}(t,s,r,n,a),function(t,e,i,n,s){let r=1==s?2:1;for(let o=0,a=0,l=0;o<=n.length;o++){let h=o?n[o-1].to:e,c=o<n.length?n[o].from:i;for(let e,i,n,o=h;o<c;o++)if(i=vi[e=t.charCodeAt(o)])if(i<0){for(let t=a-3;t>=0;t-=3)if(bi[t+1]==-i){let e=bi[t+2],i=2&e?s:4&e?1&e?r:s:0;i&&(Qi[o]=Qi[bi[t]]=i),a=t;break}}else{if(189==bi.length)break;bi[a++]=o,bi[a++]=e,bi[a++]=l}else if(2==(n=Qi[o])||1==n){let t=n==s;l=t?0:1;for(let e=a-3;e>=0;e-=3){let i=bi[e+2];if(2&i)break;if(t)bi[e+2]|=2;else{if(4&i)break;bi[e+2]|=4}}}}}(t,s,r,n,a),function(t,e,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:t,a=s<i.length?i[s].from:e;for(let l=o;l<a;){let o=Qi[l];if(256==o){let o=l+1;for(;;)if(o==a){if(s==i.length)break;o=i[s++].to,a=s<i.length?i[s].from:e}else{if(256!=Qi[o])break;o++}let h=1==r,c=h==(1==(o<e?Qi[o]:n))?h?1:2:n;for(let e=o,n=s,r=n?i[n-1].to:t;e>l;)e==r&&(e=i[--n].from,r=n?i[n-1].to:t),Qi[--e]=c;l=o}else r=o,l++}}}(s,r,n,a),$i(t,s,r,e,i,n,o)}function Zi(t,e,i){if(!t)return[new xi(0,0,e==Oi?1:0)];if(e==pi&&!i.length&&!Si.test(t))return Ci(t.length);if(i.length)for(;t.length>Qi.length;)Qi[Qi.length]=256;let n=[],s=e==pi?0:1;return Pi(t,s,s,i,0,t.length,n),n}function Ci(t){return[new xi(0,t,0)]}let Ti="";function Ai(t,e,i,n,s){var r;let o=n.head-t.from,a=xi.find(e,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc),l=e[a],h=l.side(s,i);if(o==h){let t=a+=s?1:-1;if(t<0||t>=e.length)return null;l=e[a=t],o=l.side(!s,i),h=l.side(s,i)}let c=O(t.text,o,l.forward(s,i));(c<l.from||c>l.to)&&(c=h),Ti=t.text.slice(Math.min(o,c),Math.max(o,c));let f=a==(s?e.length-1:0)?null:e[a+(s?1:-1)];return f&&c==h&&f.level+(s?0:1)<l.level?Y.cursor(f.side(!s,i)+t.from,f.forward(s,i)?1:-1,f.level):Y.cursor(c+t.from,l.forward(s,i)?-1:1,l.level)}function Ri(t,e,i){for(let n=e;n<i;n++){let e=yi(t.charCodeAt(n));if(1==e)return pi;if(2==e||4==e)return Oi}return pi}const Xi=j.define(),Yi=j.define(),Wi=j.define(),Mi=j.define(),ji=j.define(),Di=j.define(),Ei=j.define(),qi=j.define({combine:t=>t.some((t=>t))}),_i=j.define({combine:t=>t.some((t=>t))});class Vi{constructor(t,e="nearest",i="nearest",n=5,s=5,r=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=s,this.isSnapshot=r}map(t){return t.empty?this:new Vi(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new Vi(Y.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Ii=dt.define({map:(t,e)=>t.map(e)});function zi(t,e,i){let n=t.facet(Mi);n.length?n[0](e):window.onerror?window.onerror(String(e),i,void 0,void 0,e):i?console.error(i+":",e):console.error(e)}const Bi=j.define({combine:t=>!t.length||t[0]});let Gi=0;const Li=j.define();class Ni{constructor(t,e,i,n,s){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(t,e){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=e||{};return new Ni(Gi++,t,i,n,(t=>{let e=[Li.of(t)];return r&&e.push(Ji.of((e=>{let i=e.plugin(t);return i?r(i):si.none}))),s&&e.push(s(t)),e}))}static fromClass(t,e){return Ni.define((e=>new t(e)),e)}}class Ui{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(e){if(zi(t.state,e,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(t){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){zi(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(null===(e=this.value)||void 0===e?void 0:e.destroy)try{this.value.destroy()}catch(e){zi(t.state,e,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Hi=j.define(),Fi=j.define(),Ji=j.define(),Ki=j.define(),tn=j.define(),en=j.define();function nn(t,e){let i=t.state.facet(en);if(!i.length)return i;let n=i.map((e=>e instanceof Function?e(t):e)),s=[];return At.spans(n,e.from,e.to,{point(){},span(t,i,n,r){let o=t-e.from,a=i-e.from,l=s;for(let t=n.length-1;t>=0;t--,r--){let i,s=n[t].spec.bidiIsolate;if(null==s&&(s=Ri(e.text,o,a)),r>0&&l.length&&(i=l[l.length-1]).to==o&&i.direction==s)i.to=a,l=i.inner;else{let t={from:o,to:a,direction:s,inner:[]};l.push(t),l=t.inner}}}}),s}const sn=j.define();function rn(t){let e=0,i=0,n=0,s=0;for(let r of t.state.facet(sn)){let o=r(t);o&&(null!=o.left&&(e=Math.max(e,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:e,right:i,top:n,bottom:s}}const on=j.define();class an{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new an(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toA<i.fromA)break;i=i.join(n),t.splice(e-1,1)}}return t.splice(e,0,i),t}static extendWithRanges(t,e){if(0==e.length)return t;let i=[];for(let n=0,s=0,r=0,o=0;;n++){let a=n==t.length?null:t[n],l=r-o,h=a?a.fromB:1e9;for(;s<e.length&&e[s]<h;){let t=e[s],n=e[s+1],r=Math.max(o,t),a=Math.min(h,n);if(r<=a&&new an(r+l,a+l,r,a).addToSet(i),n>h)break;s+=2}if(!a)return i;new an(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,o=a.toB}}}class ln{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=$.empty(this.startState.doc.length);for(let t of i)this.changes=this.changes.compose(t.changes);let n=[];this.changes.iterChangedRanges(((t,e,i,s)=>n.push(new an(t,e,i,s)))),this.changedRanges=n}static create(t,e,i){return new ln(t,e,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((t=>t.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}class hn extends Qe{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new ti],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new an(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every((({fromA:t,toA:e})=>e<this.minWidthFrom||t>this.minWidthTo))?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&((null===(e=this.domChanged)||void 0===e?void 0:e.newSel)?n=this.domChanged.newSel.head:function(t,e){let i=!1;e&&t.iterChangedRanges(((t,n)=>{t<e.to&&n>e.from&&(i=!0)}));return i}(t.changes,this.hasComposition)||t.selectionSet||(n=t.state.selection.main.head));let s=n>-1?function(t,e,i){let n=fn(t,i);if(!n)return null;let{node:s,from:r,to:o}=n,a=s.nodeValue;if(/[\n\r]/.test(a))return null;if(t.state.doc.sliceString(n.from,n.to)!=a)return null;let l=e.invertedDesc,h=new an(l.mapPos(r),l.mapPos(o),r,o),c=[];for(let e=s.parentNode;;e=e.parentNode){let i=Qe.get(e);if(i instanceof Ie)c.push({node:e,deco:i.mark});else{if(i instanceof ti||"DIV"==e.nodeName&&e.parentNode==t.contentDOM)return{range:h,text:s,marks:c,line:e};if(e==t.contentDOM)return null;c.push({node:e,deco:new ri({inclusive:!0,attributes:Ke(e),tagName:e.tagName.toLowerCase()})})}}}(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:e,to:n}=this.hasComposition;i=new an(e,n,t.changes.mapPos(e,-1),t.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(_e.ie||_e.chrome)&&!s&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let r=function(t,e,i){let n=new dn;return At.compare(t,e,i,n),n.changes}(this.decorations,this.updateDeco(),t.changes);return i=an.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,t.startState.doc.length,s),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let t=_e.chrome||_e.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,t),this.flags&=-8,t&&(t.written||n.selectionRange.focusNode!=t.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((t=>t.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to<this.view.state.doc.length)for(let t of this.children)t instanceof ei&&t.widget instanceof cn&&s.push(t.dom);n.updateGaps(s)}updateChildren(t,e,i){let n=i?i.range.addToSet(t.slice()):t,s=this.childCursor(e);for(let t=n.length-1;;t--){let e=t>=0?n[t]:null;if(!e)break;let r,o,a,l,{fromA:h,toA:c,fromB:f,toB:u}=e;if(i&&i.range.fromB<u&&i.range.toB>f){let t=ci.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),e=ci.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);o=t.breakAtStart,a=t.openStart,l=e.openEnd;let n=this.compositionView(i);e.breakAtStart?n.breakAfter=1:e.content.length&&n.merge(n.length,n.length,e.content[0],!1,e.openStart,0)&&(n.breakAfter=e.content[0].breakAfter,e.content.shift()),t.content.length&&n.merge(0,0,t.content[t.content.length-1],!0,0,t.openEnd)&&t.content.pop(),r=t.content.concat(n).concat(e.content)}else({content:r,breakAtStart:o,openStart:a,openEnd:l}=ci.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:d,off:p}=s.findPos(c,1),{i:O,off:g}=s.findPos(h,-1);Ze(this,O,g,d,p,r,o,a,l)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new Ve(t.text.nodeValue);e.flags|=8;for(let{deco:i}of t.marks)e=new Ie(i,[e],e.length);let i=new ti;return i.append(e,0),i}fixCompositionDOM(t){let e=(t,e)=>{e.flags|=8|(e.children.some((t=>7&t.flags))?1:0),this.markedForComposition.add(e);let i=Qe.get(t);i&&i!=e&&(i.dom=null),e.setDOM(t)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let s=t.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],e(s>=0?t.marks[s].node:t.text,n)}updateSelection(t=!1,e=!1){!t&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&oe(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(o.anchor)),l=o.empty?a:this.moveToLine(this.domAtPos(o.head));if(_e.gecko&&o.empty&&!this.hasComposition&&(1==(h=a).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable))){let t=document.createTextNode("");this.view.observer.ignore((()=>a.node.insertBefore(t,a.node.childNodes[a.offset]||null))),a=l=new xe(t,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&(le(a.node,a.offset,c.anchorNode,c.anchorOffset)&&le(l.node,l.offset,c.focusNode,c.focusOffset)||this.suppressWidgetCursorChange(c,o))||(this.view.observer.ignore((()=>{_e.android&&_e.chrome&&this.dom.contains(c.focusNode)&&function(t,e){for(let i=t;i&&i!=e;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let t=se(this.view.root);if(t)if(o.empty){if(_e.gecko){let t=(e=a.node,n=a.offset,1!=e.nodeType?0:(n&&"false"==e.childNodes[n-1].contentEditable?1:0)|(n<e.childNodes.length&&"false"==e.childNodes[n].contentEditable?2:0));if(t&&3!=t){let e=un(a.node,a.offset,1==t?1:-1);e&&(a=new xe(e.node,e.offset))}}t.collapse(a.node,a.offset),null!=o.bidiLevel&&void 0!==t.caretBidiLevel&&(t.caretBidiLevel=o.bidiLevel)}else if(t.extend){t.collapse(a.node,a.offset);try{t.extend(l.node,l.offset)}catch(t){}}else{let e=document.createRange();o.anchor>o.head&&([a,l]=[l,a]),e.setEnd(l.node,l.offset),e.setStart(a.node,a.offset),t.removeAllRanges(),t.addRange(e)}else;var e,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(a,l)),this.impreciseAnchor=a.precise?null:new xe(c.anchorNode,c.anchorOffset),this.impreciseHead=l.precise?null:new xe(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&le(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=se(t.root),{anchorNode:n,anchorOffset:s}=t.observer.selectionRange;if(!(i&&e.empty&&e.assoc&&i.modify))return;let r=ti.find(this,e.head);if(!r)return;let o=r.posAtStart;if(e.head==o||e.head==o+r.length)return;let a=this.coordsAt(e.head,-1),l=this.coordsAt(e.head,1);if(!a||!l||a.bottom>l.top)return;let h=this.domAtPos(e.head+e.assoc);i.collapse(h.node,h.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,s)}moveToLine(t){let e,i=this.dom;if(t.node!=i)return t;for(let n=t.offset;!e&&n<i.childNodes.length;n++){let t=Qe.get(i.childNodes[n]);t instanceof ti&&(e=t.domAtPos(0))}for(let n=t.offset-1;!e&&n>=0;n--){let t=Qe.get(i.childNodes[n]);t instanceof ti&&(e=t.domAtPos(t.length))}return e?new xe(e.node,e.offset,!0):t}nearest(t){for(let e=t;e;){let t=Qe.get(e);if(t&&t.rootView==this)return t;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e<this.children.length-1;){let t=this.children[e];if(i<t.length||t instanceof ti)break;e++,i=0}return this.children[e].domAtPos(i)}coordsAt(t,e){let i=null,n=0;for(let s=this.length,r=this.children.length-1;r>=0;r--){let o=this.children[r],a=s-o.breakAfter,l=a-o.length;if(a<t)break;l<=t&&(l<t||o.covers(-1))&&(a>t||o.covers(1))&&(!i||o instanceof ti&&!(i instanceof ti&&e>=0))&&(i=o,n=l),s=l}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof ti))return null;for(;n.children.length;){let{i:t,off:e}=n.childPos(i,1);for(;;t++){if(t==n.children.length)return null;if((n=n.children[t]).length)break}i=e}if(!(n instanceof Ve))return null;let s=O(n.text,i);if(s==i)return null;let r=ve(n.dom,i,s).getClientRects();for(let t=0;t<r.length;t++){let e=r[t];if(t==r.length-1||e.top<e.bottom&&e.left<e.right)return e}return null}measureVisibleLineHeights(t){let e=[],{from:i,to:n}=t,s=this.view.contentDOM.clientWidth,r=s>Math.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,a=this.view.textDirection==di.LTR;for(let t=0,l=0;l<this.children.length;l++){let h=this.children[l],c=t+h.length;if(c>n)break;if(t>=i){let i=h.dom.getBoundingClientRect();if(e.push(i.height),r){let e=h.dom.lastChild,n=e?ae(e):[];if(n.length){let e=n[n.length-1],r=a?e.right-i.left:i.right-e.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=t,this.minWidthTo=c)}}}t=c+h.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return"rtl"==getComputedStyle(this.children[e].dom).direction?di.RTL:di.LTR}measureTextSize(){for(let t of this.children)if(t instanceof ti){let e=t.measureTextSize();if(e)return e}let t,e,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=ae(n.firstChild)[0];t=n.getBoundingClientRect().height,e=s?s.width/27:7,i=s?s.height:t,n.remove()})),{lineHeight:t,charWidth:e,textHeight:i}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Pe(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let s=n==e.viewports.length?null:e.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(e.lineBlockAt(r).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(si.replace({widget:new cn(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return si.set(t)}updateDeco(){let t=this.view.state.facet(Ji).map(((t,e)=>(this.dynamicDecorationMap[e]="function"==typeof t)?t(this.view):t)),e=!1,i=this.view.state.facet(Ki).map(((t,i)=>{let n="function"==typeof t;return n&&(e=!0),n?t(this.view):t}));i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(At.join(i)));for(let e=t.length;e<t.length+3;e++)this.dynamicDecorationMap[e]=!1;return this.decorations=[...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco]}scrollIntoView(t){if(t.isSnapshot){let e=this.view.viewState.lineBlockAt(t.range.head);return this.view.scrollDOM.scrollTop=e.top-t.yMargin,void(this.view.scrollDOM.scrollLeft=t.xMargin)}let e,{range:i}=t,n=this.coordsAt(i.head,i.empty?i.assoc:i.head>i.anchor?-1:1);if(!n)return;!i.empty&&(e=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,e.left),top:Math.min(n.top,e.top),right:Math.max(n.right,e.right),bottom:Math.max(n.bottom,e.bottom)});let s=rn(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:a}=this.view.scrollDOM;!function(t,e,i,n,s,r,o,a){let l=t.ownerDocument,h=l.defaultView||window;for(let c=t,f=!1;c&&!f;)if(1==c.nodeType){let t,u=c==l.body,d=1,p=1;if(u)t=de(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(f=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let e=c.getBoundingClientRect();({scaleX:d,scaleY:p}=pe(c,e)),t={left:e.left,right:e.left+c.clientWidth*d,top:e.top,bottom:e.top+c.clientHeight*p}}let O=0,g=0;if("nearest"==s)e.top<t.top?(g=-(t.top-e.top+o),i>0&&e.bottom>t.bottom+g&&(g=e.bottom-t.bottom+g+o)):e.bottom>t.bottom&&(g=e.bottom-t.bottom+o,i<0&&e.top-g<t.top&&(g=-(t.top+g-e.top+o)));else{let n=e.bottom-e.top,r=t.bottom-t.top;g=("center"==s&&n<=r?e.top+n/2-r/2:"start"==s||"center"==s&&i<0?e.top-o:e.bottom-r+o)-t.top}if("nearest"==n?e.left<t.left?(O=-(t.left-e.left+r),i>0&&e.right>t.right+O&&(O=e.right-t.right+O+r)):e.right>t.right&&(O=e.right-t.right+r,i<0&&e.left<t.left+O&&(O=-(t.left+O-e.left+r))):O=("center"==n?e.left+(e.right-e.left)/2-(t.right-t.left)/2:"start"==n==a?e.left-r:e.right-(t.right-t.left)+r)-t.left,O||g)if(u)h.scrollBy(O,g);else{let t=0,i=0;if(g){let t=c.scrollTop;c.scrollTop+=g/p,i=(c.scrollTop-t)*p}if(O){let e=c.scrollLeft;c.scrollLeft+=O/d,t=(c.scrollLeft-e)*d}e={left:e.left-t,top:e.top-i,right:e.right-t,bottom:e.bottom-i},t&&Math.abs(t-O)<1&&(n="nearest"),i&&Math.abs(i-g)<1&&(s="nearest")}if(u)break;c=c.assignedSlot||c.parentNode}else{if(11!=c.nodeType)break;c=c.host}}(this.view.scrollDOM,r,i.head<i.anchor?-1:1,t.x,t.y,Math.max(Math.min(t.xMargin,o),-o),Math.max(Math.min(t.yMargin,a),-a),this.view.textDirection==di.LTR)}}class cn extends ii{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}}function fn(t,e){let i=t.observer.selectionRange,n=i.focusNode&&un(i.focusNode,i.focusOffset,0);if(!n)return null;let s=e-n.offset;return{from:s,to:s+n.node.nodeValue.length,node:n.node}}function un(t,e,i){if(i<=0)for(let i=t,n=e;;){if(3==i.nodeType)return{node:i,offset:n};if(!(1==i.nodeType&&n>0))break;i=i.childNodes[n-1],n=fe(i)}if(i>=0)for(let n=t,s=e;;){if(3==n.nodeType)return{node:n,offset:s};if(!(1==n.nodeType&&s<n.childNodes.length&&i>=0))break;n=n.childNodes[s],s=0}return null}let dn=class{constructor(){this.changes=[]}compareRange(t,e){hi(t,e,this.changes)}comparePoint(t,e){hi(t,e,this.changes)}};function pn(t,e){return e.left>t?e.left-t:Math.max(0,t-e.right)}function On(t,e){return e.top>t?e.top-t:Math.max(0,t-e.bottom)}function gn(t,e){return t.top<e.bottom-1&&t.bottom>e.top+1}function mn(t,e){return e<t.top?{top:e,left:t.left,right:t.right,bottom:t.bottom}:t}function wn(t,e){return e>t.bottom?{top:t.top,left:t.left,right:t.right,bottom:e}:t}function vn(t,e,i){let n,s,r,o,a,l,h,c,f=!1;for(let u=t.firstChild;u;u=u.nextSibling){let t=ae(u);for(let d=0;d<t.length;d++){let p=t[d];s&&gn(s,p)&&(p=mn(wn(p,s.bottom),s.top));let O=pn(e,p),g=On(i,p);if(0==O&&0==g)return 3==u.nodeType?bn(u,e,i):vn(u,e,i);if(!n||o>g||o==g&&r>O){n=u,s=p,r=O,o=g;let a=g?i<p.top?-1:1:O?e<p.left?-1:1:0;f=!a||(a>0?d<t.length-1:d>0)}0==O?i>p.bottom&&(!h||h.bottom<p.bottom)?(a=u,h=p):i<p.top&&(!c||c.top>p.top)&&(l=u,c=p):h&&gn(h,p)?h=wn(h,p.bottom):c&&gn(c,p)&&(c=mn(c,p.top))}}if(h&&h.bottom>=i?(n=a,s=h):c&&c.top<=i&&(n=l,s=c),!n)return{node:t,offset:0};let u=Math.max(s.left,Math.min(s.right,e));return 3==n.nodeType?bn(n,u,i):f&&"false"!=n.contentEditable?vn(n,u,i):{node:t,offset:Array.prototype.indexOf.call(t.childNodes,n)+(e>=(s.left+s.right)/2?1:0)}}function bn(t,e,i){let n=t.nodeValue.length,s=-1,r=1e9,o=0;for(let a=0;a<n;a++){let n=ve(t,a,a+1).getClientRects();for(let l=0;l<n.length;l++){let h=n[l];if(h.top==h.bottom)continue;o||(o=e-h.left);let c=(h.top>i?h.top-i:i-h.bottom)-1;if(h.left-1<=e&&h.right+1>=e&&c<r){let i=e>=(h.left+h.right)/2,n=i;if(_e.chrome||_e.gecko){ve(t,a).getBoundingClientRect().left==h.right&&(n=!i)}if(c<=0)return{node:t,offset:a+(n?1:0)};s=a+(n?1:0),r=c}}}return{node:t,offset:s>-1?s:o>0?t.nodeValue.length:0}}function yn(t,e,i,n=-1){var s,r;let o,a=t.contentDOM.getBoundingClientRect(),l=a.top+t.viewState.paddingTop,{docHeight:h}=t.viewState,{x:c,y:f}=e,u=f-l;if(u<0)return 0;if(u>h)return t.state.doc.length;for(let e=t.viewState.heightOracle.textHeight/2,s=!1;o=t.elementAtHeight(u),o.type!=ni.Text;)for(;u=n>0?o.bottom+e:o.top-e,!(u>=0&&u<=h);){if(s)return i?null:0;s=!0,n=-n}f=l+u;let d=o.from;if(d<t.viewport.from)return 0==t.viewport.from?0:i?null:Sn(t,a,o,c,f);if(d>t.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:i?null:Sn(t,a,o,c,f);let p=t.dom.ownerDocument,O=t.root.elementFromPoint?t.root:p,g=O.elementFromPoint(c,f);g&&!t.contentDOM.contains(g)&&(g=null),g||(c=Math.max(a.left+1,Math.min(a.right-1,c)),g=O.elementFromPoint(c,f),g&&!t.contentDOM.contains(g)&&(g=null));let m,w=-1;if(g&&0!=(null===(s=t.docView.nearest(g))||void 0===s?void 0:s.isEditable))if(p.caretPositionFromPoint){let t=p.caretPositionFromPoint(c,f);t&&({offsetNode:m,offset:w}=t)}else if(p.caretRangeFromPoint){let e=p.caretRangeFromPoint(c,f);e&&(({startContainer:m,startOffset:w}=e),(!t.contentDOM.contains(m)||_e.safari&&function(t,e,i){let n;if(3!=t.nodeType||e!=(n=t.nodeValue.length))return!1;for(let e=t.nextSibling;e;e=e.nextSibling)if(1!=e.nodeType||"BR"!=e.nodeName)return!1;return ve(t,n-1,n).getBoundingClientRect().left>i}(m,w,c)||_e.chrome&&function(t,e,i){if(0!=e)return!1;for(let e=t;;){let t=e.parentNode;if(!t||1!=t.nodeType||t.firstChild!=e)return!1;if(t.classList.contains("cm-line"))break;e=t}let n=1==t.nodeType?t.getBoundingClientRect():ve(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return i-n.left>5}(m,w,c))&&(m=void 0))}if(!m||!t.docView.dom.contains(m)){let e=ti.find(t.docView,d);if(!e)return u>o.top+o.height/2?o.to:o.from;({node:m,offset:w}=vn(e.dom,c,f))}let v=t.docView.nearest(m);if(!v)return null;if(v.isWidget&&1==(null===(r=v.dom)||void 0===r?void 0:r.nodeType)){let t=v.dom.getBoundingClientRect();return e.y<t.top||e.y<=t.bottom&&e.x<=(t.left+t.right)/2?v.posAtStart:v.posAtEnd}return v.localPosFromDOM(m,w)+v.posAtStart}function Sn(t,e,i,n,s){let r=Math.round((n-e.left)*t.defaultCharacterWidth);if(t.lineWrapping&&i.height>1.5*t.defaultLineHeight){let e=t.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(t.defaultLineHeight-e))/e)*t.viewState.heightOracle.lineLength}let o=t.state.sliceDoc(i.from,i.to);return i.from+zt(o,r,t.state.tabSize)}function xn(t,e){let i=t.lineBlockAt(e);if(Array.isArray(i.type))for(let t of i.type)if(t.to>e||t.to==e&&(t.to==i.to||t.type==ni.Text))return t;return i}function kn(t,e,i,n){let s=t.state.doc.lineAt(e.head),r=t.bidiSpans(s),o=t.textDirectionAt(s.from);for(let a=e,l=null;;){let e=Ai(s,r,o,a,i),h=Ti;if(!e){if(s.number==(i?t.state.doc.lines:1))return a;h="\n",s=t.state.doc.line(s.number+(i?1:-1)),r=t.bidiSpans(s),e=t.visualLineSide(s,!i)}if(l){if(!l(h))return a}else{if(!n)return e;l=n(h)}a=e}}function Qn(t,e,i){for(;;){let n=0;for(let s of t)s.between(e-1,e+1,((t,s,r)=>{if(e>t&&e<s){let r=n||i||(e-t<s-e?-1:1);e=r<0?t:s,n=r}}));if(!n)return e}}function $n(t,e,i){let n=Qn(t.state.facet(tn).map((e=>e(t))),i.from,e.head>i.from?-1:1);return n==i.from?i:Y.cursor(n,n<i.from?1:-1)}class Pn{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastEscPress=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,_e.safari&&t.contentDOM.addEventListener("input",(()=>null)),_e.gecko&&function(t){ts.has(t)||(ts.add(t),t.addEventListener("copy",(()=>{})),t.addEventListener("cut",(()=>{})))}(t.contentDOM.ownerDocument)}handleEvent(t){(function(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let i,n=e.target;n!=t.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=Qe.get(n))&&i.ignoreEvent(e))return!1;return!0})(this.view,t)&&!this.ignoreDuringComposition(t)&&("keydown"==t.type&&this.keydown(t)||this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let t of i.observers)t(this.view,e);for(let t of i.handlers){if(e.defaultPrevented)break;if(t(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Cn(t),i=this.handlers,n=this.view.contentDOM;for(let t in e)if("scroll"!=t){let s=!e[t].handlers.length,r=i[t];r&&s!=!r.handlers.length&&(n.removeEventListener(t,this.handleEvent),r=null),r||n.addEventListener(t,this.handleEvent,{passive:s})}for(let t in i)"scroll"==t||e[t]||n.removeEventListener(t,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),9==t.keyCode&&Date.now()<this.lastEscPress+2e3)return!0;if(27!=t.keyCode&&Rn.indexOf(t.keyCode)<0&&(this.view.inputState.lastEscPress=0),_e.android&&_e.chrome&&!t.synthetic&&(13==t.keyCode||8==t.keyCode))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return!_e.ios||t.synthetic||t.altKey||t.metaKey||!((e=Tn.find((e=>e.keyCode==t.keyCode)))&&!t.ctrlKey||An.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(229!=t.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=e||t,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(){let t=this.pendingIOSKey;return!!t&&(this.pendingIOSKey=void 0,be(this.view.contentDOM,t.key,t.keyCode))}ignoreDuringComposition(t){return!!/^key/.test(t.type)&&(this.composing>0||!!(_e.safari&&!_e.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function Zn(t,e){return(i,n)=>{try{return e.call(t,n,i)}catch(t){zi(i.state,t)}}}function Cn(t){let e=Object.create(null);function i(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let e of t){let t=e.spec;if(t&&t.domEventHandlers)for(let n in t.domEventHandlers){let s=t.domEventHandlers[n];s&&i(n).handlers.push(Zn(e.value,s))}if(t&&t.domEventObservers)for(let n in t.domEventObservers){let s=t.domEventObservers[n];s&&i(n).observers.push(Zn(e.value,s))}}for(let t in Wn)i(t).handlers.push(Wn[t]);for(let t in Mn)i(t).observers.push(Mn[t]);return e}const Tn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],An="dthko",Rn=[16,17,18,20,91,92,224,225];function Xn(t){return.7*Math.max(0,t)+8}class Yn{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=function(t){let e=t.ownerDocument;for(let i=t.parentNode;i&&i!=e.body;)if(1==i.nodeType){if(i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)return i;i=i.assignedSlot||i.parentNode}else{if(11!=i.nodeType)break;i=i.host}return null}(t.contentDOM),this.atoms=t.state.facet(tn).map((e=>e(t)));let s=t.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(Qt.allowMultipleSelections)&&function(t,e){let i=t.state.facet(Xi);return i.length?i[0](e):_e.mac?e.metaKey:e.ctrlKey}(t,e),this.dragging=!(!function(t,e){let{main:i}=t.state.selection;if(i.empty)return!1;let n=se(t.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let t=0;t<s.length;t++){let i=s[t];if(i.left<=e.clientX&&i.right>=e.clientX&&i.top<=e.clientY&&i.bottom>=e.clientY)return!0}return!1}(t,e)||1!=Nn(e))&&null}start(t){!1===this.dragging&&this.select(t)}move(t){var e,i,n;if(0==t.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(i=this.startEvent,n=t,Math.max(Math.abs(i.clientX-n.clientX),Math.abs(i.clientY-n.clientY))<10))return;this.select(this.lastEvent=t);let s=0,r=0,o=(null===(e=this.scrollParent)||void 0===e?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},a=rn(this.view);t.clientX-a.left<=o.left+6?s=-Xn(o.left-t.clientX):t.clientX+a.right>=o.right-6&&(s=Xn(t.clientX-o.right)),t.clientY-a.top<=o.top+6?r=-Xn(o.top-t.clientY):t.clientY+a.bottom>=o.bottom-6&&(r=Xn(t.clientY-o.bottom)),this.setScrollSpeed(s,r)}up(t){null==this.dragging&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;i<t.ranges.length;i++){let n=t.ranges[i],s=null;if(n.empty){let t=Qn(this.atoms,n.from,0);t!=n.from&&(s=Y.cursor(t,-1))}else{let t=Qn(this.atoms,n.from,-1),e=Qn(this.atoms,n.to,1);t==n.from&&e==n.to||(s=Y.range(n.from==n.anchor?t:e,n.from==n.head?t:e))}s&&(e||(e=t.ranges.slice()),e[i]=s)}return e?Y.create(e,t.mainIndex):t}select(t){let{view:e}=this,i=this.skipAtoms(this.style.get(t,this.extend,this.multiple));!this.mustSelect&&i.eq(e.state.selection,!1===this.dragging)||this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(t){this.style.update(t)&&setTimeout((()=>this.select(this.lastEvent)),20)}}const Wn=Object.create(null),Mn=Object.create(null),jn=_e.ie&&_e.ie_version<15||_e.ios&&_e.webkit_version<604;function Dn(t,e){let i,{state:n}=t,s=1,r=n.toText(e),o=r.lines==n.selection.ranges.length;if(null!=Hn&&n.selection.ranges.every((t=>t.empty))&&Hn==r.toString()){let t=-1;i=n.changeByRange((i=>{let a=n.doc.lineAt(i.from);if(a.from==t)return{range:i};t=a.from;let l=n.toText((o?r.line(s++).text:e)+n.lineBreak);return{changes:{from:a.from,insert:l},range:Y.cursor(i.from+l.length)}}))}else i=o?n.changeByRange((t=>{let e=r.line(s++);return{changes:{from:t.from,to:t.to,insert:e.text},range:Y.cursor(t.from+e.length)}})):n.replaceSelection(r);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function En(t,e,i,n){if(1==n)return Y.cursor(e,i);if(2==n)return function(t,e,i=1){let n=t.charCategorizer(e),s=t.doc.lineAt(e),r=e-s.from;if(0==s.length)return Y.cursor(e);0==r?i=1:r==s.length&&(i=-1);let o=r,a=r;i<0?o=O(s.text,r,!1):a=O(s.text,r);let l=n(s.text.slice(o,a));for(;o>0;){let t=O(s.text,o,!1);if(n(s.text.slice(t,o))!=l)break;o=t}for(;a<s.length;){let t=O(s.text,a);if(n(s.text.slice(a,t))!=l)break;a=t}return Y.range(o+s.from,a+s.from)}(t.state,e,i);{let i=ti.find(t.docView,e),n=t.state.doc.lineAt(i?i.posAtEnd:e),s=i?i.posAtStart:n.from,r=i?i.posAtEnd:n.to;return r<t.state.doc.length&&r==n.to&&r++,Y.range(s,r)}}Mn.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft},Wn.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),27==e.keyCode&&(t.inputState.lastEscPress=Date.now()),!1),Mn.touchstart=(t,e)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")},Mn.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")},Wn.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of t.state.facet(Wi))if(i=n(t,e),i)break;if(i||0!=e.button||(i=function(t,e){let i=In(t,e),n=Nn(e),s=t.state.selection;return{update(t){t.docChanged&&(i.pos=t.changes.mapPos(i.pos),s=s.map(t.changes))},get(e,r,o){let a,l=In(t,e),h=En(t,l.pos,l.bias,n);if(i.pos!=l.pos&&!r){let e=En(t,i.pos,i.bias,n),s=Math.min(e.from,h.from),r=Math.max(e.to,h.to);h=s<h.from?Y.range(s,r):Y.range(r,s)}return r?s.replaceRange(s.main.extend(h.from,h.to)):o&&1==n&&s.ranges.length>1&&(a=function(t,e){for(let i=0;i<t.ranges.length;i++){let{from:n,to:s}=t.ranges[i];if(n<=e&&s>=e)return Y.create(t.ranges.slice(0,i).concat(t.ranges.slice(i+1)),t.mainIndex==i?0:t.mainIndex-(t.mainIndex>i?1:0))}return null}(s,l.pos))?a:o?s.addRange(h):Y.create([h])}}}(t,e)),i){let n=!t.hasFocus;t.inputState.startMouseSelection(new Yn(t,e,i,n)),n&&t.observer.ignore((()=>we(t.contentDOM)));let s=t.inputState.mouseSelection;if(s)return s.start(e),!1===s.dragging}return!1};let qn=(t,e)=>t>=e.top&&t<=e.bottom,_n=(t,e,i)=>qn(e,i)&&t>=i.left&&t<=i.right;function Vn(t,e,i,n){let s=ti.find(t.docView,e);if(!s)return 1;let r=e-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&_n(i,n,o))return-1;let a=s.coordsAt(r,1);return a&&_n(i,n,a)?1:o&&qn(n,o)?-1:1}function In(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:i,bias:Vn(t,i,e.clientX,e.clientY)}}const zn=_e.ie&&_e.ie_version<=11;let Bn=null,Gn=0,Ln=0;function Nn(t){if(!zn)return t.detail;let e=Bn,i=Ln;return Bn=t,Ln=Date.now(),Gn=!e||i>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(Gn+1)%3:1}function Un(t,e,i,n){if(!i)return;let s=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:r}=t.inputState,o=n&&r&&function(t,e){let i=t.state.facet(Yi);return i.length?i[0](e):_e.mac?!e.altKey:!e.ctrlKey}(t,e)?{from:r.from,to:r.to}:null,a={from:s,insert:i},l=t.state.changes(o?[o,a]:a);t.focus(),t.dispatch({changes:l,selection:{anchor:l.mapPos(s,-1),head:l.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),t.inputState.draggedContent=null}Wn.dragstart=(t,e)=>{let{selection:{main:i}}=t.state;if(e.target.draggable){let n=t.docView.nearest(e.target);if(n&&n.isWidget){let t=n.posAtStart,e=t+n.length;(t>=i.to||e<=i.from)&&(i=Y.range(t,e))}}let{inputState:n}=t;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=i,e.dataTransfer&&(e.dataTransfer.setData("Text",t.state.sliceDoc(i.from,i.to)),e.dataTransfer.effectAllowed="copyMove"),!1},Wn.dragend=t=>(t.inputState.draggedContent=null,!1),Wn.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let i=e.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&Un(t,e,n.filter((t=>null!=t)).join(t.state.lineBreak),!1)};for(let t=0;t<i.length;t++){let e=new FileReader;e.onerror=r,e.onload=()=>{/[\x00-\x08\x0e-\x1f]{2}/.test(e.result)||(n[t]=e.result),r()},e.readAsText(i[t])}return!0}{let i=e.dataTransfer.getData("Text");if(i)return Un(t,e,i,!0),!0}return!1},Wn.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let i=jn?null:e.clipboardData;return i?(Dn(t,i.getData("text/plain")||i.getData("text/uri-text")),!0):(function(t){let e=t.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{t.focus(),i.remove(),Dn(t,i.value)}),50)}(t),!1)};let Hn=null;Wn.copy=Wn.cut=(t,e)=>{let{text:i,ranges:n,linewise:s}=function(t){let e=[],i=[],n=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),i.push(n));if(!e.length){let s=-1;for(let{from:n}of t.selection.ranges){let r=t.doc.lineAt(n);r.number>s&&(e.push(r.text),i.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),s=r.number}n=!0}return{text:e.join(t.lineBreak),ranges:i,linewise:n}}(t.state);if(!i&&!s)return!1;Hn=s?i:null,"cut"!=e.type||t.state.readOnly||t.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=jn?null:e.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(t,e){let i=t.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout((()=>{n.remove(),t.focus()}),50)}(t,i),!1)};const Fn=ct.define();function Jn(t,e){let i=[];for(let n of t.facet(Ei)){let s=n(t,e);s&&i.push(s)}return i?t.update({effects:i,annotations:Fn.of(!0)}):null}function Kn(t){setTimeout((()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let i=Jn(t.state,e);i?t.dispatch(i):t.update([])}}),10)}Mn.focus=t=>{t.inputState.lastFocusTime=Date.now(),t.scrollDOM.scrollTop||!t.inputState.lastScrollTop&&!t.inputState.lastScrollLeft||(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),Kn(t)},Mn.blur=t=>{t.observer.clearSelectionRange(),Kn(t)},Mn.compositionstart=Mn.compositionupdate=t=>{null==t.inputState.compositionFirstChange&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0)},Mn.compositionend=t=>{t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,_e.chrome&&_e.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then((()=>t.observer.flush())):setTimeout((()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])}),50)},Mn.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()},Wn.beforeinput=(t,e)=>{var i;let n;if(_e.chrome&&_e.android&&(n=Tn.find((t=>t.inputType==e.inputType)))&&(t.observer.delayAndroidKey(n.key,n.keyCode),"Backspace"==n.key||"Delete"==n.key)){let e=(null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>e+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())}),100)}return!1};const ts=new Set;const es=["pre-wrap","normal","pre-line","break-spaces"];class is{constructor(t){this.lineWrapping=t,this.doc=e.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){if(!this.lineWrapping)return this.lineHeight;return(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return es.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i<t.length;i++){let n=t[i];n<0?i++:this.heightSamples[Math.floor(10*n)]||(e=!0,this.heightSamples[Math.floor(10*n)]=!0)}return e}refresh(t,e,i,n,s,r){let o=es.indexOf(t)>-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=s,a){this.heightSamples={};for(let t=0;t<r.length;t++){let e=r[t];e<0?t++:this.heightSamples[Math.floor(10*e)]=!0}}return a}}class ns{constructor(t,e){this.from=t,this.heights=e,this.index=0}get more(){return this.index<this.heights.length}}class ss{constructor(t,e,i,n,s){this.from=t,this.length=e,this.top=i,this.height=n,this._content=s}get type(){return"number"==typeof this._content?ni.Text:Array.isArray(this._content)?this._content:this._content.type}get to(){return this.from+this.length}get bottom(){return this.top+this.height}get widget(){return this._content instanceof ai?this._content.widget:null}get widgetLineBreaks(){return"number"==typeof this._content?this._content:0}join(t){let e=(Array.isArray(this._content)?this._content:[this]).concat(Array.isArray(t._content)?t._content:[t]);return new ss(this.from,this.length+t.length,this.top,this.height+t.height,e)}}var rs=function(t){return t[t.ByPos=0]="ByPos",t[t.ByHeight=1]="ByHeight",t[t.ByPosNoHeight=2]="ByPosNoHeight",t}(rs||(rs={}));const os=.001;class as{constructor(t,e,i=2){this.length=t,this.height=e,this.flags=i}get outdated(){return(2&this.flags)>0}set outdated(t){this.flags=(t?2:0)|-3&this.flags}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>os&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return as.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:a,toA:l,fromB:h,toB:c}=n[o],f=s.lineAt(a,rs.ByPosNoHeight,i.setDoc(e),0,0),u=f.to>=l?f:s.lineAt(l,rs.ByPosNoHeight,i,0,0);for(c+=u.to-l,l=u.to;o>0&&f.from<=n[o-1].toA;)a=n[o-1].fromA,h=n[o-1].fromB,o--,a<f.from&&(f=s.lineAt(a,rs.ByPosNoHeight,i,0,0));h+=f.from-a,a=f.from;let d=ds.build(i.setDoc(r),t,h,c);s=s.replace(a,l,d)}return s.updateHeight(i,0)}static empty(){return new hs(0,0)}static of(t){if(1==t.length)return t[0];let e=0,i=t.length,n=0,s=0;for(;;)if(e==i)if(n>2*s){let s=t[e-1];s.break?t.splice(--e,1,s.left,null,s.right):t.splice(--e,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let e=t[i];e.break?t.splice(i,1,e.left,null,e.right):t.splice(i,1,e.left,e.right),i+=2+e.break,s-=e.size}}else if(n<s){let i=t[e++];i&&(n+=i.size)}else{let e=t[--i];e&&(s+=e.size)}let r=0;return null==t[e-1]?(r=1,e--):null==t[e]&&(r=1,i++),new fs(as.of(t.slice(0,e)),r,as.of(t.slice(i)))}}as.prototype.size=1;class ls extends as{constructor(t,e,i){super(t,e),this.deco=i}blockAt(t,e,i,n){return new ss(n,this.length,i,this.height,this.deco||0)}lineAt(t,e,i,n,s){return this.blockAt(0,i,n,s)}forEachLine(t,e,i,n,s,r){t<=s+this.length&&e>=s&&r(this.blockAt(0,i,n,s))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(t,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class hs extends ls{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new ss(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return 1==i.length&&(n instanceof hs||n instanceof cs&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof cs?n=new hs(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):as.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(t,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class cs extends as{constructor(t){super(t,0)}heightMetrics(t,e){let i,n=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-n+1,o=0;if(t.lineWrapping){let e=Math.min(this.height,t.lineHeight*r);i=e/r,this.length>r+1&&(o=(this.height-e)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(t,e,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let s=n+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),r=e.doc.lineAt(s),l=o+r.length*a,h=Math.max(i,t-l/2);return new ss(r.from,r.length,h,l,0)}{let n=Math.max(0,Math.min(r-s,Math.floor((t-i)/o))),{from:a,length:l}=e.doc.line(s+n);return new ss(a,l,i+o*n,o,0)}}lineAt(t,e,i,n,s){if(e==rs.ByHeight)return this.blockAt(t,i,n,s);if(e==rs.ByPosNoHeight){let{from:e,to:n}=i.doc.lineAt(t);return new ss(e,n-e,0,0,0)}let{firstLine:r,perLine:o,perChar:a}=this.heightMetrics(i,s),l=i.doc.lineAt(t),h=o+l.length*a,c=l.number-r,f=n+o*c+a*(l.from-s-c);return new ss(l.from,l.length,Math.max(n,Math.min(f,n+this.height-h)),h,0)}forEachLine(t,e,i,n,s,r){t=Math.max(t,s),e=Math.min(e,s+this.length);let{firstLine:o,perLine:a,perChar:l}=this.heightMetrics(i,s);for(let h=t,c=n;h<=e;){let e=i.doc.lineAt(h);if(h==t){let i=e.number-o;c+=a*i+l*(t-s-i)}let n=a+l*e.length;r(new ss(e.from,e.length,c,n,0)),c+=n,h=e.to+1}}replace(t,e,i){let n=this.length-e;if(n>0){let t=i[i.length-1];t instanceof cs?i[i.length-1]=new cs(t.length+n):i.push(null,new cs(n-1))}if(t>0){let e=i[0];e instanceof cs?i[0]=new cs(t+e.length):i.unshift(new cs(t-1),null)}return as.of(i)}decomposeLeft(t,e){e.push(new cs(t-1),null)}decomposeRight(t,e){e.push(null,new cs(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let s=e+this.length;if(n&&n.from<=e+this.length&&n.more){let i=[],r=Math.max(e,n.from),o=-1;for(n.from>e&&i.push(new cs(n.from-e-1).updateHeight(t,e));r<=s&&n.more;){let e=t.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=os&&(o=-2);let a=new hs(e,s);a.outdated=!1,i.push(a),r+=e+1}r<=s&&i.push(null,new cs(s-r).updateHeight(t,r));let a=as.of(i);return(o<0||Math.abs(a.height-this.height)>=os||Math.abs(o-this.heightMetrics(t,e).perLine)>=os)&&(t.heightChanged=!0),a}return(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class fs extends as{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return 1&this.flags}blockAt(t,e,i,n){let s=i+this.left.height;return t<s?this.left.blockAt(t,e,i,n):this.right.blockAt(t,e,s,n+this.left.length+this.break)}lineAt(t,e,i,n,s){let r=n+this.left.height,o=s+this.left.length+this.break,a=e==rs.ByHeight?t<r:t<o,l=a?this.left.lineAt(t,e,i,n,s):this.right.lineAt(t,e,i,r,o);if(this.break||(a?l.to<o:l.from>o))return l;let h=e==rs.ByPosNoHeight?rs.ByPosNoHeight:rs.ByPos;return a?l.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(l)}forEachLine(t,e,i,n,s,r){let o=n+this.left.height,a=s+this.left.length+this.break;if(this.break)t<a&&this.left.forEachLine(t,e,i,n,s,r),e>=a&&this.right.forEachLine(t,e,i,o,a,r);else{let l=this.lineAt(a,rs.ByPos,i,n,s);t<l.from&&this.left.forEachLine(t,l.from-1,i,n,s,r),l.to>=t&&l.from<=e&&r(l),e>l.to&&this.right.forEachLine(l.to+1,e,i,o,a,r)}}replace(t,e,i){let n=this.left.length+this.break;if(e<n)return this.balanced(this.left.replace(t,e,i),this.right);if(t>this.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let s=[];t>0&&this.decomposeLeft(t,s);let r=s.length;for(let t of i)s.push(t);if(t>0&&us(s,r-1),e<this.length){let t=s.length;this.decomposeRight(e,s),us(s,t)}return as.of(s)}decomposeLeft(t,e){let i=this.left.length;if(t<=i)return this.left.decomposeLeft(t,e);e.push(this.left),this.break&&(i++,t>=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t<i&&this.left.decomposeRight(t,e),this.break&&t<n&&e.push(null),e.push(this.right)}balanced(t,e){return t.size>2*e.size||e.size>2*t.size?as.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:s,right:r}=this,o=e+s.length+this.break,a=null;return n&&n.from<=e+s.length&&n.more?a=s=s.updateHeight(t,e,i,n):s.updateHeight(t,e,i),n&&n.from<=o+r.length&&n.more?a=r=r.updateHeight(t,o,i,n):r.updateHeight(t,o,i),a?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function us(t,e){let i,n;null==t[e]&&(i=t[e-1])instanceof cs&&(n=t[e+1])instanceof cs&&t.splice(e-1,3,new cs(i.length+1+n.length))}class ds{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let t=Math.min(e,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof hs?i.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new hs(t-this.pos,-1)),this.writtenTo=t,e>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t<e||i.heightRelevant){let n=i.widget?i.widget.estimatedHeight:0,s=i.widget?i.widget.lineBreaks:0;n<0&&(n=this.oracle.lineHeight);let r=e-t;i.block?this.addBlock(new ls(r,n,i)):(r||s||n>=5)&&this.addLineDeco(n,s,r)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd<this.pos&&(this.lineEnd=this.oracle.doc.lineAt(this.pos).to)}enterLine(){if(this.lineStart>-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTo<t&&((this.writtenTo<t-1||null==this.nodes[this.nodes.length-1])&&this.nodes.push(this.blankContent(this.writtenTo,t-1)),this.nodes.push(null)),this.pos>t&&this.nodes.push(new hs(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new cs(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof hs)return t;let e=new hs(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||e instanceof hs||this.isCovered?(this.writtenTo<this.pos||null==e)&&this.nodes.push(this.blankContent(this.writtenTo,this.pos)):this.nodes.push(new hs(0,-1));let i=t;for(let t of this.nodes)t instanceof hs&&t.updateHeight(this.oracle,i),i+=t?t.length:1;return this.nodes}static build(t,e,i,n){let s=new ds(i,t);return At.spans(e,i,n,s,0),s.finish(i)}}class ps{constructor(){this.changes=[]}compareRange(){}comparePoint(t,e,i,n){(t<e||i&&i.heightRelevant||n&&n.heightRelevant)&&hi(t,e,this.changes,5)}}function Os(t,e){let i=t.getBoundingClientRect(),n=t.ownerDocument,s=n.defaultView||window,r=Math.max(0,i.left),o=Math.min(s.innerWidth,i.right),a=Math.max(0,i.top),l=Math.min(s.innerHeight,i.bottom);for(let e=t.parentNode;e&&e!=n.body;)if(1==e.nodeType){let i=e,n=window.getComputedStyle(i);if((i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),a=Math.max(a,n.top),l=e==t.parentNode?n.bottom:Math.min(l,n.bottom)}e="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=e.nodeType)break;e=e.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:a-(i.top+e),bottom:Math.max(a,l)-(i.top+e)}}function gs(t,e){let i=t.getBoundingClientRect();return{left:0,right:i.right-i.left,top:e,bottom:i.bottom-(i.top+e)}}class ms{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let n=t[i],s=e[i];if(n.from!=s.from||n.to!=s.to||n.size!=s.size)return!1}return!0}draw(t,e){return si.replace({widget:new ws(this.size*(e?t.scaleY:t.scaleX),e)}).range(this.from,this.to)}}class ws extends ii{constructor(t,e){super(),this.size=t,this.vertical=e}eq(t){return t.size==this.size&&t.vertical==this.vertical}toDOM(){let t=document.createElement("div");return this.vertical?t.style.height=this.size+"px":(t.style.width=this.size+"px",t.style.height="2px",t.style.display="inline-block"),t}get estimatedHeight(){return this.vertical?this.size:-1}}class vs{constructor(t){this.state=t,this.pixelViewport={left:0,right:window.innerWidth,top:0,bottom:0},this.inView=!0,this.paddingTop=0,this.paddingBottom=0,this.contentDOMWidth=0,this.contentDOMHeight=0,this.editorHeight=0,this.editorWidth=0,this.scrollTop=0,this.scrolledToBottom=!0,this.scaleX=1,this.scaleY=1,this.scrollAnchorPos=0,this.scrollAnchorHeight=-1,this.scaler=ks,this.scrollTarget=null,this.printing=!1,this.mustMeasureContent=!0,this.defaultTextDirection=di.LTR,this.visibleRanges=[],this.mustEnforceCursorAssoc=!1;let i=t.facet(Fi).some((t=>"function"!=typeof t&&"cm-lineWrapping"==t.class));this.heightOracle=new is(i),this.stateDeco=t.facet(Ji).filter((t=>"function"!=typeof t)),this.heightMap=as.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle.setDoc(t.doc),[new an(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=si.set(this.lineGaps.map((t=>t.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some((({from:t,to:e})=>n>=t&&n<=e))){let{from:e,to:i}=this.lineBlockAt(n);t.push(new bs(e,i))}}this.viewports=t.sort(((t,e)=>t.from-e.from)),this.scaler=this.heightMap.height<=7e6?ks:new Qs(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(t=>{this.viewportLines.push(1==this.scaler.scale?t:$s(t,this.scaler))}))}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Ji).filter((t=>"function"!=typeof t));let n=t.changedRanges,s=an.extendWithRanges(n,function(t,e,i){let n=new ps;return At.compare(t,e,i,n,0),n.changes}(i,this.stateDeco,t?t.changes:$.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),s),this.heightMap.height!=r&&(t.flags|=2),o?(this.scrollAnchorPos=t.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=s.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.head<a.from||e.range.head>a.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let l=!t.changes.empty||2&t.flags||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),l&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(_i)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let i=t.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?di.RTL:di.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),a=i.getBoundingClientRect(),l=o||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let h=0,c=0;if(a.width&&a.height){let{scaleX:t,scaleY:e}=pe(i,a);this.scaleX==t&&this.scaleY==e||(this.scaleX=t,this.scaleY=e,h|=8,o=l=!0)}let f=(parseInt(n.paddingTop)||0)*this.scaleY,u=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==f&&this.paddingBottom==u||(this.paddingTop=f,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(l=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let d=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=Se(t.scrollDOM);let p=(this.printing?gs:Os)(i,this.paddingTop),O=p.top-this.pixelViewport.top,g=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let m=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(m!=this.inView&&(this.inView=m,m&&(l=!0)),!this.inView&&!this.scrollTarget)return 0;let w=a.width;if(this.contentDOMWidth==w&&this.editorHeight==t.scrollDOM.clientHeight||(this.contentDOMWidth=a.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),l){let i=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(w-this.contentDOMWidth)>s.charWidth){let{lineHeight:e,charWidth:n,textHeight:a}=t.docView.measureTextSize();o=e>0&&s.refresh(r,e,n,a,w/n,i),o&&(t.docView.minWidth=0,h|=8)}O>0&&g>0?c=Math.max(O,g):O<0&&g<0&&(c=Math.min(O,g)),s.heightChanged=!1;for(let n of this.viewports){let r=n.from==this.viewport.from?i:t.docView.measureVisibleLineHeights(n);this.heightMap=(o?as.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle,[new an(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new ns(n.from,r))}s.heightChanged&&(h|=2)}let v=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.head<this.viewport.from||this.scrollTarget.range.head>this.viewport.to);return v&&(this.viewport=this.getViewport(c,this.scrollTarget)),this.updateForViewport(),(2&h||v)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,a=new bs(n.lineAt(r-1e3*i,rs.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),rs.ByHeight,s,0,0).to);if(e){let{head:t}=e.range;if(t<a.from||t>a.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(t,rs.ByPos,s,0,0);i="center"==e.y?(o.top+o.bottom)/2-r/2:"start"==e.y||"nearest"==e.y&&t<a.from?o.top:o.bottom-r,a=new bs(n.lineAt(i-500,rs.ByHeight,s,0,0).from,n.lineAt(i+r+500,rs.ByHeight,s,0,0).to)}}return a}mapViewport(t,e){let i=e.mapPos(t.from,-1),n=e.mapPos(t.to,1);return new bs(this.heightMap.lineAt(i,rs.ByPos,this.heightOracle,0,0).from,this.heightMap.lineAt(n,rs.ByPos,this.heightOracle,0,0).to)}viewportIsAppropriate({from:t,to:e},i=0){if(!this.inView)return!0;let{top:n}=this.heightMap.lineAt(t,rs.ByPos,this.heightOracle,0,0),{bottom:s}=this.heightMap.lineAt(e,rs.ByPos,this.heightOracle,0,0),{visibleTop:r,visibleBottom:o}=this;return(0==t||n<=r-Math.max(10,Math.min(-i,250)))&&(e==this.state.doc.length||s>=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s<o+2e3}mapLineGaps(t,e){if(!t.length||e.empty)return t;let i=[];for(let n of t)e.touchesRange(n.from,n.to)||i.push(new ms(e.mapPos(n.from),e.mapPos(n.to),n.size));return i}ensureLineGaps(t,e){let i=this.heightOracle.lineWrapping,n=i?1e4:2e3,s=n>>1,r=n<<1;if(this.defaultTextDirection!=di.LTR&&!i)return[];let o=[],a=(n,r,l,h)=>{if(r-n<s)return;let c=this.state.selection.main,f=[c.from];c.empty||f.push(c.to);for(let t of f)if(t>n&&t<r)return a(n,t-10,l,h),void a(t+10,r,l,h);let u=function(t,e){for(let i of t)if(e(i))return i;return}(t,(t=>t.from>=l.from&&t.to<=l.to&&Math.abs(t.from-n)<s&&Math.abs(t.to-r)<s&&!f.some((e=>t.from<e&&t.to>e))));if(!u){if(r<l.to&&e&&i&&e.visibleRanges.some((t=>t.from<=r&&t.to>=r))){let t=e.moveToLineBoundary(Y.cursor(r),!1,!0).head;t>n&&(r=t)}u=new ms(n,r,this.gapSize(l,n,r,h))}o.push(u)};for(let t of this.viewportLines){if(t.length<r)continue;let e=ys(t.from,t.to,this.stateDeco);if(e.total<r)continue;let s,o,l=this.scrollTarget?this.scrollTarget.range.head:null;if(i){let i,r,a=n/this.heightOracle.lineLength*this.heightOracle.lineHeight;if(null!=l){let n=xs(e,l),s=((this.visibleBottom-this.visibleTop)/2+a)/t.height;i=n-s,r=n+s}else i=(this.visibleTop-t.top-a)/t.height,r=(this.visibleBottom-t.top+a)/t.height;s=Ss(e,i),o=Ss(e,r)}else{let t,i,r=e.total*this.heightOracle.charWidth,a=n*this.heightOracle.charWidth;if(null!=l){let n=xs(e,l),s=((this.pixelViewport.right-this.pixelViewport.left)/2+a)/r;t=n-s,i=n+s}else t=(this.pixelViewport.left-a)/r,i=(this.pixelViewport.right+a)/r;s=Ss(e,t),o=Ss(e,i)}s>t.from&&a(t.from,s,t,e),o<t.to&&a(o,t.to,t,e)}return o}gapSize(t,e,i,n){let s=xs(n,i)-xs(n,e);return this.heightOracle.lineWrapping?t.height*s:n.total*this.heightOracle.charWidth*s}updateLineGaps(t){ms.same(t,this.lineGaps)||(this.lineGaps=t,this.lineGapDeco=si.set(t.map((t=>t.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];At.spans(t,this.viewport.from,this.viewport.to,{span(t,i){e.push({from:t,to:i})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some(((t,i)=>t.from!=e[i].from||t.to!=e[i].to));return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find((e=>e.from<=t&&e.to>=t))||$s(this.heightMap.lineAt(t,rs.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return $s(this.heightMap.lineAt(this.scaler.fromDOM(t),rs.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return $s(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class bs{constructor(t,e){this.from=t,this.to=e}}function ys(t,e,i){let n=[],s=t,r=0;return At.spans(i,t,e,{span(){},point(t,e){t>s&&(n.push({from:s,to:t}),r+=t-s),s=e}},20),s<e&&(n.push({from:s,to:e}),r+=e-s),{total:r,ranges:n}}function Ss({total:t,ranges:e},i){if(i<=0)return e[0].from;if(i>=1)return e[e.length-1].to;let n=Math.floor(t*i);for(let t=0;;t++){let{from:i,to:s}=e[t],r=s-i;if(n<=r)return i+n;n-=r}}function xs(t,e){let i=0;for(let{from:n,to:s}of t.ranges){if(e<=s){i+=e-n;break}i+=s-n}return i/t.total}const ks={toDOM:t=>t,fromDOM:t=>t,scale:1};class Qs{constructor(t,e,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=e.lineAt(i,rs.ByPos,t,0,0).top,o=e.lineAt(s,rs.ByPos,t,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(e.height-n);for(let t of this.viewports)t.domTop=r+(t.top-s)*this.scale,r=t.domBottom=t.domTop+(t.bottom-t.top),s=t.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let s=e<this.viewports.length?this.viewports[e]:null;if(!s||t<s.top)return n+(t-i)*this.scale;if(t<=s.bottom)return s.domTop+(t-s.top);i=s.bottom,n=s.domBottom}}fromDOM(t){for(let e=0,i=0,n=0;;e++){let s=e<this.viewports.length?this.viewports[e]:null;if(!s||t<s.domTop)return i+(t-n)/this.scale;if(t<=s.domBottom)return s.top+(t-s.domTop);i=s.bottom,n=s.domBottom}}}function $s(t,e){if(1==e.scale)return t;let i=e.toDOM(t.top),n=e.toDOM(t.bottom);return new ss(t.from,t.length,i,n-i,Array.isArray(t._content)?t._content.map((t=>$s(t,e))):t._content)}const Ps=j.define({combine:t=>t.join(" ")}),Zs=j.define({combine:t=>t.indexOf(!0)>-1}),Cs=Ut.newName(),Ts=Ut.newName(),As=Ut.newName(),Rs={"&light":"."+Ts,"&dark":"."+As};function Xs(t,e,i){return new Ut(e,{finish:e=>/&/.test(e)?e.replace(/&\w*/,(e=>{if("&"==e)return t;if(!i||!i[e])throw new RangeError(`Unsupported selector: ${e}`);return i[e]})):t+" "+e})}const Ys=Xs("."+Cs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},Rs),Ws="";class Ms{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(Qt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=Ws}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let n=t;;){this.findPointBefore(i,n);let t=this.text.length;this.readNode(n);let s=n.nextSibling;if(s==e)break;let r=Qe.get(n),o=Qe.get(s);(r&&o?r.breakAfter:(r?r.breakAfter:Ds(n))||Ds(s)&&("BR"!=n.nodeName||n.cmIgnore)&&this.text.length>t)&&this.lineBreak(),n=s}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(e))&&(r=s.index,o=s[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let e of this.points)e.node==t&&e.pos>this.text.length&&(e.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=Qe.get(t),i=e&&e.overrideDOMText;if(null!=i){this.findPointInside(t,i.length);for(let t=i.iter();!t.next().done;)t.lineBreak?this.lineBreak():this.append(t.value)}else 3==t.nodeType?this.readTextNode(t):"BR"==t.nodeName?t.nextSibling&&this.lineBreak():1==t.nodeType&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(3==t.nodeType?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(js(t,i.node,i.offset)?e:0))}}function js(t,e,i){for(;;){if(!e||i<fe(e))return!1;if(e==t)return!0;i=he(e)+1,e=e.parentNode}}function Ds(t){return 1==t.nodeType&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}class Es{constructor(t,e){this.node=t,this.offset=e,this.pos=-1}}class qs{constructor(t,e,i,n){this.typeOver=n,this.bounds=null,this.text="";let{impreciseHead:s,impreciseAnchor:r}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let e=s||r?[]:function(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=t.observer.selectionRange;i&&(e.push(new Es(i,n)),s==i&&r==n||e.push(new Es(s,r)));return e}(t),i=new Ms(e,t.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(t,e){if(0==t.length)return null;let i=t[0].pos,n=2==t.length?t[1].pos:i;return i>-1&&n>-1?Y.single(i+e,n+e):null}(e,this.bounds.from)}else{let e=t.observer.selectionRange,i=s&&s.node==e.focusNode&&s.offset==e.focusOffset||!re(t.contentDOM,e.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(e.focusNode,e.focusOffset),n=r&&r.node==e.anchorNode&&r.offset==e.anchorOffset||!re(t.contentDOM,e.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(e.anchorNode,e.anchorOffset),o=t.viewport;if(_e.ios&&t.state.selection.main.empty&&i!=n&&(o.from>0||o.to<t.state.doc.length)){let e=o.from-Math.min(i,n),s=o.to-Math.max(i,n);0!=e&&1!=e||0!=s&&-1!=s||(i=0,n=t.state.doc.length)}this.newSel=Y.single(n,i)}}}function _s(t,i){let n,{newSel:s}=i,r=t.state.selection.main,o=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:a}=i.bounds,l=r.from,h=null;(8===o||_e.android&&i.text.length<a-s)&&(l=r.to,h="end");let c=function(t,e,i,n){let s=Math.min(t.length,e.length),r=0;for(;r<s&&t.charCodeAt(r)==e.charCodeAt(r);)r++;if(r==s&&t.length==e.length)return null;let o=t.length,a=e.length;for(;o>0&&a>0&&t.charCodeAt(o-1)==e.charCodeAt(a-1);)o--,a--;if("end"==n){i-=o+Math.max(0,r-Math.min(o,a))-r}if(o<r&&t.length<e.length){r-=i<=r&&i>=o?r-i:0,a=r+(a-o),o=r}else if(a<r){r-=i<=r&&i>=a?r-i:0,o=r+(o-a),a=r}return{from:r,toA:o,toB:a}}(t.state.doc.sliceString(s,a,Ws),i.text,l-s,h);c&&(_e.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==Ws+Ws&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:e.of(i.text.slice(c.from,c.toB).split(Ws))})}else s&&(!t.hasFocus&&t.state.facet(Bi)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,n.from).append(n.insert).append(t.state.doc.slice(n.to,r.to))}:(_e.mac||_e.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==t.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=Y.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}):_e.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&t.lineWrapping&&(s&&(s=Y.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}),n){if(_e.ios&&t.inputState.flushIOSKey())return!0;if(_e.android&&(n.from==r.from&&n.to==r.to&&1==n.insert.length&&2==n.insert.lines&&be(t.contentDOM,"Enter",13)||(n.from==r.from-1&&n.to==r.to&&0==n.insert.length||8==o&&n.insert.length<n.to-n.from&&n.to>r.head)&&be(t.contentDOM,"Backspace",8)||n.from==r.from&&n.to==r.to+1&&0==n.insert.length&&be(t.contentDOM,"Delete",46)))return!0;let e,i=n.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a=()=>e||(e=function(t,e,i){let n,s=t.state,r=s.selection.main;if(e.from>=r.from&&e.to<=r.to&&e.to-e.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let i=r.from<e.from?s.sliceDoc(r.from,e.from):"",o=r.to>e.to?s.sliceDoc(e.to,r.to):"";n=s.replaceSelection(t.state.toText(i+e.insert.sliceString(0,void 0,t.state.lineBreak)+o))}else{let o=s.changes(e),a=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&t.inputState.composing>=0&&e.to<=r.to&&e.to>=r.to-10){let l,h=t.state.sliceDoc(e.from,e.to),c=i&&fn(t,i.main.head);if(c){let t=e.insert.length-(e.to-e.from);l={from:c.from,to:c.to-t}}else l=t.state.doc.lineAt(r.head);let f=r.to-e.to,u=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:a||i.map(o)};let n=i.to-f,c=n-h.length;if(i.to-i.from!=u||t.state.sliceDoc(c,n)!=h||i.to>=l.from&&i.from<=l.to)return{range:i};let d=s.changes({from:c,to:n,insert:e.insert}),p=i.to-r.to;return{changes:d,range:a?Y.range(Math.max(0,a.anchor+p),Math.max(0,a.head+p)):i.map(d)}}))}else n={changes:o,selection:a&&s.selection.replaceRange(a)}}let o="input.type";(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,o+=".compose",t.inputState.compositionFirstChange&&(o+=".start",t.inputState.compositionFirstChange=!1));return s.update(n,{userEvent:o,scrollIntoView:!0})}(t,n,s));return t.state.facet(Di).some((e=>e(t,n.from,n.to,i,a)))||t.dispatch(a()),!0}if(s&&!s.main.eq(r)){let e=!1,i="select";return t.inputState.lastSelectionTime>Date.now()-50&&("select"==t.inputState.lastSelectionOrigin&&(e=!0),i=t.inputState.lastSelectionOrigin),t.dispatch({selection:s,scrollIntoView:e,userEvent:i}),!0}return!1}const Vs={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Is=_e.ie&&_e.ie_version<=11;class zs{constructor(t){this.view=t,this.active=!1,this.selectionRange=new Oe,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver((e=>{for(let t of e)this.queue.push(t);(_e.ie&&_e.ie_version<=11||_e.ios&&t.composing)&&e.some((t=>"childList"==t.type&&t.removedNodes.length||"characterData"==t.type&&t.oldValue.length>t.target.nodeValue.length))?this.flushSoon():this.flush()})),Is&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var t;(null===(t=this.view.docView)||void 0===t?void 0:t.lastUpdate)<Date.now()-75&&this.onResize()})),this.resizeScroll.observe(t.scrollDOM)),this.addWindowListeners(this.win=t.win),this.start(),"function"==typeof IntersectionObserver&&(this.intersection=new IntersectionObserver((t=>{this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some(((e,i)=>e!=t[i])))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(Bi)?i.root.activeElement!=this.dom:!oe(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(t)?e||(this.selectionChanged=!1):(_e.ie&&_e.ie_version<=11||_e.android&&_e.chrome)&&!i.state.selection.main.empty&&n.focusNode&&le(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=_e.safari&&11==t.root.nodeType&&function(t){let e=t.activeElement;for(;e&&e.shadowRoot;)e=e.shadowRoot.activeElement;return e}(this.dom.ownerDocument)==this.dom&&function(t){let e=null;function i(t){t.preventDefault(),t.stopImmediatePropagation(),e=t.getTargetRanges()[0]}if(t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),!e)return null;let n=e.startContainer,s=e.startOffset,r=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor);le(a.node,a.offset,r,o)&&([n,s,r,o]=[r,o,n,s]);return{anchorNode:n,anchorOffset:s,focusNode:r,focusOffset:o}}(this.view)||se(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=oe(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime<Date.now()-300&&function(t,e){let i=e.focusNode,n=e.focusOffset;if(!i||e.anchorNode!=i||e.anchorOffset!=n)return!1;for(n=Math.min(n,fe(i));;)if(n){if(1!=i.nodeType)return!1;let t=i.childNodes[n-1];"false"==t.contentEditable?n--:(i=t,n=fe(i))}else{if(i==t)return!0;n=he(i),i=i.parentNode}}(this.dom,e)?(this.view.inputState.lastFocusTime=0,t.docView.updateSelection(),!1):(this.selectionRange.setRange(e),i&&(this.selectionChanged=!0),!0)}setSelectionRange(t,e){this.selectionRange.set(t.node,t.offset,e.node,e.offset),this.selectionChanged=!1}clearSelectionRange(){this.selectionRange.set(null,0,null,0)}listenForScroll(){this.parentCheck=-1;let t=0,e=null;for(let i=this.dom;i;)if(1==i.nodeType)!e&&t<this.scrollTargets.length&&this.scrollTargets[t]==i?t++:e||(e=this.scrollTargets.slice(0,t)),e&&e.push(i),i=i.assignedSlot||i.parentNode;else{if(11!=i.nodeType)break;i=i.host}if(t<this.scrollTargets.length&&!e&&(e=this.scrollTargets.slice(0,t)),e){for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);for(let t of this.scrollTargets=e)t.addEventListener("scroll",this.onScroll)}}ignore(t){if(!this.active)return t();try{return this.stop(),t()}finally{this.start(),this.clear()}}start(){this.active||(this.observer.observe(this.dom,Vs),Is&&this.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.active=!0)}stop(){this.active&&(this.active=!1,this.observer.disconnect(),Is&&this.dom.removeEventListener("DOMCharacterDataModified",this.onCharData))}clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}delayAndroidKey(t,e){var i;if(!this.delayedAndroidKey){let t=()=>{let t=this.delayedAndroidKey;if(t){this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=t.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&t.force&&be(this.dom,t.key,t.keyCode)}};this.flushingAndroidKey=this.view.win.requestAnimationFrame(t)}this.delayedAndroidKey&&"Enter"!=t||(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange<Date.now()-50||!!(null===(i=this.delayedAndroidKey)||void 0===i?void 0:i.force)})}clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndroidKey),this.delayedAndroidKey=null,this.flushingAndroidKey=-1}flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.requestAnimationFrame((()=>{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let s of t){let t=this.readMutation(s);t&&(t.typeOver&&(n=!0),-1==e?({from:e,to:i}=t):(e=Math.min(t.from,e),i=Math.max(t.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&oe(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new qs(this.view,t,e,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=_s(this.view,e);return this.view.state==i&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty("attributes"==t.type),"attributes"==t.type&&(e.flags|=4),"childList"==t.type){let i=Bs(e,t.previousSibling||t.target.previousSibling,-1),n=Bs(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}return"characterData"==t.type?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),null===(t=this.intersection)||void 0===t||t.disconnect(),null===(e=this.gapIntersection)||void 0===e||e.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}}function Bs(t,e,i){for(;e;){let n=Qe.get(e);if(n&&n.parent==t)return n;let s=e.parentNode;e=s!=t.dom?s:i>0?e.nextSibling:e.previousSibling}return null}class Gs{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(t=>t.forEach((t=>e(t,this))))||(t=>this.update(t)),this.dispatch=this.dispatch.bind(this),this._root=t.root||function(t){for(;t;){if(t&&(9==t.nodeType||11==t.nodeType&&t.host))return t;t=t.assignedSlot||t.parentNode}return null}(t.parent)||document,this.viewState=new vs(t.state||Qt.create(t)),t.scrollTo&&t.scrollTo.is(Ii)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Li).map((t=>new Ui(t)));for(let t of this.plugins)t.update(this);this.observer=new zs(this),this.inputState=new Pn(this),this.inputState.ensureHandlers(this.plugins),this.docView=new hn(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=1==t.length&&t[0]instanceof pt?t:1==t.length&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e,i=!1,n=!1,s=this.state;for(let e of t){if(e.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=e.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,a=null;t.some((t=>t.annotation(Fn)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,a=Jn(s,r),a||(o=1));let l=this.observer.delayedAndroidKey,h=null;if(l?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(Qt.phrases)!=this.state.facet(Qt.phrases))return this.setState(s);e=ln.create(this,s,t),e.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let e of t){if(c&&(c=c.map(e.changes)),e.scrollIntoView){let{main:t}=e.state.selection;c=new Vi(t.empty?t:Y.cursor(t.head,t.head>t.anchor?-1:1))}for(let t of e.effects)t.is(Ii)&&(c=t.value.clip(this.state))}this.viewState.update(e,c),this.bidiCache=Us.update(this.bidiCache,e.changes),e.empty||(this.updatePlugins(e),this.inputState.update(e)),i=this.docView.update(e),this.state.facet(on)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(i,t.some((t=>t.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(e.startState.facet(Ps)!=e.state.facet(Ps)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!e.empty)for(let t of this.state.facet(ji))try{t(e)}catch(t){zi(this.state,t,"update listener")}(a||h)&&Promise.resolve().then((()=>{a&&this.state==a.startState&&this.dispatch(a),h&&!_s(this,h)&&l.force&&be(this.contentDOM,l.key,l.keyCode)}))}setState(t){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=t);this.updateState=2;let e=this.hasFocus;try{for(let t of this.plugins)t.destroy(this);this.viewState=new vs(t),this.plugins=t.facet(Li).map((t=>new Ui(t))),this.pluginMap.clear();for(let t of this.plugins)t.update(this);this.docView.destroy(),this.docView=new hn(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Li),i=t.state.facet(Li);if(e!=i){let n=[];for(let s of i){let i=e.indexOf(s);if(i<0)n.push(new Ui(s));else{let e=this.plugins[i];e.mustUpdate=t,n.push(e)}}for(let e of this.plugins)e.mustUpdate!=t&&e.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let e of this.plugins)e.mustUpdate=t;for(let t=0;t<this.plugins.length;t++)this.plugins[t].update(this);e!=i&&this.inputState.ensureHandlers(this.plugins)}measure(t=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let t=0;;t++){if(r<0)if(Se(i))s=-1,r=this.viewState.heightMap.height;else{let t=this.viewState.scrollAnchorAt(n);s=t.from,r=t.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(t>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let a=[];4&o||([this.measureRequests,a]=[a,this.measureRequests]);let l=a.map((t=>{try{return t.read(this)}catch(t){return zi(this.state,t),Ns}})),h=ln.create(this,this.state,[]),c=!1;h.flags|=o,e?e.flags|=o:e=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h));for(let t=0;t<a.length;t++)if(l[t]!=Ns)try{let e=a[t];e.write&&e.write(l[t],this)}catch(t){zi(this.state,t)}if(c&&this.docView.updateSelection(!0),!h.viewportChanged&&0==this.measureRequests.length){if(this.viewState.editorHeight){if(this.viewState.scrollTarget){this.docView.scrollIntoView(this.viewState.scrollTarget),this.viewState.scrollTarget=null,r=-1;continue}{let t=(s<0?this.viewState.heightMap.height:this.viewState.lineBlockAt(s).top)-r;if(t>1||t<-1){n+=t,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let t of this.state.facet(ji))t(e)}get themeClasses(){return Cs+" "+(this.state.facet(Zs)?As:Ts)+" "+this.state.facet(Ps)}updateAttrs(){let t=Hs(this,Hi,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(Bi)?"true":"false",class:"cm-content",style:`${_e.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Hs(this,Fi,e);let i=this.observer.ignore((()=>{let i=Je(this.contentDOM,this.contentAttrs,e),n=Je(this.dom,this.editorAttrs,t);return i||n}));return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let t of i.effects)if(t.is(Gs.announce)){e&&(this.announceDOM.textContent=""),e=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=t.value}}mountStyles(){this.styleModules=this.state.facet(on);let t=this.state.facet(Gs.cspNonce);Ut.mount(this.root,this.styleModules.concat(Ys).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),t){if(this.measureRequests.indexOf(t)>-1)return;if(null!=t.key)for(let e=0;e<this.measureRequests.length;e++)if(this.measureRequests[e].key===t.key)return void(this.measureRequests[e]=t);this.measureRequests.push(t)}}plugin(t){let e=this.pluginMap.get(t);return(void 0===e||e&&e.spec!=t)&&this.pluginMap.set(t,e=this.plugins.find((e=>e.spec==t))||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return $n(this,t,kn(this,t,e,i))}moveByGroup(t,e){return $n(this,t,kn(this,t,e,(e=>function(t,e,i){let n=t.state.charCategorizer(e),s=n(i);return t=>{let e=n(t);return s==yt.Space&&(s=e),s==e}}(this,t.head,e))))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),s=i[e?i.length-1:0];return Y.cursor(s.side(e,n)+t.from,s.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return function(t,e,i,n){let s=xn(t,e.head),r=n&&s.type==ni.Text&&(t.lineWrapping||s.widgetLineBreaks)?t.coordsAtPos(e.assoc<0&&e.head>s.from?e.head-1:e.head):null;if(r){let e=t.dom.getBoundingClientRect(),n=t.textDirectionAt(s.from),o=t.posAtCoords({x:i==(n==di.LTR)?e.right-1:e.left+1,y:(r.top+r.bottom)/2});if(null!=o)return Y.cursor(o,i?-1:1)}return Y.cursor(i?s.to:s.from,i?-1:1)}(this,t,e,i)}moveVertically(t,e,i){return $n(this,t,function(t,e,i,n){let s=e.head,r=i?1:-1;if(s==(i?t.state.doc.length:0))return Y.cursor(s,e.assoc);let o,a=e.goalColumn,l=t.contentDOM.getBoundingClientRect(),h=t.coordsAtPos(s,e.assoc||-1),c=t.documentTop;if(h)null==a&&(a=h.left-l.left),o=r<0?h.top:h.bottom;else{let e=t.viewState.lineBlockAt(s);null==a&&(a=Math.min(l.right-l.left,t.defaultCharacterWidth*(s-e.from))),o=(r<0?e.top:e.bottom)+c}let f=l.left+a,u=null!=n?n:t.viewState.heightOracle.textHeight>>1;for(let e=0;;e+=10){let i=o+(u+e)*r,n=yn(t,{x:f,y:i},!1,r);if(i<l.top||i>l.bottom||(r<0?n<s:n>s)){let e=t.docView.coordsForChar(n),s=!e||i<e.top?-1:1;return Y.cursor(n,s,void 0,a)}}}(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),yn(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),s=this.bidiSpans(n);return ue(i,s[xi.find(s,t-n.from,-1,e)].dir==di.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(qi)||t<this.viewport.from||t>this.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Ls)return Ci(t.length);let e,i=this.textDirectionAt(t.from);for(let n of this.bidiCache)if(n.from==t.from&&n.dir==i&&(n.fresh||ki(n.isolates,e=nn(this,t))))return n.order;e||(e=nn(this,t));let n=Zi(t.text,i,e);return this.bidiCache.push(new Us(t.from,t.to,i,e,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||_e.safari&&(null===(t=this.inputState)||void 0===t?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{we(this.contentDOM),this.docView.updateSelection()}))}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((9==t.nodeType?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Ii.of(new Vi("number"==typeof t?Y.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Ii.of(new Vi(Y.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return Ni.define((()=>({})),{eventHandlers:t})}static domEventObservers(t){return Ni.define((()=>({})),{eventObservers:t})}static theme(t,e){let i=Ut.newName(),n=[Ps.of(i),on.of(Xs(`.${i}`,t))];return e&&e.dark&&n.push(Zs.of(!0)),n}static baseTheme(t){return H.lowest(on.of(Xs("."+Cs,t,Rs)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&Qe.get(i)||Qe.get(t);return(null===(e=null==n?void 0:n.rootView)||void 0===e?void 0:e.view)||null}}Gs.styleModule=on,Gs.inputHandler=Di,Gs.focusChangeEffect=Ei,Gs.perLineTextDirection=qi,Gs.exceptionSink=Mi,Gs.updateListener=ji,Gs.editable=Bi,Gs.mouseSelectionStyle=Wi,Gs.dragMovesSelection=Yi,Gs.clickAddsSelectionRange=Xi,Gs.decorations=Ji,Gs.outerDecorations=Ki,Gs.atomicRanges=tn,Gs.bidiIsolatedRanges=en,Gs.scrollMargins=sn,Gs.darkTheme=Zs,Gs.cspNonce=j.define({combine:t=>t.length?t[0]:""}),Gs.contentAttributes=Fi,Gs.editorAttributes=Hi,Gs.lineWrapping=Gs.contentAttributes.of({class:"cm-lineWrapping"}),Gs.announce=dt.define();const Ls=4096,Ns={};class Us{constructor(t,e,i,n,s,r){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(t,e){if(e.empty&&!t.some((t=>t.fresh)))return t;let i=[],n=t.length?t[t.length-1].dir:di.LTR;for(let s=Math.max(0,t.length-10);s<t.length;s++){let r=t[s];r.dir!=n||e.touchesRange(r.from,r.to)||i.push(new Us(e.mapPos(r.from,1),e.mapPos(r.to,-1),r.dir,r.isolates,!1,r.order))}return i}}function Hs(t,e,i){for(let n=t.state.facet(e),s=n.length-1;s>=0;s--){let e=n[s],r="function"==typeof e?e(t):e;r&&Ue(r,i)}return i}const Fs=_e.mac?"mac":_e.windows?"win":_e.linux?"linux":"key";function Js(t,e,i){return e.altKey&&(t="Alt-"+t),e.ctrlKey&&(t="Ctrl-"+t),e.metaKey&&(t="Meta-"+t),!1!==i&&e.shiftKey&&(t="Shift-"+t),t}const Ks=H.default(Gs.domEventHandlers({keydown:(t,e)=>or(ir(e.state),t,e,"editor")})),tr=j.define({enables:Ks}),er=new WeakMap;function ir(t){let e=t.facet(tr),i=er.get(e);return i||er.set(e,i=function(t,e=Fs){let i=Object.create(null),n=Object.create(null),s=(t,e)=>{let i=n[t];if(null==i)n[t]=e;else if(i!=e)throw new Error("Key binding "+t+" is used both as a regular binding and as a multi-stroke prefix")},r=(t,n,r,o,a)=>{var l,h;let c=i[t]||(i[t]=Object.create(null)),f=n.split(/ (?!$)/).map((t=>function(t,e){const i=t.split(/-(?!$)/);let n,s,r,o,a=i[i.length-1];"Space"==a&&(a=" ");for(let t=0;t<i.length-1;++t){const a=i[t];if(/^(cmd|meta|m)$/i.test(a))o=!0;else if(/^a(lt)?$/i.test(a))n=!0;else if(/^(c|ctrl|control)$/i.test(a))s=!0;else if(/^s(hift)?$/i.test(a))r=!0;else{if(!/^mod$/i.test(a))throw new Error("Unrecognized modifier name: "+a);"mac"==e?o=!0:s=!0}}return n&&(a="Alt-"+a),s&&(a="Ctrl-"+a),o&&(a="Meta-"+a),r&&(a="Shift-"+a),a}(t,e)));for(let e=1;e<f.length;e++){let i=f.slice(0,e).join(" ");s(i,!0),c[i]||(c[i]={preventDefault:!0,stopPropagation:!1,run:[e=>{let n=sr={view:e,prefix:i,scope:t};return setTimeout((()=>{sr==n&&(sr=null)}),rr),!0}]})}let u=f.join(" ");s(u,!1);let d=c[u]||(c[u]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(l=c._any)||void 0===l?void 0:l.run)||void 0===h?void 0:h.slice())||[]});r&&d.run.push(r),o&&(d.preventDefault=!0),a&&(d.stopPropagation=!0)};for(let n of t){let t=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let e of t){let t=i[e]||(i[e]=Object.create(null));t._any||(t._any={preventDefault:!1,stopPropagation:!1,run:[]});for(let e in t)t[e].run.push(n.any)}let s=n[e]||n.key;if(s)for(let e of t)r(e,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(e,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(e.reduce(((t,e)=>t.concat(e)),[]))),i}function nr(t,e,i){return or(ir(t.state),e,t,i)}let sr=null;const rr=4e3;function or(t,e,i,n){let s=function(t){var e=!(te&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||ee&&t.shiftKey&&t.key&&1==t.key.length||"Unidentified"==t.key)&&t.key||(t.shiftKey?Kt:Jt)[t.keyCode]||t.key||"Unidentified";return"Esc"==e&&(e="Escape"),"Del"==e&&(e="Delete"),"Left"==e&&(e="ArrowLeft"),"Up"==e&&(e="ArrowUp"),"Right"==e&&(e="ArrowRight"),"Down"==e&&(e="ArrowDown"),e}(e),r=S(b(s,0))==s.length&&" "!=s,o="",a=!1,l=!1,h=!1;sr&&sr.view==i&&sr.scope==n&&(o=sr.prefix+" ",Rn.indexOf(e.keyCode)<0&&(l=!0,sr=null));let c,f,u=new Set,d=t=>{if(t){for(let n of t.run)if(!u.has(n)&&(u.add(n),n(i,e)))return t.stopPropagation&&(h=!0),!0;t.preventDefault&&(t.stopPropagation&&(h=!0),l=!0)}return!1},p=t[n];return p&&(d(p[o+Js(s,e,!r)])?a=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(_e.windows&&e.ctrlKey&&e.altKey)&&(c=Jt[e.keyCode])&&c!=s?(d(p[o+Js(c,e,!0)])||e.shiftKey&&(f=Kt[e.keyCode])!=s&&f!=c&&d(p[o+Js(f,e,!1)]))&&(a=!0):r&&e.shiftKey&&d(p[o+Js(s,e,!0)])&&(a=!0),!a&&d(p._any)&&(a=!0)),l&&(a=!0),a&&h&&e.stopPropagation(),a}class ar{constructor(t,e,i,n,s){this.className=t,this.left=e,this.top=i,this.width=n,this.height=s}draw(){let t=document.createElement("div");return t.className=this.className,this.adjust(t),t}update(t,e){return e.className==this.className&&(this.adjust(t),!0)}adjust(t){t.style.left=this.left+"px",t.style.top=this.top+"px",null!=this.width&&(t.style.width=this.width+"px"),t.style.height=this.height+"px"}eq(t){return this.left==t.left&&this.top==t.top&&this.width==t.width&&this.height==t.height&&this.className==t.className}static forRange(t,e,i){if(i.empty){let n=t.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=lr(t);return[new ar(e,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(t,e,i){if(i.to<=t.viewport.from||i.from>=t.viewport.to)return[];let n=Math.max(i.from,t.viewport.from),s=Math.min(i.to,t.viewport.to),r=t.textDirection==di.LTR,o=t.contentDOM,a=o.getBoundingClientRect(),l=lr(t),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),f=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),u=a.right-(c?parseInt(c.paddingRight):0),d=xn(t,n),p=xn(t,s),O=d.type==ni.Text?d:null,g=p.type==ni.Text?p:null;O&&(t.lineWrapping||d.widgetLineBreaks)&&(O=hr(t,n,O));g&&(t.lineWrapping||p.widgetLineBreaks)&&(g=hr(t,s,g));if(O&&g&&O.from==g.from)return w(v(i.from,i.to,O));{let e=O?v(i.from,null,O):b(d,!1),n=g?v(null,i.to,g):b(p,!0),s=[];return(O||d).to<(g||p).from-(O&&g?1:0)||d.widgetLineBreaks>1&&e.bottom+t.defaultLineHeight/2<n.top?s.push(m(f,e.bottom,u,n.top)):e.bottom<n.top&&t.elementAtHeight((e.bottom+n.top)/2).type==ni.Text&&(e.bottom=n.top=(e.bottom+n.top)/2),w(e).concat(s).concat(w(n))}function m(t,i,n,s){return new ar(e,t-l.left,i-l.top-.01,n-t,s-i+.01)}function w({top:t,bottom:e,horizontal:i}){let n=[];for(let s=0;s<i.length;s+=2)n.push(m(i[s],t,i[s+1],e));return n}function v(e,i,n){let s=1e9,o=-1e9,a=[];function l(e,i,l,h,c){let d=t.coordsAtPos(e,e==n.to?-2:2),p=t.coordsAtPos(l,l==n.from?2:-2);d&&p&&(s=Math.min(d.top,p.top,s),o=Math.max(d.bottom,p.bottom,o),c==di.LTR?a.push(r&&i?f:d.left,r&&h?u:p.right):a.push(!r&&h?f:p.left,!r&&i?u:d.right))}let h=null!=e?e:n.from,c=null!=i?i:n.to;for(let n of t.visibleRanges)if(n.to>h&&n.from<c)for(let s=Math.max(n.from,h),r=Math.min(n.to,c);;){let n=t.state.doc.lineAt(s);for(let o of t.bidiSpans(n)){let t=o.from+n.from,a=o.to+n.from;if(t>=r)break;a>s&&l(Math.max(t,s),null==e&&t<=h,Math.min(a,r),null==i&&a>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==a.length&&l(h,null==e,c,null==i,t.textDirection),{top:s,bottom:o,horizontal:a}}function b(t,e){let i=a.top+(e?t.top:t.bottom);return{top:i,bottom:i,horizontal:[]}}}(t,e,i)}}function lr(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==di.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function hr(t,e,i){let n=Y.cursor(e);return{from:Math.max(i.from,t.moveToLineBoundary(n,!1,!0).from),to:Math.min(i.to,t.moveToLineBoundary(n,!0,!0).from),type:ni.Text}}class cr{constructor(t,e){this.view=t,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=t.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(t.state),t.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,t)}update(t){t.startState.facet(fr)!=t.state.facet(fr)&&this.setOrder(t.state),(this.layer.update(t,this.dom)||t.geometryChanged)&&(this.scale(),t.view.requestMeasure(this.measureReq))}setOrder(t){let e=0,i=t.facet(fr);for(;e<i.length&&i[e]!=this.layer;)e++;this.dom.style.zIndex=String((this.layer.above?150:-1)-e)}measure(){return this.layer.markers(this.view)}scale(){let{scaleX:t,scaleY:e}=this.view;t==this.scaleX&&e==this.scaleY||(this.scaleX=t,this.scaleY=e,this.dom.style.transform=`scale(${1/t}, ${1/e})`)}draw(t){if(t.length!=this.drawn.length||t.some(((t,e)=>{return i=t,n=this.drawn[e],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let e=this.dom.firstChild,i=0;for(let n of t)n.update&&e&&n.constructor&&this.drawn[i].constructor&&n.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(n.draw(),e);for(;e;){let t=e.nextSibling;e.remove(),e=t}this.drawn=t}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const fr=j.define();function ur(t){return[Ni.define((e=>new cr(e,t))),fr.of(t)]}const dr=!_e.ios,pr=j.define({combine:t=>$t(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(t,e)=>Math.min(t,e),drawRangeCursor:(t,e)=>t||e})});function Or(t={}){return[pr.of(t),mr,vr,yr,_i.of(!0)]}function gr(t){return t.startState.facet(pr)!=t.state.facet(pr)}const mr=ur({above:!0,markers(t){let{state:e}=t,i=e.facet(pr),n=[];for(let s of e.selection.ranges){let r=s==e.selection.main;if(s.empty?!r||dr:i.drawRangeCursor){let e=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:Y.cursor(s.head,s.head>s.anchor?-1:1);for(let s of ar.forRange(t,e,i))n.push(s)}}return n},update(t,e){t.transactions.some((t=>t.selection))&&(e.style.animationName="cm-blink"==e.style.animationName?"cm-blink2":"cm-blink");let i=gr(t);return i&&wr(t.state,e),t.docChanged||t.selectionSet||i},mount(t,e){wr(e.state,t)},class:"cm-cursorLayer"});function wr(t,e){e.style.animationDuration=t.facet(pr).cursorBlinkRate+"ms"}const vr=ur({above:!1,markers:t=>t.state.selection.ranges.map((e=>e.empty?[]:ar.forRange(t,"cm-selectionBackground",e))).reduce(((t,e)=>t.concat(e))),update:(t,e)=>t.docChanged||t.selectionSet||t.viewportChanged||gr(t),class:"cm-selectionLayer"}),br={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};dr&&(br[".cm-line"].caretColor="transparent !important",br[".cm-content"]={caretColor:"transparent !important"});const yr=H.highest(Gs.theme(br)),Sr=dt.define({map:(t,e)=>null==t?null:e.mapPos(t)}),xr=z.define({create:()=>null,update:(t,e)=>(null!=t&&(t=e.changes.mapPos(t)),e.effects.reduce(((t,e)=>e.is(Sr)?e.value:t),t))}),kr=Ni.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let i=t.state.field(xr);null==i?null!=this.cursor&&(null===(e=this.cursor)||void 0===e||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(xr)!=i||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(xr),i=null!=e&&t.coordsAtPos(e);if(!i)return null;let n=t.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+t.scrollDOM.scrollLeft*t.scaleX,top:i.top-n.top+t.scrollDOM.scrollTop*t.scaleY,height:i.bottom-i.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:i}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/i+"px",this.cursor.style.height=t.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(xr)!=t&&this.view.dispatch({effects:Sr.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){t.target!=this.view.contentDOM&&this.view.contentDOM.contains(t.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Qr(){return[xr,kr]}function $r(t,e,i,n,s){e.lastIndex=0;for(let r,o=t.iterRange(i,n),a=i;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)s(a+r.index,r)}class Pr{constructor(t){const{regexp:e,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=t;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,n)this.addMatch=(t,e,i,s)=>n(s,i,i+t[0].length,t,e);else if("function"==typeof i)this.addMatch=(t,e,n,s)=>{let r=i(t,e,n);r&&s(n,n+t[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(t,e,n,s)=>s(n,n+t[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(t){let e=new Rt,i=e.add.bind(e);for(let{from:e,to:n}of function(t,e){let i=t.visibleRanges;if(1==i.length&&i[0].from==t.viewport.from&&i[0].to==t.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(t.state.doc.lineAt(s).from,s-e),r=Math.min(t.state.doc.lineAt(r).to,r+e),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(t,this.maxLength))$r(t.state.doc,this.regexp,e,n,((e,n)=>this.addMatch(n,t,e,i)));return e.finish()}updateDeco(t,e){let i=1e9,n=-1;return t.docChanged&&t.changes.iterChanges(((e,s,r,o)=>{o>t.view.viewport.from&&r<t.view.viewport.to&&(i=Math.min(r,i),n=Math.max(o,n))})),t.viewportChanged||n-i>1e3?this.createDeco(t.view):n>-1?this.updateRange(t.view,e.map(t.changes),i,n):e}updateRange(t,e,i,n){for(let s of t.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=t.state.doc.lineAt(r),n=i.to<o?t.state.doc.lineAt(o):i,a=Math.max(s.from,i.from),l=Math.min(s.to,n.to);if(this.boundary){for(;r>i.from;r--)if(this.boundary.test(i.text[r-1-i.from])){a=r;break}for(;o<n.to;o++)if(this.boundary.test(n.text[o-n.from])){l=o;break}}let h,c=[],f=(t,e,i)=>c.push(i.range(t,e));if(i==n)for(this.regexp.lastIndex=a-i.from;(h=this.regexp.exec(i.text))&&h.index<l-i.from;)this.addMatch(h,t,h.index+i.from,f);else $r(t.state.doc,this.regexp,a,l,((e,i)=>this.addMatch(i,t,e,f)));e=e.update({filterFrom:a,filterTo:l,filter:(t,e)=>t<a||e>l,add:c})}}return e}}const Zr=null!=/x/.unicode?"gu":"g",Cr=new RegExp("[\0-\b\n--\u2028\u2029\ufeff-]",Zr),Tr={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let Ar=null;const Rr=j.define({combine(t){let e=$t(t,{render:null,specialChars:Cr,addSpecialChars:null});return(e.replaceTabs=!function(){var t;if(null==Ar&&"undefined"!=typeof document&&document.body){let e=document.body.style;Ar=null!=(null!==(t=e.tabSize)&&void 0!==t?t:e.MozTabSize)}return Ar||!1}())&&(e.specialChars=new RegExp("\t|"+e.specialChars.source,Zr)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Zr)),e}});function Xr(t={}){return[Rr.of(t),Yr||(Yr=Ni.fromClass(class{constructor(t){this.view=t,this.decorations=si.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Rr)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new Pr({regexp:t.specialChars,decoration:(e,i,n)=>{let{doc:s}=i.state,r=b(e[0],0);if(9==r){let t=s.lineAt(n),e=i.state.tabSize,r=It(t.text,e,n-t.from);return si.replace({widget:new Mr((e-r%e)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=si.replace({widget:new Wr(t,r)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Rr);t.startState.facet(Rr)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))]}let Yr=null;class Wr extends ii{constructor(t,e){super(),this.options=t,this.code=e}eq(t){return t.code==this.code}toDOM(t){let e=function(t){return t>=32?"•":10==t?"":String.fromCharCode(9216+t)}(this.code),i=t.state.phrase("Control character")+" "+(Tr[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,e);if(n)return n;let s=document.createElement("span");return s.textContent=e,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class Mr extends ii{constructor(t){super(),this.width=t}eq(t){return t.width==this.width}toDOM(){let t=document.createElement("span");return t.textContent="\t",t.className="cm-tab",t.style.width=this.width+"px",t}ignoreEvent(){return!1}}const jr=Ni.fromClass(class{constructor(){this.height=1e3,this.attrs={style:"padding-bottom: 1000px"}}update(t){let{view:e}=t,i=e.viewState.editorHeight*e.scaleY-e.defaultLineHeight-e.documentPadding.top-.5;i>=0&&i!=this.height&&(this.height=i,this.attrs={style:`padding-bottom: ${i}px`})}});function Dr(){return qr}const Er=si.line({class:"cm-activeLine"}),qr=Ni.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,i=[];for(let n of t.state.selection.ranges){let s=t.lineBlockAt(n.head);s.from>e&&(i.push(Er.range(s.from)),e=s.from)}return si.set(i)}},{decorations:t=>t.decorations});class _r extends ii{constructor(t){super(),this.content=t}toDOM(){let t=document.createElement("span");return t.className="cm-placeholder",t.style.pointerEvents="none",t.appendChild("string"==typeof this.content?document.createTextNode(this.content):this.content),"string"==typeof this.content?t.setAttribute("aria-label","placeholder "+this.content):t.setAttribute("aria-hidden","true"),t}coordsAt(t){let e=t.firstChild?ae(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),n=ue(e[0],"rtl"!=i.direction),s=parseInt(i.lineHeight);return n.bottom-n.top>1.5*s?{left:n.left,right:n.right,top:n.top,bottom:n.top+s}:n}ignoreEvent(){return!1}}const Vr=2e3;function Ir(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1),n=t.state.doc.lineAt(i),s=i-n.from,r=s>Vr?-1:s==n.length?function(t,e){let i=t.coordsAtPos(t.viewport.from);return i?Math.round(Math.abs((i.left-e)/t.defaultCharacterWidth)):-1}(t,e.clientX):It(n.text,t.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function zr(t,e){let i=Ir(t,e),n=t.state.selection;return i?{update(t){if(t.docChanged){let e=t.changes.mapPos(t.startState.doc.line(i.line).from),s=t.state.doc.lineAt(e);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(t.changes)}},get(e,s,r){let o=Ir(t,e);if(!o)return n;let a=function(t,e,i){let n=Math.min(e.line,i.line),s=Math.max(e.line,i.line),r=[];if(e.off>Vr||i.off>Vr||e.col<0||i.col<0){let o=Math.min(e.off,i.off),a=Math.max(e.off,i.off);for(let e=n;e<=s;e++){let i=t.doc.line(e);i.length<=a&&r.push(Y.range(i.from+o,i.to+a))}}else{let o=Math.min(e.col,i.col),a=Math.max(e.col,i.col);for(let e=n;e<=s;e++){let i=t.doc.line(e),n=zt(i.text,o,t.tabSize,!0);if(n<0)r.push(Y.cursor(i.to));else{let e=zt(i.text,a,t.tabSize);r.push(Y.range(i.from+n,i.from+e))}}}return r}(t.state,i,o);return a.length?r?Y.create(a.concat(n.ranges)):Y.create(a):n}}:null}function Br(t){let e=(null==t?void 0:t.eventFilter)||(t=>t.altKey&&0==t.button);return Gs.mouseSelectionStyle.of(((t,i)=>e(i)?zr(t,i):null))}const Gr={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},Lr={style:"cursor: crosshair"};function Nr(t={}){let[e,i]=Gr[t.key||"Alt"],n=Ni.fromClass(class{constructor(t){this.view=t,this.isDown=!1}set(t){this.isDown!=t&&(this.isDown=t,this.view.update([]))}},{eventObservers:{keydown(t){this.set(t.keyCode==e||i(t))},keyup(t){t.keyCode!=e&&i(t)||this.set(!1)},mousemove(t){this.set(i(t))}}});return[n,Gs.contentAttributes.of((t=>{var e;return(null===(e=t.plugin(n))||void 0===e?void 0:e.isDown)?Lr:null}))]}const Ur="-10000px";class Hr{constructor(t,e,i,n){this.facet=e,this.createTooltipView=i,this.removeTooltipView=n,this.input=t.state.facet(e),this.tooltips=this.input.filter((t=>t)),this.tooltipViews=this.tooltips.map(i)}update(t,e){var i;let n=t.state.facet(this.facet),s=n.filter((t=>t));if(n===this.input){for(let e of this.tooltipViews)e.update&&e.update(t);return!1}let r=[],o=e?[]:null;for(let i=0;i<s.length;i++){let n=s[i],a=-1;if(n){for(let t=0;t<this.tooltips.length;t++){let e=this.tooltips[t];e&&e.create==n.create&&(a=t)}if(a<0)r[i]=this.createTooltipView(n),o&&(o[i]=!!n.above);else{let n=r[i]=this.tooltipViews[a];o&&(o[i]=e[a]),n.update&&n.update(t)}}}for(let t of this.tooltipViews)r.indexOf(t)<0&&(this.removeTooltipView(t),null===(i=t.destroy)||void 0===i||i.call(t));return e&&(o.forEach(((t,i)=>e[i]=t)),e.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Fr(t){let{win:e}=t;return{top:0,left:0,bottom:e.innerHeight,right:e.innerWidth}}const Jr=j.define({combine:t=>{var e,i,n;return{position:_e.ios?"absolute":(null===(e=t.find((t=>t.position)))||void 0===e?void 0:e.position)||"fixed",parent:(null===(i=t.find((t=>t.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=t.find((t=>t.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Fr}}}),Kr=new WeakMap,to=Ni.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(Jr);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver="function"==typeof ResizeObserver?new ResizeObserver((()=>this.measureSoon())):null,this.manager=new Hr(t,no,(t=>this.createTooltip(t)),(t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()})),this.above=this.manager.tooltips.map((t=>!!t.above)),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let i=e||t.geometryChanged,n=t.state.facet(Jr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let t of this.manager.tooltipViews)t.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let t of this.manager.tooltipViews)this.container.appendChild(t.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(t){let e=t.create(this.view);if(e.dom.classList.add("cm-tooltip"),t.arrow&&!e.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let t=document.createElement("div");t.className="cm-tooltip-arrow",e.dom.appendChild(t)}return e.dom.style.position=this.position,e.dom.style.top=Ur,e.dom.style.left="0px",this.container.appendChild(e.dom),e.mount&&e.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(e.dom),e}destroy(){var t,e,i;this.view.win.removeEventListener("resize",this.measureSoon);for(let e of this.manager.tooltipViews)e.dom.remove(),null===(t=e.destroy)||void 0===t||t.call(e);this.parent&&this.container.remove(),null===(e=this.resizeObserver)||void 0===e||e.disconnect(),null===(i=this.intersectionObserver)||void 0===i||i.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=this.view.dom.getBoundingClientRect(),e=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:t}=this.manager.tooltipViews[0];if(_e.gecko)n=t.offsetParent!=this.container.ownerDocument.body;else if(t.style.top==Ur&&"0px"==t.style.left){let e=t.getBoundingClientRect();n=Math.abs(e.top+1e4)>1||Math.abs(e.left)>1}}if(n||"absolute"==this.position)if(this.parent){let t=this.parent.getBoundingClientRect();t.width&&t.height&&(e=t.width/this.parent.offsetWidth,i=t.height/this.parent.offsetHeight)}else({scaleX:e,scaleY:i}=this.view.viewState);return{editor:t,parent:this.parent?this.container.getBoundingClientRect():t,pos:this.manager.tooltips.map(((t,e)=>{let i=this.manager.tooltipViews[e];return i.getCoords?i.getCoords(t.pos):this.view.coordsAtPos(t.pos)})),size:this.manager.tooltipViews.map((({dom:t})=>t.getBoundingClientRect())),space:this.view.state.facet(Jr).tooltipSpace(this.view),scaleX:e,scaleY:i,makeAbsolute:n}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let t of this.manager.tooltipViews)t.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=t,o=[];for(let a=0;a<this.manager.tooltips.length;a++){let l=this.manager.tooltips[a],h=this.manager.tooltipViews[a],{dom:c}=h,f=t.pos[a],u=t.size[a];if(!f||f.bottom<=Math.max(i.top,n.top)||f.top>=Math.min(i.bottom,n.bottom)||f.right<Math.max(i.left,n.left)-.1||f.left>Math.min(i.right,n.right)+.1){c.style.top=Ur;continue}let d=l.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=d?7:0,O=u.right-u.left,g=null!==(e=Kr.get(h))&&void 0!==e?e:u.bottom-u.top,m=h.offset||io,w=this.view.textDirection==di.LTR,v=u.width>n.right-n.left?w?n.left:n.right-u.width:w?Math.min(f.left-(d?14:0)+m.x,n.right-O):Math.max(n.left,f.left-O+(d?14:0)-m.x),b=this.above[a];!l.strictSide&&(b?f.top-(u.bottom-u.top)-m.y<n.top:f.bottom+(u.bottom-u.top)+m.y>n.bottom)&&b==n.bottom-f.bottom>f.top-n.top&&(b=this.above[a]=!b);let y=(b?f.top-n.top:n.bottom-f.bottom)-p;if(y<g&&!1!==h.resize){if(y<this.view.defaultLineHeight){c.style.top=Ur;continue}Kr.set(h,g),c.style.height=(g=y)/r+"px"}else c.style.height&&(c.style.height="");let S=b?f.top-g-p-m.y:f.bottom+p+m.y,x=v+O;if(!0!==h.overlap)for(let t of o)t.left<x&&t.right>v&&t.top<S+g&&t.bottom>S&&(S=b?t.top-g-2-p:t.bottom+p+2);if("absolute"==this.position?(c.style.top=(S-t.parent.top)/r+"px",c.style.left=(v-t.parent.left)/s+"px"):(c.style.top=S/r+"px",c.style.left=v/s+"px"),d){let t=f.left+(w?m.x:-m.x)-(v+14-7);d.style.left=t/s+"px"}!0!==h.overlap&&o.push({left:v,top:S,right:x,bottom:S+g}),c.classList.toggle("cm-tooltip-above",b),c.classList.toggle("cm-tooltip-below",!b),h.positioned&&h.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=Ur}},{eventObservers:{scroll(){this.maybeMeasure()}}}),eo=Gs.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),io={x:0,y:0},no=j.define({enables:[to,eo]}),so=j.define();class ro{static create(t){return new ro(t)}constructor(t){this.view=t,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Hr(t,so,(t=>this.createHostedView(t)),(t=>t.dom.remove()))}createHostedView(t){let e=t.create(this.view);return e.dom.classList.add("cm-tooltip-section"),this.dom.appendChild(e.dom),this.mounted&&e.mount&&e.mount(this.view),e}mount(t){for(let e of this.manager.tooltipViews)e.mount&&e.mount(t);this.mounted=!0}positioned(t){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(t)}update(t){this.manager.update(t)}destroy(){var t;for(let e of this.manager.tooltipViews)null===(t=e.destroy)||void 0===t||t.call(e)}passProp(t){let e;for(let i of this.manager.tooltipViews){let n=i[t];if(void 0!==n)if(void 0===e)e=n;else if(e!==n)return}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const oo=no.compute([so],(t=>{let e=t.facet(so).filter((t=>t));return 0===e.length?null:{pos:Math.min(...e.map((t=>t.pos))),end:Math.max(...e.map((t=>{var e;return null!==(e=t.end)&&void 0!==e?e:t.pos}))),create:ro.create,above:e[0].above,arrow:e.some((t=>t.arrow))}}));class ao{constructor(t,e,i,n,s){this.view=t,this.source=e,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:t.dom,time:0},this.checkHover=this.checkHover.bind(this),t.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),t.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active)return;let t=Date.now()-this.lastMove.time;t<this.hoverTime?this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime-t):this.startHover()}startHover(){clearTimeout(this.restartTimeout);let{view:t,lastMove:e}=this,i=t.docView.nearest(e.target);if(!i)return;let n,s=1;if(i instanceof ze)n=i.posAtStart;else{if(n=t.posAtCoords(e),null==n)return;let i=t.coordsAtPos(n);if(!i||e.y<i.top||e.y>i.bottom||e.x<i.left-t.defaultCharacterWidth||e.x>i.right+t.defaultCharacterWidth)return;let r=t.bidiSpans(t.state.doc.lineAt(n)).find((t=>t.from<=n&&t.to>=n)),o=r&&r.dir==di.RTL?-1:1;s=e.x<i.left?-o:o}let r=this.source(t,n,s);if(null==r?void 0:r.then){let e=this.pending={pos:n};r.then((i=>{this.pending==e&&(this.pending=null,i&&t.dispatch({effects:this.setHover.of(i)}))}),(e=>zi(t.state,e,"hover tooltip")))}else r&&t.dispatch({effects:this.setHover.of(r)})}get tooltip(){let t=this.view.plugin(to),e=t?t.manager.tooltips.findIndex((t=>t.create==ro.create)):-1;return e>-1?t.manager.tooltipViews[e]:null}mousemove(t){var e;this.lastMove={x:t.clientX,y:t.clientY,target:t.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:i,tooltip:n}=this;if(i&&n&&!function(t,e){let i=t.getBoundingClientRect();return e.clientX>=i.left-lo&&e.clientX<=i.right+lo&&e.clientY>=i.top-lo&&e.clientY<=i.bottom+lo}(n.dom,t)||this.pending){let{pos:n}=i||this.pending,s=null!==(e=null==i?void 0:i.end)&&void 0!==e?e:n;(n==s?this.view.posAtCoords(this.lastMove)==n:function(t,e,i,n,s,r){let o=t.scrollDOM.getBoundingClientRect(),a=t.documentTop+t.documentPadding.top+t.contentHeight;if(o.left>n||o.right<n||o.top>s||Math.min(o.bottom,a)<s)return!1;let l=t.posAtCoords({x:n,y:s},!1);return l>=e&&l<=i}(this.view,n,s,t.clientX,t.clientY))||(this.view.dispatch({effects:this.setHover.of(null)}),this.pending=null)}}mouseleave(t){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e){let{tooltip:e}=this;e&&e.dom.contains(t.relatedTarget)?this.watchTooltipLeave(e.dom):this.view.dispatch({effects:this.setHover.of(null)})}}watchTooltipLeave(t){let e=i=>{t.removeEventListener("mouseleave",e),this.active&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of(null)})};t.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const lo=4;function ho(t,e={}){let i=dt.define(),n=z.define({create:()=>null,update(t,n){if(t&&(e.hideOnChange&&(n.docChanged||n.selection)||e.hideOn&&e.hideOn(n,t)))return null;if(t&&n.docChanged){let e=n.changes.mapPos(t.pos,-1,k.TrackDel);if(null==e)return null;let i=Object.assign(Object.create(null),t);i.pos=e,null!=t.end&&(i.end=n.changes.mapPos(t.end)),t=i}for(let e of n.effects)e.is(i)&&(t=e.value),e.is(fo)&&(t=null);return t},provide:t=>so.from(t)});return[n,Ni.define((s=>new ao(s,t,n,i,e.hoverTime||300))),oo]}function co(t,e){let i=t.plugin(to);if(!i)return null;let n=i.manager.tooltips.indexOf(e);return n<0?null:i.manager.tooltipViews[n]}const fo=dt.define(),uo=fo.of(null);const po=j.define({combine(t){let e,i;for(let n of t)e=e||n.topContainer,i=i||n.bottomContainer;return{topContainer:e,bottomContainer:i}}});function Oo(t,e){let i=t.plugin(go),n=i?i.specs.indexOf(e):-1;return n>-1?i.panels[n]:null}const go=Ni.fromClass(class{constructor(t){this.input=t.state.facet(vo),this.specs=this.input.filter((t=>t)),this.panels=this.specs.map((e=>e(t)));let e=t.state.facet(po);this.top=new mo(t,!0,e.topContainer),this.bottom=new mo(t,!1,e.bottomContainer),this.top.sync(this.panels.filter((t=>t.top))),this.bottom.sync(this.panels.filter((t=>!t.top)));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(t){let e=t.state.facet(po);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new mo(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new mo(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=t.state.facet(vo);if(i!=this.input){let e=i.filter((t=>t)),n=[],s=[],r=[],o=[];for(let i of e){let e,a=this.specs.indexOf(i);a<0?(e=i(t.view),o.push(e)):(e=this.panels[a],e.update&&e.update(t)),n.push(e),(e.top?s:r).push(e)}this.specs=e,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let t of o)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}else for(let e of this.panels)e.update&&e.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>Gs.scrollMargins.of((e=>{let i=e.plugin(t);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class mo{constructor(t,e,i){this.view=t,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(t){for(let e of this.panels)e.destroy&&t.indexOf(e)<0&&e.destroy();this.panels=t,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let t=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;t!=e.dom;)t=wo(t);t=t.nextSibling}else this.dom.insertBefore(e.dom,t);for(;t;)t=wo(t)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let t of this.classes.split(" "))t&&this.container.classList.remove(t);for(let t of(this.classes=this.view.themeClasses).split(" "))t&&this.container.classList.add(t)}}}function wo(t){let e=t.nextSibling;return t.remove(),e}const vo=j.define({enables:go});class bo extends Pt{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}}bo.prototype.elementClass="",bo.prototype.toDOM=void 0,bo.prototype.mapMode=k.TrackBefore,bo.prototype.startSide=bo.prototype.endSide=-1,bo.prototype.point=!0;const yo=j.define(),So={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>At.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},xo=j.define();function ko(t){return[$o(),xo.of(Object.assign(Object.assign({},So),t))]}const Qo=j.define({combine:t=>t.some((t=>t))});function $o(t){let e=[Po];return t&&!1===t.fixed&&e.push(Qo.of(!0)),e}const Po=Ni.fromClass(class{constructor(t){this.view=t,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(xo).map((e=>new Ao(t,e)));for(let t of this.gutters)this.dom.appendChild(t.dom);this.fixed=!t.state.facet(Qo),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(Qo)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=At.iter(this.view.state.facet(yo),this.view.viewport.from),n=[],s=this.gutters.map((t=>new To(t,this.view.viewport,-this.view.documentPadding.top)));for(let t of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(t.type)){let e=!0;for(let r of t.type)if(r.type==ni.Text&&e){Co(i,n,r.from);for(let t of s)t.line(this.view,r,n);e=!1}else if(r.widget)for(let t of s)t.widget(this.view,r)}else if(t.type==ni.Text){Co(i,n,t.from);for(let e of s)e.line(this.view,t,n)}else if(t.widget)for(let e of s)e.widget(this.view,t);for(let t of s)t.finish();t&&this.view.scrollDOM.insertBefore(this.dom,e)}updateGutters(t){let e=t.startState.facet(xo),i=t.state.facet(xo),n=t.docChanged||t.heightChanged||t.viewportChanged||!At.eq(t.startState.facet(yo),t.state.facet(yo),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let e of this.gutters)e.update(t)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=e.indexOf(n);i<0?s.push(new Ao(this.view,n)):(this.gutters[i].update(t),s.push(this.gutters[i]))}for(let t of this.gutters)t.dom.remove(),s.indexOf(t)<0&&t.destroy();for(let t of s)this.dom.appendChild(t.dom);this.gutters=s}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}},{provide:t=>Gs.scrollMargins.of((e=>{let i=e.plugin(t);return i&&0!=i.gutters.length&&i.fixed?e.textDirection==di.LTR?{left:i.dom.offsetWidth*e.scaleX}:{right:i.dom.offsetWidth*e.scaleX}:null}))});function Zo(t){return Array.isArray(t)?t:[t]}function Co(t,e,i){for(;t.value&&t.from<=i;)t.from==i&&e.push(t.value),t.next()}class To{constructor(t,e,i){this.gutter=t,this.height=i,this.i=0,this.cursor=At.iter(t.markers,e.from)}addElement(t,e,i){let{gutter:n}=this,s=(e.top-this.height)/t.scaleY,r=e.height/t.scaleY;if(this.i==n.elements.length){let e=new Ro(t,r,s,i);n.elements.push(e),n.dom.appendChild(e.dom)}else n.elements[this.i].update(t,r,s,i);this.height=e.bottom,this.i++}line(t,e,i){let n=[];Co(this.cursor,n,e.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(t,e,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(t,e,n)}widget(t,e){let i=this.gutter.config.widgetMarker(t,e.widget,e);i&&this.addElement(t,e,[i])}finish(){let t=this.gutter;for(;t.elements.length>this.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}}class Ao{constructor(t,e){this.view=t,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let t=r.getBoundingClientRect();s=(t.top+t.bottom)/2}else s=n.clientY;let o=t.lineBlockAtHeight(s-t.documentTop);e.domEventHandlers[i](t,o,n)&&n.preventDefault()}));this.markers=Zo(e.markers(t)),e.initialSpacer&&(this.spacer=new Ro(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Zo(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let e=this.config.updateSpacer(this.spacer.markers[0],t);e!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[e])}let i=t.view.viewport;return!At.eq(this.markers,e,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(t)}destroy(){for(let t of this.elements)t.destroy()}}class Ro{constructor(t,e,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,n)}update(t,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++)if(!t[i].compare(e[i]))return!1;return!0}(this.markers,n)||this.setMarkers(t,n)}setMarkers(t,e){let i="cm-gutterElement",n=this.dom.firstChild;for(let s=0,r=0;;){let o=r,a=s<e.length?e[s++]:null,l=!1;if(a){let t=a.elementClass;t&&(i+=" "+t);for(let t=r;t<this.markers.length;t++)if(this.markers[t].compare(a)){o=t,l=!0;break}}else o=this.markers.length;for(;r<o;){let t=this.markers[r++];if(t.toDOM){t.destroy(n);let e=n.nextSibling;n.remove(),n=e}}if(!a)break;a.toDOM&&(l?n=n.nextSibling:this.dom.insertBefore(a.toDOM(t),n)),l&&r++}this.dom.className=i,this.markers=e}destroy(){this.setMarkers(null,[])}}const Xo=j.define(),Yo=j.define({combine:t=>$t(t,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(t,e){let i=Object.assign({},t);for(let t in e){let n=i[t],s=e[t];i[t]=n?(t,e,i)=>n(t,e,i)||s(t,e,i):s}return i}})});class Wo extends bo{constructor(t){super(),this.number=t}eq(t){return this.number==t.number}toDOM(){return document.createTextNode(this.number)}}function Mo(t,e){return t.state.facet(Yo).formatNumber(e,t.state)}const jo=xo.compute([Yo],(t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:t=>t.state.facet(Xo),lineMarker:(t,e,i)=>i.some((t=>t.toDOM))?null:new Wo(Mo(t,t.state.doc.lineAt(e.from).number)),widgetMarker:()=>null,lineMarkerChange:t=>t.startState.facet(Yo)!=t.state.facet(Yo),initialSpacer:t=>new Wo(Mo(t,Eo(t.state.doc.lines))),updateSpacer(t,e){let i=Mo(e.view,Eo(e.view.state.doc.lines));return i==t.number?t:new Wo(i)},domEventHandlers:t.facet(Yo).domEventHandlers})));function Do(t={}){return[Yo.of(t),$o(),jo]}function Eo(t){let e=9;for(;e<t;)e=10*e+9;return e}const qo=new class extends bo{constructor(){super(...arguments),this.elementClass="cm-activeLineGutter"}},_o=yo.compute(["selection"],(t=>{let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head).from;s>i&&(i=s,e.push(qo.range(s)))}return At.of(e)}));function Vo(){return _o}const Io=new Map;function zo(t){return Ni.define((e=>({decorations:t.createDeco(e),update(e){this.decorations=t.updateDeco(e,this.decorations)}})),{decorations:t=>t.decorations})}const Bo=zo(new Pr({regexp:/\t| +/g,decoration:t=>function(t){let e=Io.get(t);return e||Io.set(t,e=si.mark({attributes:"\t"===t?{class:"cm-highlightTab"}:{class:"cm-highlightSpace","data-display":t.replace(/ /g,"·")}})),e}(t[0]),boundary:/\S/}));const Go=zo(new Pr({regexp:/\s+$/g,decoration:si.mark({class:"cm-trailingSpace"}),boundary:/\S/}));const Lo={HeightMap:as,HeightOracle:is,MeasuredHeights:ns,QueryType:rs,ChangedRange:an,computeOrder:Zi,moveVisually:Ai};var No=Object.freeze({__proto__:null,BidiSpan:xi,BlockInfo:ss,get BlockType(){return ni},Decoration:si,get Direction(){return di},EditorView:Gs,GutterMarker:bo,MatchDecorator:Pr,RectangleMarker:ar,ViewPlugin:Ni,ViewUpdate:ln,WidgetType:ii,__test:Lo,closeHoverTooltips:uo,crosshairCursor:Nr,drawSelection:Or,dropCursor:Qr,getDrawSelectionConfig:function(t){return t.facet(pr)},getPanel:Oo,getTooltip:co,gutter:ko,gutterLineClass:yo,gutters:$o,hasHoverTooltips:function(t){return t.facet(so).some((t=>t))},highlightActiveLine:Dr,highlightActiveLineGutter:Vo,highlightSpecialChars:Xr,highlightTrailingWhitespace:function(){return Go},highlightWhitespace:function(){return Bo},hoverTooltip:ho,keymap:tr,layer:ur,lineNumberMarkers:Xo,lineNumbers:Do,logException:zi,panels:function(t){return t?[po.of(t)]:[]},placeholder:function(t){return Ni.fromClass(class{constructor(e){this.view=e,this.placeholder=t?si.set([si.widget({widget:new _r(t),side:1}).range(0)]):si.none}get decorations(){return this.view.state.doc.length?si.none:this.placeholder}},{decorations:t=>t.decorations})},rectangularSelection:Br,repositionTooltips:function(t){let e=t.plugin(to);e&&e.maybeMeasure()},runScopeHandlers:nr,scrollPastEnd:function(){return[jr,Fi.of((t=>{var e;return(null===(e=t.plugin(jr))||void 0===e?void 0:e.attrs)||null}))]},showPanel:vo,showTooltip:no,tooltips:function(t={}){return Jr.of(t)}});const Uo=1024;let Ho=0;class Fo{constructor(t,e){this.from=t,this.to=e}}class Jo{constructor(t={}){this.id=Ho++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof t&&(t=ea.match(t)),e=>{let i=t(e);return void 0===i?null:[this,i]}}}Jo.closedBy=new Jo({deserialize:t=>t.split(" ")}),Jo.openedBy=new Jo({deserialize:t=>t.split(" ")}),Jo.group=new Jo({deserialize:t=>t.split(" ")}),Jo.isolate=new Jo({deserialize:t=>{if(t&&"rtl"!=t&&"ltr"!=t&&"auto"!=t)throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Jo.contextHash=new Jo({perNode:!0}),Jo.lookAhead=new Jo({perNode:!0}),Jo.mounted=new Jo({perNode:!0});class Ko{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Jo.mounted.id]}}const ta=Object.create(null);class ea{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):ta,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(null==t.name?8:0),n=new ea(t.name||"",e,t.id,i);if(t.props)for(let i of t.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[i[0].id]=i[1]}return n}prop(t){return this.props[t.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(t){if("string"==typeof t){if(this.name==t)return!0;let e=this.prop(Jo.group);return!!e&&e.indexOf(t)>-1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return t=>{for(let i=t.prop(Jo.group),n=-1;n<(i?i.length:0);n++){let s=e[n<0?t.name:i[n]];if(s)return s}}}}ea.none=new ea("",Object.create(null),0,8);class ia{constructor(t){this.types=t;for(let e=0;e<t.length;e++)if(t[e].id!=e)throw new RangeError("Node type ids should correspond to array positions when creating a node set")}extend(...t){let e=[];for(let i of this.types){let n=null;for(let e of t){let t=e(i);t&&(n||(n=Object.assign({},i.props)),n[t[0].id]=t[1])}e.push(n?new ea(i.name,n,i.id,i.flags):i)}return new ia(e)}}const na=new WeakMap,sa=new WeakMap;var ra;!function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"}(ra||(ra={}));class oa{constructor(t,e,i,n,s){if(this.type=t,this.children=e,this.positions=i,this.length=n,this.props=null,s&&s.length){this.props=Object.create(null);for(let[t,e]of s)this.props["number"==typeof t?t:t.id]=e}}toString(){let t=Ko.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let t of this.children){let i=t.toString();i&&(e&&(e+=","),e+=i)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new va(this.topNode,t)}cursorAt(t,e=0,i=0){let n=na.get(this)||this.topNode,s=new va(n);return s.moveTo(t,e),na.set(this,s._tree),s}get topNode(){return new ua(this,0,0,null)}resolve(t,e=0){let i=ca(na.get(this)||this.topNode,t,e,!1);return na.set(this,i),i}resolveInner(t,e=0){let i=ca(sa.get(this)||this.topNode,t,e,!0);return sa.set(this,i),i}resolveStack(t,e=0){return function(t,e,i){let n=t.resolveInner(e,i),s=null;for(let t=n instanceof ua?n:n.context.parent;t;t=t.parent)if(t.index<0){let r=t.parent;(s||(s=[n])).push(r.resolve(e,i)),t=r}else{let r=Ko.get(t.tree);if(r&&r.overlay&&r.overlay[0].from<=e&&r.overlay[r.overlay.length-1].to>=e){let o=new ua(r.tree,r.overlay[0].from+t.from,-1,t);(s||(s=[n])).push(ca(o,e,i,!1))}}return s?ma(s):n}(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:s=this.length}=t,r=t.mode||0,o=(r&ra.IncludeAnonymous)>0;for(let t=this.cursor(r|ra.IncludeAnonymous);;){let r=!1;if(t.from<=s&&t.to>=n&&(!o&&t.type.isAnonymous||!1!==e(t))){if(t.firstChild())continue;r=!0}for(;r&&i&&(o||!t.type.isAnonymous)&&i(t),!t.nextSibling();){if(!t.parent())return;r=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:xa(ea.none,this.children,this.positions,0,this.children.length,0,this.length,((t,e,i)=>new oa(this.type,t,e,i,this.propValues)),t.makeTree||((t,e,i)=>new oa(ea.none,t,e,i)))}static build(t){return function(t){var e;let{buffer:i,nodeSet:n,maxBufferLength:s=Uo,reused:r=[],minRepeatType:o=n.types.length}=t,a=Array.isArray(i)?new aa(i,i.length):i,l=n.types,h=0,c=0;function f(t,e,i,w,v,b){let{id:y,start:S,end:x,size:k}=a,Q=c;for(;k<0;){if(a.next(),-1==k){let e=r[y];return i.push(e),void w.push(S-t)}if(-3==k)return void(h=y);if(-4==k)return void(c=y);throw new RangeError(`Unrecognized record size: ${k}`)}let $,P,Z=l[y],C=S-t;if(x-S<=s&&(P=g(a.pos-e,v))){let e=new Uint16Array(P.size-P.skip),i=a.pos-P.size,s=e.length;for(;a.pos>i;)s=m(P.start,e,s);$=new la(e,x-P.start,n),C=P.start-t}else{let t=a.pos-k;a.next();let e=[],i=[],n=y>=o?y:-1,r=0,l=x;for(;a.pos>t;)n>=0&&a.id==n&&a.size>=0?(a.end<=l-s&&(p(e,i,S,r,a.end,l,n,Q),r=e.length,l=a.end),a.next()):b>2500?u(S,t,e,i):f(S,t,e,i,n,b+1);if(n>=0&&r>0&&r<e.length&&p(e,i,S,r,S,l,n,Q),e.reverse(),i.reverse(),n>-1&&r>0){let t=d(Z);$=xa(Z,e,i,0,e.length,0,x-S,t,t)}else $=O(Z,e,i,x-S,Q-x)}i.push($),w.push(C)}function u(t,e,i,r){let o=[],l=0,h=-1;for(;a.pos>e;){let{id:t,start:e,end:i,size:n}=a;if(n>4)a.next();else{if(h>-1&&e<h)break;h<0&&(h=i-s),o.push(t,e,i),l++,a.next()}}if(l){let e=new Uint16Array(4*l),s=o[o.length-2];for(let t=o.length-3,i=0;t>=0;t-=3)e[i++]=o[t],e[i++]=o[t+1]-s,e[i++]=o[t+2]-s,e[i++]=i;i.push(new la(e,o[2]-s,n)),r.push(s-t)}}function d(t){return(e,i,n)=>{let s,r,o=0,a=e.length-1;if(a>=0&&(s=e[a])instanceof oa){if(!a&&s.type==t&&s.length==n)return s;(r=s.prop(Jo.lookAhead))&&(o=i[a]+s.length+r)}return O(t,e,i,n,o)}}function p(t,e,i,s,r,o,a,l){let h=[],c=[];for(;t.length>s;)h.push(t.pop()),c.push(e.pop()+i-r);t.push(O(n.types[a],h,c,o-r,l-o)),e.push(r-i)}function O(t,e,i,n,s=0,r){if(h){let t=[Jo.contextHash,h];r=r?[t].concat(r):[t]}if(s>25){let t=[Jo.lookAhead,s];r=r?[t].concat(r):[t]}return new oa(t,e,i,n,r)}function g(t,e){let i=a.fork(),n=0,r=0,l=0,h=i.end-s,c={size:0,start:0,skip:0};t:for(let s=i.pos-t;i.pos>s;){let t=i.size;if(i.id==e&&t>=0){c.size=n,c.start=r,c.skip=l,l+=4,n+=4,i.next();continue}let a=i.pos-t;if(t<0||a<s||i.start<h)break;let f=i.id>=o?4:0,u=i.start;for(i.next();i.pos>a;){if(i.size<0){if(-3!=i.size)break t;f+=4}else i.id>=o&&(f+=4);i.next()}r=u,n+=t,l+=f}return(e<0||n==t)&&(c.size=n,c.start=r,c.skip=l),c.size>4?c:void 0}function m(t,e,i){let{id:n,start:s,end:r,size:l}=a;if(a.next(),l>=0&&n<o){let o=i;if(l>4){let n=a.pos-(l-4);for(;a.pos>n;)i=m(t,e,i)}e[--i]=o,e[--i]=r-t,e[--i]=s-t,e[--i]=n}else-3==l?h=n:-4==l&&(c=n);return i}let w=[],v=[];for(;a.pos>0;)f(t.start||0,t.bufferStart||0,w,v,-1,0);let b=null!==(e=t.length)&&void 0!==e?e:w.length?v[0]+w[0].length:0;return new oa(l[t.topID],w.reverse(),v.reverse(),b)}(t)}}oa.empty=new oa(ea.none,[],[],0);class aa{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new aa(this.buffer,this.index)}}class la{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return ea.none}toString(){let t=[];for(let e=0;e<this.buffer.length;)t.push(this.childString(e)),e=this.buffer[e+3];return t.join(",")}childString(t){let e=this.buffer[t],i=this.buffer[t+3],n=this.set.types[e],s=n.name;if(/\W/.test(s)&&!n.isError&&(s=JSON.stringify(s)),i==(t+=4))return s;let r=[];for(;t<i;)r.push(this.childString(t)),t=this.buffer[t+3];return s+"("+r.join(",")+")"}findChild(t,e,i,n,s){let{buffer:r}=this,o=-1;for(let a=t;a!=e&&!(ha(s,n,r[a+1],r[a+2])&&(o=a,i>0));a=r[a+3]);return o}slice(t,e,i){let n=this.buffer,s=new Uint16Array(e-t),r=0;for(let o=t,a=0;o<e;){s[a++]=n[o++],s[a++]=n[o++]-i;let e=s[a++]=n[o++]-i;s[a++]=n[o++]-t,r=Math.max(r,e)}return new la(s,r,this.set)}}function ha(t,e,i,n){switch(t){case-2:return i<e;case-1:return n>=e&&i<e;case 0:return i<e&&n>e;case 1:return i<=e&&n>e;case 2:return n>e;case 4:return!0}}function ca(t,e,i,n){for(var s;t.from==t.to||(i<1?t.from>=e:t.from>e)||(i>-1?t.to<=e:t.to<e);){let e=!n&&t instanceof ua&&t.index<0?null:t.parent;if(!e)return t;t=e}let r=n?0:ra.IgnoreOverlays;if(n)for(let n=t,o=n.parent;o;n=o,o=n.parent)n instanceof ua&&n.index<0&&(null===(s=o.enter(e,i,r))||void 0===s?void 0:s.from)!=n.from&&(t=o);for(;;){let n=t.enter(e,i,r);if(!n)return t;t=n}}class fa{cursor(t=0){return new va(this,t)}getChild(t,e=null,i=null){let n=da(this,t,e,i);return n.length?n[0]:null}getChildren(t,e=null,i=null){return da(this,t,e,i)}resolve(t,e=0){return ca(this,t,e,!1)}resolveInner(t,e=0){return ca(this,t,e,!0)}matchContext(t){return pa(this,t)}enterUnfinishedNodesBefore(t){let e=this.childBefore(t),i=this;for(;e;){let t=e.lastChild;if(!t||t.to!=e.to)break;t.type.isError&&t.from==t.to?(i=e,e=t.prevSibling):e=t}return i}get node(){return this}get next(){return this.parent}}class ua extends fa{constructor(t,e,i,n){super(),this._tree=t,this.from=e,this.index=i,this._parent=n}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(t,e,i,n,s=0){for(let r=this;;){for(let{children:o,positions:a}=r._tree,l=e>0?o.length:-1;t!=l;t+=e){let l=o[t],h=a[t]+r.from;if(ha(n,i,h,h+l.length))if(l instanceof la){if(s&ra.ExcludeBuffers)continue;let o=l.findChild(0,l.buffer.length,e,i-h,n);if(o>-1)return new ga(new Oa(r,l,t,h),null,o)}else if(s&ra.IncludeAnonymous||!l.type.isAnonymous||ba(l)){let o;if(!(s&ra.IgnoreMounts)&&(o=Ko.get(l))&&!o.overlay)return new ua(o.tree,h,t,r);let a=new ua(l,h,t,r);return s&ra.IncludeAnonymous||!a.type.isAnonymous?a:a.nextChild(e<0?l.children.length-1:0,e,i,n)}}if(s&ra.IncludeAnonymous||!r.type.isAnonymous)return null;if(t=r.index>=0?r.index+e:e<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&ra.IgnoreOverlays)&&(n=Ko.get(this._tree))&&n.overlay){let i=t-this.from;for(let{from:t,to:s}of n.overlay)if((e>0?t<=i:t<i)&&(e<0?s>=i:s>i))return new ua(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function da(t,e,i,n){let s=t.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(let t=!1;!t;)if(t=s.type.is(i),!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(e)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function pa(t,e,i=e.length-1){for(let n=t.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[i]&&e[i]!=n.name)return!1;i--}}return!0}class Oa{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}}class ga extends fa{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return s<0?null:new ga(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&ra.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new ga(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new ga(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new ga(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];t.push(i.slice(n,s,r)),e.push(0)}return new oa(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function ma(t){if(!t.length)return null;let e=0,i=t[0];for(let n=1;n<t.length;n++){let s=t[n];(s.from>i.from||s.to<i.to)&&(i=s,e=n)}let n=i instanceof ua&&i.index<0?null:i.parent,s=t.slice();return n?s[e]=n:s.splice(e,1),new wa(s,i)}class wa{constructor(t,e){this.heads=t,this.node=e}get next(){return ma(this.heads)}}class va{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof ua)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let e=t._parent;e;e=e._parent)this.stack.unshift(e.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return!!t&&(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0)}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return!!t&&(t instanceof ua?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)))}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return!(s<0)&&(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?!(i&ra.ExcludeBuffers)&&this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&ra.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&ra.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return!!this._tree._parent&&this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode));let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let t=i<0?0:this.stack[i]+4;if(this.index!=t)return this.yieldBuf(e.findChild(t,this.index,-1,0,4))}else{let t=e.buffer[this.index+3];if(t<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(t)}return i<0&&this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode))}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index<n.buffer.buffer.length)return!1}else for(let t=0;t<this.index;t++)if(n.buffer.buffer[t+3]<this.index)return!1;({index:e,parent:i}=n)}else({index:e,_parent:i}=this._tree);for(;i;({index:e,_parent:i}=i))if(e>-1)for(let n=e+t,s=t<0?-1:i._tree.children.length;n!=s;n+=t){let t=i._tree.children[n];if(this.mode&ra.IncludeAnonymous||t instanceof la||!t.type.isAnonymous||ba(t))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to<t))&&this.parent(););for(;this.enterChild(1,t,e););return this}get node(){if(!this.buffer)return this._tree;let t=this.bufferNode,e=null,i=0;if(t&&t.context==this.buffer)t:for(let n=this.index,s=this.stack.length;s>=0;){for(let r=t;r;r=r._parent)if(r.index==n){if(n==this.index)return r;e=r,i=s+1;break t}n=this.stack[--s]}for(let t=i;t<this.stack.length;t++)e=new ga(this.buffer,e,this.stack[t]);return this.bufferNode=new ga(this.buffer,e,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(t,e){for(let i=0;;){let n=!1;if(this.type.isAnonymous||!1!==t(this)){if(this.firstChild()){i++;continue}this.type.isAnonymous||(n=!0)}for(;n&&e&&e(this),n=this.type.isAnonymous,!this.nextSibling();){if(!i)return;this.parent(),i--,n=!0}}}matchContext(t){if(!this.buffer)return pa(this.node,t);let{buffer:e}=this.buffer,{types:i}=e.set;for(let n=t.length-1,s=this.stack.length-1;n>=0;s--){if(s<0)return pa(this.node,t,n);let r=i[e.buffer[this.stack[s]]];if(!r.isAnonymous){if(t[n]&&t[n]!=r.name)return!1;n--}}return!0}}function ba(t){return t.children.some((t=>t instanceof la||!t.type.isAnonymous||ba(t)))}const ya=new WeakMap;function Sa(t,e){if(!t.isAnonymous||e instanceof la||e.type!=t)return 1;let i=ya.get(e);if(null==i){i=1;for(let n of e.children){if(n.type!=t||!(n instanceof oa)){i=1;break}i+=Sa(t,n)}ya.set(e,i)}return i}function xa(t,e,i,n,s,r,o,a,l){let h=0;for(let i=n;i<s;i++)h+=Sa(t,e[i]);let c=Math.ceil(1.5*h/8),f=[],u=[];return function e(i,n,s,o,a){for(let h=s;h<o;){let s=h,d=n[h],p=Sa(t,i[h]);for(h++;h<o;h++){let e=Sa(t,i[h]);if(p+e>=c)break;p+=e}if(h==s+1){if(p>c){let t=i[s];e(t.children,t.positions,0,t.children.length,n[s]+a);continue}f.push(i[s])}else{let e=n[h-1]+i[h-1].length-d;f.push(xa(t,i,n,s,h,d,e,null,l))}u.push(d+a-r)}}(e,i,n,s,0),(a||l)(f,u,o)}class ka{constructor(){this.map=new WeakMap}setBuffer(t,e,i){let n=this.map.get(t);n||this.map.set(t,n=new Map),n.set(e,i)}getBuffer(t,e){let i=this.map.get(t);return i&&i.get(e)}set(t,e){t instanceof ga?this.setBuffer(t.context.buffer,t.index,e):t instanceof ua&&this.map.set(t.tree,e)}get(t){return t instanceof ga?this.getBuffer(t.context.buffer,t.index):t instanceof ua?this.map.get(t.tree):void 0}cursorSet(t,e){t.buffer?this.setBuffer(t.buffer.buffer,t.index,e):this.map.set(t.tree,e)}cursorGet(t){return t.buffer?this.getBuffer(t.buffer.buffer,t.index):this.map.get(t.tree)}}class Qa{constructor(t,e,i,n,s=!1,r=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(t,e=[],i=!1){let n=[new Qa(0,t.length,t,0,!1,i)];for(let i of e)i.to>t.length&&n.push(i);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],s=1,r=t.length?t[0]:null;for(let o=0,a=0,l=0;;o++){let h=o<e.length?e[o]:null,c=h?h.fromA:1e9;if(c-a>=i)for(;r&&r.from<c;){let e=r;if(a>=e.from||c<=e.to||l){let t=Math.max(e.from,a)-l,i=Math.min(e.to,c)-l;e=t>=i?null:new Qa(t,i,e.tree,e.offset+l,o>0,!!h)}if(e&&n.push(e),r.to>c)break;r=s<t.length?t[s++]:null}if(!h)break;a=h.toA,l=h.toA-h.toB}return n}}class $a{startParse(t,e,i){return"string"==typeof t&&(t=new Pa(t)),i=i?i.length?i.map((t=>new Fo(t.from,t.to))):[new Fo(0,0)]:[new Fo(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let t=n.advance();if(t)return t}}}class Pa{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}}new Jo({perNode:!0});let Za=0;class Ca{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=Za++}static define(t){if(null==t?void 0:t.base)throw new Error("Can not derive from a modified tag");let e=new Ca([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new Aa;return e=>e.modified.indexOf(t)>-1?e:Aa.get(e.base||e,e.modified.concat(t).sort(((t,e)=>t.id-e.id)))}}let Ta=0;class Aa{constructor(){this.instances=[],this.id=Ta++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find((i=>{return i.base==t&&(n=e,s=i.modified,n.length==s.length&&n.every(((t,e)=>t==s[e])));var n,s}));if(i)return i;let n=[],s=new Ca(n,t,e);for(let t of e)t.instances.push(s);let r=function(t){let e=[[]];for(let i=0;i<t.length;i++)for(let n=0,s=e.length;n<s;n++)e.push(e[n].concat(t[i]));return e.sort(((t,e)=>e.length-t.length))}(e);for(let e of t.set)if(!e.modified.length)for(let t of r)n.push(Aa.get(e,t));return s}}function Ra(t){let e=Object.create(null);for(let i in t){let n=t[i];Array.isArray(n)||(n=[n]);for(let t of i.split(" "))if(t){let i=[],s=2,r=t;for(let e=0;;){if("..."==r&&e>0&&e+3==t.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+t);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),e+=n[0].length,e==t.length)break;let o=t[e++];if(e==t.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+t);r=t.slice(e)}let o=i.length-1,a=i[o];if(!a)throw new RangeError("Invalid path: "+t);let l=new Ya(n,s,o>0?i.slice(0,o):null);e[a]=l.sort(e[a])}}return Xa.add(e)}const Xa=new Jo;class Ya{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(t){return!t||t.depth<this.depth?(this.next=t,this):(t.next=this.sort(t.next),t)}get depth(){return this.context?this.context.length:0}}function Wa(t,e){let i=Object.create(null);for(let e of t)if(Array.isArray(e.tag))for(let t of e.tag)i[t.id]=e.class;else i[e.tag.id]=e.class;let{scope:n,all:s=null}=e||{};return{style:t=>{let e=s;for(let n of t)for(let t of n.set){let n=i[t.id];if(n){e=e?e+" "+n:n;break}}return e},scope:n}}function Ma(t,e,i,n=0,s=t.length){let r=new ja(n,Array.isArray(e)?e:[e],i);r.highlightRange(t.cursor(),n,s,"",r.highlighters),r.flush(s)}Ya.empty=new Ya([],2,null);class ja{constructor(t,e,i){this.at=t,this.highlighters=e,this.span=i,this.class=""}startSpan(t,e){e!=this.class&&(this.flush(t),t>this.at&&(this.at=t),this.class=e)}flush(t){t>this.at&&this.class&&this.span(this.at,t,this.class)}highlightRange(t,e,i,n,s){let{type:r,from:o,to:a}=t;if(o>=i||a<=e)return;r.isTop&&(s=this.highlighters.filter((t=>!t.scope||t.scope(r))));let l=n,h=Da(t)||Ya.empty,c=function(t,e){let i=null;for(let n of t){let t=n.style(e);t&&(i=i?i+" "+t:t)}return i}(s,h.tags);if(c&&(l&&(l+=" "),l+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(e,o),l),h.opaque)return;let f=t.tree&&t.tree.prop(Jo.mounted);if(f&&f.overlay){let r=t.node.enter(f.overlay[0].from+o,1),h=this.highlighters.filter((t=>!t.scope||t.scope(f.tree.type))),c=t.firstChild();for(let u=0,d=o;;u++){let p=u<f.overlay.length?f.overlay[u]:null,O=p?p.from+o:a,g=Math.max(e,d),m=Math.min(i,O);if(g<m&&c)for(;t.from<m&&(this.highlightRange(t,g,m,n,s),this.startSpan(Math.min(m,t.to),l),!(t.to>=O)&&t.nextSibling()););if(!p||O>i)break;d=p.to+o,d>e&&(this.highlightRange(r.cursor(),Math.max(e,p.from+o),Math.min(i,d),"",h),this.startSpan(Math.min(i,d),l))}c&&t.parent()}else if(t.firstChild()){f&&(n="");do{if(!(t.to<=e)){if(t.from>=i)break;this.highlightRange(t,e,i,n,s),this.startSpan(Math.min(i,t.to),l)}}while(t.nextSibling());t.parent()}}}function Da(t){let e=t.type.prop(Xa);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}const Ea=Ca.define,qa=Ea(),_a=Ea(),Va=Ea(_a),Ia=Ea(_a),za=Ea(),Ba=Ea(za),Ga=Ea(za),La=Ea(),Na=Ea(La),Ua=Ea(),Ha=Ea(),Fa=Ea(),Ja=Ea(Fa),Ka=Ea(),tl={comment:qa,lineComment:Ea(qa),blockComment:Ea(qa),docComment:Ea(qa),name:_a,variableName:Ea(_a),typeName:Va,tagName:Ea(Va),propertyName:Ia,attributeName:Ea(Ia),className:Ea(_a),labelName:Ea(_a),namespace:Ea(_a),macroName:Ea(_a),literal:za,string:Ba,docString:Ea(Ba),character:Ea(Ba),attributeValue:Ea(Ba),number:Ga,integer:Ea(Ga),float:Ea(Ga),bool:Ea(za),regexp:Ea(za),escape:Ea(za),color:Ea(za),url:Ea(za),keyword:Ua,self:Ea(Ua),null:Ea(Ua),atom:Ea(Ua),unit:Ea(Ua),modifier:Ea(Ua),operatorKeyword:Ea(Ua),controlKeyword:Ea(Ua),definitionKeyword:Ea(Ua),moduleKeyword:Ea(Ua),operator:Ha,derefOperator:Ea(Ha),arithmeticOperator:Ea(Ha),logicOperator:Ea(Ha),bitwiseOperator:Ea(Ha),compareOperator:Ea(Ha),updateOperator:Ea(Ha),definitionOperator:Ea(Ha),typeOperator:Ea(Ha),controlOperator:Ea(Ha),punctuation:Fa,separator:Ea(Fa),bracket:Ja,angleBracket:Ea(Ja),squareBracket:Ea(Ja),paren:Ea(Ja),brace:Ea(Ja),content:La,heading:Na,heading1:Ea(Na),heading2:Ea(Na),heading3:Ea(Na),heading4:Ea(Na),heading5:Ea(Na),heading6:Ea(Na),contentSeparator:Ea(La),list:Ea(La),quote:Ea(La),emphasis:Ea(La),strong:Ea(La),link:Ea(La),monospace:Ea(La),strikethrough:Ea(La),inserted:Ea(),deleted:Ea(),changed:Ea(),invalid:Ea(),meta:Ka,documentMeta:Ea(Ka),annotation:Ea(Ka),processingInstruction:Ea(Ka),definition:Ca.defineModifier(),constant:Ca.defineModifier(),function:Ca.defineModifier(),standard:Ca.defineModifier(),local:Ca.defineModifier(),special:Ca.defineModifier()},el=Wa([{tag:tl.link,class:"tok-link"},{tag:tl.heading,class:"tok-heading"},{tag:tl.emphasis,class:"tok-emphasis"},{tag:tl.strong,class:"tok-strong"},{tag:tl.keyword,class:"tok-keyword"},{tag:tl.atom,class:"tok-atom"},{tag:tl.bool,class:"tok-bool"},{tag:tl.url,class:"tok-url"},{tag:tl.labelName,class:"tok-labelName"},{tag:tl.inserted,class:"tok-inserted"},{tag:tl.deleted,class:"tok-deleted"},{tag:tl.literal,class:"tok-literal"},{tag:tl.string,class:"tok-string"},{tag:tl.number,class:"tok-number"},{tag:[tl.regexp,tl.escape,tl.special(tl.string)],class:"tok-string2"},{tag:tl.variableName,class:"tok-variableName"},{tag:tl.local(tl.variableName),class:"tok-variableName tok-local"},{tag:tl.definition(tl.variableName),class:"tok-variableName tok-definition"},{tag:tl.special(tl.variableName),class:"tok-variableName2"},{tag:tl.definition(tl.propertyName),class:"tok-propertyName tok-definition"},{tag:tl.typeName,class:"tok-typeName"},{tag:tl.namespace,class:"tok-namespace"},{tag:tl.className,class:"tok-className"},{tag:tl.macroName,class:"tok-macroName"},{tag:tl.propertyName,class:"tok-propertyName"},{tag:tl.operator,class:"tok-operator"},{tag:tl.comment,class:"tok-comment"},{tag:tl.meta,class:"tok-meta"},{tag:tl.invalid,class:"tok-invalid"},{tag:tl.punctuation,class:"tok-punctuation"}]);var il,nl=Object.freeze({__proto__:null,Tag:Ca,classHighlighter:el,getStyleTags:Da,highlightCode:function(t,e,i,n,s,r=0,o=t.length){let a=r;function l(e,i){if(!(e<=a)){for(let r=t.slice(a,e),o=0;;){let t=r.indexOf("\n",o),e=t<0?r.length:t;if(e>o&&n(r.slice(o,e),i),t<0)break;s(),o=t+1}a=e}}Ma(e,i,((t,e,i)=>{l(t,""),l(e,i)}),r,o),l(o,"")},highlightTree:Ma,styleTags:Ra,tagHighlighter:Wa,tags:tl});const sl=new Jo;function rl(t){return j.define({combine:t?e=>e.concat(t):void 0})}const ol=new Jo;class al{constructor(t,e,i=[],n=""){this.data=t,this.name=n,Qt.prototype.hasOwnProperty("tree")||Object.defineProperty(Qt.prototype,"tree",{get(){return cl(this)}}),this.parser=e,this.extension=[bl.of(this),Qt.languageData.of(((t,e,i)=>{let n=ll(t,e,i),s=n.type.prop(sl);if(!s)return[];let r=t.facet(s),o=n.type.prop(ol);if(o){let s=n.resolve(e-n.from,i);for(let e of o)if(e.test(s,t)){let i=t.facet(e.facet);return"replace"==e.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(t,e,i=-1){return ll(t,e,i).type.prop(sl)==this.data}findRegions(t){let e=t.facet(bl);if((null==e?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(t,e)=>{if(t.prop(sl)==this.data)return void i.push({from:e,to:e+t.length});let s=t.prop(Jo.mounted);if(s){if(s.tree.prop(sl)==this.data){if(s.overlay)for(let t of s.overlay)i.push({from:t.from+e,to:t.to+e});else i.push({from:e,to:e+t.length});return}if(s.overlay){let t=i.length;if(n(s.tree,s.overlay[0].from+e),i.length>t)return}}for(let i=0;i<t.children.length;i++){let s=t.children[i];s instanceof oa&&n(s,t.positions[i]+e)}};return n(cl(t),0),i}get allowsNesting(){return!0}}function ll(t,e,i){let n=t.facet(bl),s=cl(t).topNode;if(!n||n.allowsNesting)for(let t=s;t;t=t.enter(e,i,ra.ExcludeBuffers))t.type.isTop&&(s=t);return s}al.setState=dt.define();class hl extends al{constructor(t,e,i){super(t,e,[],i),this.parser=e}static define(t){let e=rl(t.languageData);return new hl(e,t.parser.configure({props:[sl.add((t=>t.isTop?e:void 0))]}),t.name)}configure(t,e){return new hl(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function cl(t){let e=t.field(al.state,!1);return e?e.tree:oa.empty}function fl(t,e,i=50){var n;let s=null===(n=t.field(al.state,!1))||void 0===n?void 0:n.context;if(!s)return null;let r=s.viewport;s.updateViewport({from:0,to:e});let o=s.isDone(e)||s.work(i,e)?s.tree:null;return s.updateViewport(r),o}class ul{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t<i||e>=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}}let dl=null;class pl{constructor(t,e,i=[],n,s,r,o,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new pl(t,e,[],oa.empty,0,i,[],null)}startParse(){return this.parser.startParse(new ul(this.state.doc),this.fragments)}work(t,e){return null!=e&&e>=this.state.doc.length&&(e=void 0),this.tree!=oa.empty&&this.isDone(null!=e?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof t){let e=Date.now()+t;t=()=>Date.now()>e}for(this.parse||(this.parse=this.startParse()),null!=e&&(null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&e<this.state.doc.length&&this.parse.stopAt(e);;){let n=this.parse.advance();if(n){if(this.fragments=this.withoutTempSkipped(Qa.addTree(n,this.fragments,null!=this.parse.stoppedAt)),this.treeLen=null!==(i=this.parse.stoppedAt)&&void 0!==i?i:this.state.doc.length,this.tree=n,this.parse=null,!(this.treeLen<(null!=e?e:this.state.doc.length)))return!0;this.parse=this.startParse()}if(t())return!1}}))}takeTree(){let t,e;this.parse&&(t=this.parse.parsedPos)>=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext((()=>{for(;!(e=this.parse.advance()););})),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(Qa.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=dl;dl=this;try{return t()}finally{dl=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=Ol(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!t.empty){let e=[];if(t.iterChangedRanges(((t,i,n,s)=>e.push({fromA:t,toA:i,fromB:n,toB:s}))),i=Qa.applyChanges(i,e),n=oa.empty,s=0,r={from:t.mapPos(r.from,-1),to:t.mapPos(r.to,1)},this.skipped.length){o=[];for(let e of this.skipped){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);i<n&&o.push({from:i,to:n})}}}return new pl(this.parser,e,i,n,s,r,o,this.scheduleOn)}updateViewport(t){if(this.viewport.from==t.from&&this.viewport.to==t.to)return!1;this.viewport=t;let e=this.skipped.length;for(let e=0;e<this.skipped.length;e++){let{from:i,to:n}=this.skipped[e];i<t.to&&n>t.from&&(this.fragments=Ol(this.fragments,i,n),this.skipped.splice(e--,1))}return!(this.skipped.length>=e)&&(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends $a{createParse(e,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let e=dl;if(e){for(let t of n)e.tempSkipped.push(t);t&&(e.scheduleOn=e.scheduleOn?Promise.all([e.scheduleOn,t]):t)}return this.parsedPos=r,new oa(ea.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&0==e[0].from&&e[0].to>=t}static get(){return dl}}function Ol(t,e,i){return Qa.applyChanges(t,[{fromA:e,toA:i,fromB:e,toB:i}])}class gl{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new gl(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=pl.create(t.facet(bl).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new gl(i)}}al.state=z.define({create:gl.init,update(t,e){for(let t of e.effects)if(t.is(al.setState))return t.value;return e.startState.facet(bl)!=e.state.facet(bl)?gl.init(e.state):t.apply(e)}});let ml=t=>{let e=setTimeout((()=>t()),500);return()=>clearTimeout(e)};"undefined"!=typeof requestIdleCallback&&(ml=t=>{let e=-1,i=setTimeout((()=>{e=requestIdleCallback(t,{timeout:400})}),100);return()=>e<0?clearTimeout(i):cancelIdleCallback(e)});const wl="undefined"!=typeof navigator&&(null===(il=navigator.scheduling)||void 0===il?void 0:il.isInputPending)?()=>navigator.scheduling.isInputPending():null,vl=Ni.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(al.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(al.state);e.tree==e.context.tree&&e.context.isDone(t.doc.length)||(this.working=ml(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnd<e&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=e+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:i,viewport:{to:n}}=this.view,s=i.field(al.state);if(s.tree==s.context.tree&&s.context.isDone(n+1e5))return;let r=Date.now()+Math.min(this.chunkBudget,100,t&&!wl?Math.max(25,t.timeRemaining()-5):1e9),o=s.context.treeLen<n&&i.doc.length>n+1e3,a=s.context.work((()=>wl&&wl()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:al.setState.of(new gl(s.context))})),this.chunkBudget>0&&(!a||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then((()=>this.scheduleWork())).catch((t=>zi(this.view.state,t))).then((()=>this.workScheduled--)),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),bl=j.define({combine:t=>t.length?t[0]:null,enables:t=>[al.state,vl,Gs.contentAttributes.compute([t],(e=>{let i=e.facet(t);return i&&i.name?{"data-language":i.name}:{}}))]});class yl{constructor(t,e=[]){this.language=t,this.support=e,this.extension=[t,e]}}class Sl{constructor(t,e,i,n,s,r=void 0){this.name=t,this.alias=e,this.extensions=i,this.filename=n,this.loadFunc=s,this.support=r,this.loading=null}load(){return this.loading||(this.loading=this.loadFunc().then((t=>this.support=t),(t=>{throw this.loading=null,t})))}static of(t){let{load:e,support:i}=t;if(!e){if(!i)throw new RangeError("Must pass either 'load' or 'support' to LanguageDescription.of");e=()=>Promise.resolve(i)}return new Sl(t.name,(t.alias||[]).concat(t.name).map((t=>t.toLowerCase())),t.extensions||[],t.filename,e,i)}static matchFilename(t,e){for(let i of t)if(i.filename&&i.filename.test(e))return i;let i=/\.([^.]+)$/.exec(e);if(i)for(let e of t)if(e.extensions.indexOf(i[1])>-1)return e;return null}static matchLanguageName(t,e,i=!0){e=e.toLowerCase();for(let i of t)if(i.alias.some((t=>t==e)))return i;if(i)for(let i of t)for(let t of i.alias){let n=e.indexOf(t);if(n>-1&&(t.length>2||!/\w/.test(e[n-1])&&!/\w/.test(e[n+t.length])))return i}return null}}const xl=j.define(),kl=j.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some((t=>t!=e[0])))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function Ql(t){let e=t.facet(kl);return 9==e.charCodeAt(0)?t.tabSize*e.length:e.length}function $l(t,e){let i="",n=t.tabSize,s=t.facet(kl)[0];if("\t"==s){for(;e>=n;)i+="\t",e-=n;s=" "}for(let t=0;t<e;t++)i+=s;return i}function Pl(t,e){t instanceof Qt&&(t=new Zl(t));for(let i of t.state.facet(xl)){let n=i(t,e);if(void 0!==n)return n}let i=cl(t.state);return i.length>=e?function(t,e,i){let n=e.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let t=[];for(let e=s;e!=n.node;e=e.parent)t.push(e);for(let e=t.length-1;e>=0;e--)n={node:t[e],next:n}}return Tl(n,t,i)}(t,i,e):null}class Zl{constructor(t,e={}){this.state=t,this.options=e,this.unit=Ql(t)}lineAt(t,e=1){let i=this.state.doc.lineAt(t),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==t?{text:"",from:t}:(e<0?n<t:n<=t)?{text:i.text.slice(n-i.from),from:n}:{text:i.text.slice(0,n-i.from),from:i.from}:i}textAfterPos(t,e=1){if(this.options.simulateDoubleBreak&&t==this.options.simulateBreak)return"";let{text:i,from:n}=this.lineAt(t,e);return i.slice(t-n,Math.min(i.length,t+100-n))}column(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.countColumn(i,t-n),r=this.options.overrideIndentation?this.options.overrideIndentation(n):-1;return r>-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(t,e=t.length){return It(t,this.state.tabSize,e)}lineIndent(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.options.overrideIndentation;if(s){let t=s(n);if(t>-1)return t}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Cl=new Jo;function Tl(t,e,i){for(let n=t;n;n=n.next){let t=Al(n.node);if(t)return t(Xl.create(e,i,n))}return 0}function Al(t){let e=t.type.prop(Cl);if(e)return e;let i,n=t.firstChild;if(n&&(i=n.type.prop(Jo.closedBy))){let e=t.lastChild,n=e&&i.indexOf(e.name)>-1;return t=>Ml(t,!0,1,void 0,n&&!function(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}(t)?e.from:void 0)}return null==t.parent?Rl:null}function Rl(){return 0}class Xl extends Zl{constructor(t,e,i){super(t.state,t.options),this.base=t,this.pos=e,this.context=i}get node(){return this.context.node}static create(t,e,i){return new Xl(t,e,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(t){let e=this.state.doc.lineAt(t.from);for(;;){let i=t.resolve(e.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(Yl(i,t))break;e=this.state.doc.lineAt(i.from)}return this.lineIndent(e.from)}continue(){return Tl(this.context.next,this.base,this.pos)}}function Yl(t,e){for(let i=e;i;i=i.parent)if(t==i)return!0;return!1}function Wl({closing:t,align:e=!0,units:i=1}){return n=>Ml(n,e,i,t)}function Ml(t,e,i,n,s){let r=t.textAfter,o=r.match(/^\s*/)[0].length,a=n&&r.slice(o,o+n.length)==n||s==t.pos+o,l=e?function(t){let e=t.node,i=e.childAfter(e.from),n=e.lastChild;if(!i)return null;let s=t.options.simulateBreak,r=t.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let t=i.to;;){let s=e.childAfter(t);if(!s||s==n)return null;if(!s.type.isSkipped)return s.from<o?i:null;t=s.to}}(t):null;return l?a?t.column(l.from):t.column(l.to):t.baseIndent+(a?0:t.unit*i)}const jl=t=>t.baseIndent;function Dl({except:t,units:e=1}={}){return i=>{let n=t&&t.test(i.textAfter);return i.baseIndent+(n?0:e*i.unit)}}function El(){return Qt.transactionFilter.of((t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let i=t.newDoc,{head:n}=t.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return t;let r=i.sliceString(s.from,n);if(!e.some((t=>t.test(r))))return t;let{state:o}=t,a=-1,l=[];for(let{head:t}of o.selection.ranges){let e=o.doc.lineAt(t);if(e.from==a)continue;a=e.from;let i=Pl(o,e.from);if(null==i)continue;let n=/^\s*/.exec(e.text)[0],s=$l(o,i);n!=s&&l.push({from:e.from,to:e.from+n.length,insert:s})}return l.length?[t,{changes:l,sequential:!0}]:t}))}const ql=j.define(),_l=new Jo;function Vl(t){let e=t.firstChild,i=t.lastChild;return e&&e.to<i.from?{from:e.to,to:i.type.isError?t.to:i.from}:null}function Il(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function zl(t,e,i){for(let n of t.facet(ql)){let s=n(t,e,i);if(s)return s}return function(t,e,i){let n=cl(t);if(n.length<i)return null;let s=null;for(let r=n.resolveStack(i,1);r;r=r.next){let o=r.node;if(o.to<=i||o.from>i)continue;if(s&&o.from<e)break;let a=o.type.prop(_l);if(a&&(o.to<n.length-50||n.length==t.doc.length||!Il(o))){let n=a(o,t);n&&n.from<=i&&n.from>=e&&n.to>i&&(s=n)}}return s}(t,e,i)}function Bl(t,e){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);return i>=n?void 0:{from:i,to:n}}const Gl=dt.define({map:Bl}),Ll=dt.define({map:Bl});function Nl(t){let e=[];for(let{head:i}of t.state.selection.ranges)e.some((t=>t.from<=i&&t.to>=i))||e.push(t.lineBlockAt(i));return e}const Ul=z.define({create:()=>si.none,update(t,e){t=t.map(e.changes);for(let i of e.effects)if(i.is(Gl)&&!Fl(t,i.value.from,i.value.to)){let{preparePlaceholder:n}=e.state.facet(ah),s=n?si.replace({widget:new fh(n(e.state,i.value))}):ch;t=t.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(Ll)&&(t=t.update({filter:(t,e)=>i.value.from!=t||i.value.to!=e,filterFrom:i.value.from,filterTo:i.value.to}));if(e.selection){let i=!1,{head:n}=e.selection.main;t.between(n,n,((t,e)=>{t<n&&e>n&&(i=!0)})),i&&(t=t.update({filterFrom:n,filterTo:n,filter:(t,e)=>e<=n||t>=n}))}return t},provide:t=>Gs.decorations.from(t),toJSON(t,e){let i=[];return t.between(0,e.doc.length,((t,e)=>{i.push(t,e)})),i},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let i=0;i<t.length;){let n=t[i++],s=t[i++];if("number"!=typeof n||"number"!=typeof s)throw new RangeError("Invalid JSON for fold state");e.push(ch.range(n,s))}return si.set(e,!0)}});function Hl(t,e,i){var n;let s=null;return null===(n=t.field(Ul,!1))||void 0===n||n.between(e,i,((t,e)=>{(!s||s.from>t)&&(s={from:t,to:e})})),s}function Fl(t,e,i){let n=!1;return t.between(e,e,((t,s)=>{t==e&&s==i&&(n=!0)})),n}function Jl(t,e){return t.field(Ul,!1)?e:e.concat(dt.appendConfig.of(lh()))}const Kl=t=>{for(let e of Nl(t)){let i=zl(t.state,e.from,e.to);if(i)return t.dispatch({effects:Jl(t.state,[Gl.of(i),eh(t,i)])}),!0}return!1},th=t=>{if(!t.state.field(Ul,!1))return!1;let e=[];for(let i of Nl(t)){let n=Hl(t.state,i.from,i.to);n&&e.push(Ll.of(n),eh(t,n,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function eh(t,e,i=!0){let n=t.state.doc.lineAt(e.from).number,s=t.state.doc.lineAt(e.to).number;return Gs.announce.of(`${t.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${t.state.phrase("to")} ${s}.`)}const ih=t=>{let{state:e}=t,i=[];for(let n=0;n<e.doc.length;){let s=t.lineBlockAt(n),r=zl(e,s.from,s.to);r&&i.push(Gl.of(r)),n=(r?t.lineBlockAt(r.to):s).to+1}return i.length&&t.dispatch({effects:Jl(t.state,i)}),!!i.length},nh=t=>{let e=t.state.field(Ul,!1);if(!e||!e.size)return!1;let i=[];return e.between(0,t.state.doc.length,((t,e)=>{i.push(Ll.of({from:t,to:e}))})),t.dispatch({effects:i}),!0};function sh(t,e){for(let i=e;;){let n=zl(t.state,i.from,i.to);if(n&&n.to>e.from)return n;if(!i.from)return null;i=t.lineBlockAt(i.from-1)}}const rh=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:Kl},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:th},{key:"Ctrl-Alt-[",run:ih},{key:"Ctrl-Alt-]",run:nh}],oh={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},ah=j.define({combine:t=>$t(t,oh)});function lh(t){let e=[Ul,Oh];return t&&e.push(ah.of(t)),e}function hh(t,e){let{state:i}=t,n=i.facet(ah),s=e=>{let i=t.lineBlockAt(t.posAtDOM(e.target)),n=Hl(t.state,i.from,i.to);n&&t.dispatch({effects:Ll.of(n)}),e.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(t,s,e);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const ch=si.replace({widget:new class extends ii{toDOM(t){return hh(t,null)}}});class fh extends ii{constructor(t){super(),this.value=t}eq(t){return this.value==t.value}toDOM(t){return hh(t,this.value)}}const uh={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class dh extends bo{constructor(t,e){super(),this.config=t,this.open=e}eq(t){return this.config==t.config&&this.open==t.open}toDOM(t){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=t.state.phrase(this.open?"Fold line":"Unfold line"),e}}function ph(t={}){let e=Object.assign(Object.assign({},uh),t),i=new dh(e,!0),n=new dh(e,!1),s=Ni.fromClass(class{constructor(t){this.from=t.viewport.from,this.markers=this.buildMarkers(t)}update(t){(t.docChanged||t.viewportChanged||t.startState.facet(bl)!=t.state.facet(bl)||t.startState.field(Ul,!1)!=t.state.field(Ul,!1)||cl(t.startState)!=cl(t.state)||e.foldingChanged(t))&&(this.markers=this.buildMarkers(t.view))}buildMarkers(t){let e=new Rt;for(let s of t.viewportLineBlocks){let r=Hl(t.state,s.from,s.to)?n:zl(t.state,s.from,s.to)?i:null;r&&e.add(s.from,s.from,r)}return e.finish()}}),{domEventHandlers:r}=e;return[s,ko({class:"cm-foldGutter",markers(t){var e;return(null===(e=t.plugin(s))||void 0===e?void 0:e.markers)||At.empty},initialSpacer:()=>new dh(e,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(t,e,i)=>{if(r.click&&r.click(t,e,i))return!0;let n=Hl(t.state,e.from,e.to);if(n)return t.dispatch({effects:Ll.of(n)}),!0;let s=zl(t.state,e.from,e.to);return!!s&&(t.dispatch({effects:Gl.of(s)}),!0)}})}),lh()]}const Oh=Gs.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class gh{constructor(t,e){let i;function n(t){let e=Ut.newName();return(i||(i=Object.create(null)))["."+e]=t,e}this.specs=t;const s="string"==typeof e.all?e.all:e.all?n(e.all):void 0,r=e.scope;this.scope=r instanceof al?t=>t.prop(sl)==r.data:r?t=>t==r:void 0,this.style=Wa(t.map((t=>({tag:t.tag,class:t.class||n(Object.assign({},t,{tag:null}))}))),{all:s}).style,this.module=i?new Ut(i):null,this.themeType=e.themeType}static define(t,e){return new gh(t,e||{})}}const mh=j.define(),wh=j.define({combine:t=>t.length?[t[0]]:null});function vh(t){let e=t.facet(mh);return e.length?e:t.facet(wh)}function bh(t,e){let i,n=[Sh];return t instanceof gh&&(t.module&&n.push(Gs.styleModule.of(t.module)),i=t.themeType),(null==e?void 0:e.fallback)?n.push(wh.of(t)):i?n.push(mh.computeN([Gs.darkTheme],(e=>e.facet(Gs.darkTheme)==("dark"==i)?[t]:[]))):n.push(mh.of(t)),n}class yh{constructor(t){this.markCache=Object.create(null),this.tree=cl(t.state),this.decorations=this.buildDeco(t,vh(t.state)),this.decoratedTo=t.viewport.to}update(t){let e=cl(t.state),i=vh(t.state),n=i!=vh(t.startState),{viewport:s}=t.view,r=t.changes.mapPos(this.decoratedTo,1);e.length<s.to&&!n&&e.type==this.tree.type&&r>=s.to?(this.decorations=this.decorations.map(t.changes),this.decoratedTo=r):(e!=this.tree||t.viewportChanged||n)&&(this.tree=e,this.decorations=this.buildDeco(t.view,i),this.decoratedTo=s.to)}buildDeco(t,e){if(!e||!this.tree.length)return si.none;let i=new Rt;for(let{from:n,to:s}of t.visibleRanges)Ma(this.tree,e,((t,e,n)=>{i.add(t,e,this.markCache[n]||(this.markCache[n]=si.mark({class:n})))}),n,s);return i.finish()}}const Sh=H.high(Ni.fromClass(yh,{decorations:t=>t.decorations})),xh=gh.define([{tag:tl.meta,color:"#404740"},{tag:tl.link,textDecoration:"underline"},{tag:tl.heading,textDecoration:"underline",fontWeight:"bold"},{tag:tl.emphasis,fontStyle:"italic"},{tag:tl.strong,fontWeight:"bold"},{tag:tl.strikethrough,textDecoration:"line-through"},{tag:tl.keyword,color:"#708"},{tag:[tl.atom,tl.bool,tl.url,tl.contentSeparator,tl.labelName],color:"#219"},{tag:[tl.literal,tl.inserted],color:"#164"},{tag:[tl.string,tl.deleted],color:"#a11"},{tag:[tl.regexp,tl.escape,tl.special(tl.string)],color:"#e40"},{tag:tl.definition(tl.variableName),color:"#00f"},{tag:tl.local(tl.variableName),color:"#30a"},{tag:[tl.typeName,tl.namespace],color:"#085"},{tag:tl.className,color:"#167"},{tag:[tl.special(tl.variableName),tl.macroName],color:"#256"},{tag:tl.definition(tl.propertyName),color:"#00c"},{tag:tl.comment,color:"#940"},{tag:tl.invalid,color:"#f00"}]),kh=Gs.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Qh=1e4,$h="()[]{}",Ph=j.define({combine:t=>$t(t,{afterCursor:!0,brackets:$h,maxScanDistance:Qh,renderMatch:Th})}),Zh=si.mark({class:"cm-matchingBracket"}),Ch=si.mark({class:"cm-nonmatchingBracket"});function Th(t){let e=[],i=t.matched?Zh:Ch;return e.push(i.range(t.start.from,t.start.to)),t.end&&e.push(i.range(t.end.from,t.end.to)),e}const Ah=z.define({create:()=>si.none,update(t,e){if(!e.docChanged&&!e.selection)return t;let i=[],n=e.state.facet(Ph);for(let t of e.state.selection.ranges){if(!t.empty)continue;let s=jh(e.state,t.head,-1,n)||t.head>0&&jh(e.state,t.head-1,1,n)||n.afterCursor&&(jh(e.state,t.head,1,n)||t.head<e.state.doc.length&&jh(e.state,t.head+1,-1,n));s&&(i=i.concat(n.renderMatch(s,e.state)))}return si.set(i,!0)},provide:t=>Gs.decorations.from(t)}),Rh=[Ah,kh];function Xh(t={}){return[Ph.of(t),Rh]}const Yh=new Jo;function Wh(t,e,i){let n=t.prop(e<0?Jo.openedBy:Jo.closedBy);if(n)return n;if(1==t.name.length){let n=i.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[i[n+e]]}return null}function Mh(t){let e=t.type.prop(Yh);return e?e(t.node):t}function jh(t,e,i,n={}){let s=n.maxScanDistance||Qh,r=n.brackets||$h,o=cl(t),a=o.resolveInner(e,i);for(let n=a;n;n=n.parent){let s=Wh(n.type,i,r);if(s&&n.from<n.to){let o=Mh(n);if(o&&(i>0?e>=o.from&&e<o.to:e>o.from&&e<=o.to))return Dh(t,e,i,n,o,s,r)}}return function(t,e,i,n,s,r,o){let a=i<0?t.sliceDoc(e-1,e):t.sliceDoc(e,e+1),l=o.indexOf(a);if(l<0||l%2==0!=i>0)return null;let h={from:i<0?e-1:e,to:i>0?e+1:e},c=t.doc.iterRange(e,i>0?t.doc.length:0),f=0;for(let t=0;!c.next().done&&t<=r;){let r=c.value;i<0&&(t+=r.length);let a=e+t*i;for(let t=i>0?0:r.length-1,e=i>0?r.length:-1;t!=e;t+=i){let e=o.indexOf(r[t]);if(!(e<0||n.resolveInner(a+t,1).type!=s))if(e%2==0==i>0)f++;else{if(1==f)return{start:h,end:{from:a+t,to:a+t+1},matched:e>>1==l>>1};f--}}i>0&&(t+=r.length)}return c.done?{start:h,matched:!1}:null}(t,e,i,o,a.type,s,r)}function Dh(t,e,i,n,s,r,o){let a=n.parent,l={from:s.from,to:s.to},h=0,c=null==a?void 0:a.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from<c.to){let t=Mh(c);return{start:l,end:t?{from:t.from,to:t.to}:void 0,matched:!0}}if(Wh(c.type,i,o))h++;else if(Wh(c.type,-i,o)){if(0==h){let t=Mh(c);return{start:l,end:t&&t.from<t.to?{from:t.from,to:t.to}:void 0,matched:!1}}h--}}}while(i<0?c.prevSibling():c.nextSibling());return{start:l,matched:!1}}function Eh(t,e,i,n=0,s=0){null==e&&-1==(e=t.search(/[^\s\u00a0]/))&&(e=t.length);let r=s;for(let s=n;s<e;s++)9==t.charCodeAt(s)?r+=i-r%i:r++;return r}class qh{constructor(t,e,i,n){this.string=t,this.tabSize=e,this.indentUnit=i,this.overrideIndent=n,this.pos=0,this.start=0,this.lastColumnPos=0,this.lastColumnValue=0}eol(){return this.pos>=this.string.length}sol(){return 0==this.pos}peek(){return this.string.charAt(this.pos)||void 0}next(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)}eat(t){let e,i=this.string.charAt(this.pos);if(e="string"==typeof t?i==t:i&&(t instanceof RegExp?t.test(i):t(i)),e)return++this.pos,i}eatWhile(t){let e=this.pos;for(;this.eat(t););return this.pos>e}eatSpace(){let t=this.pos;for(;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>t}skipToEnd(){this.pos=this.string.length}skipTo(t){let e=this.string.indexOf(t,this.pos);if(e>-1)return this.pos=e,!0}backUp(t){this.pos-=t}column(){return this.lastColumnPos<this.start&&(this.lastColumnValue=Eh(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue}indentation(){var t;return null!==(t=this.overrideIndent)&&void 0!==t?t:Eh(this.string,null,this.tabSize)}match(t,e,i){if("string"==typeof t){let n=t=>i?t.toLowerCase():t;return n(this.string.substr(this.pos,t.length))==n(t)?(!1!==e&&(this.pos+=t.length),!0):null}{let i=this.string.slice(this.pos).match(t);return i&&i.index>0?null:(i&&!1!==e&&(this.pos+=i[0].length),i)}}current(){return this.string.slice(this.start,this.pos)}}function _h(t){if("object"!=typeof t)return t;let e={};for(let i in t){let n=t[i];e[i]=n instanceof Array?n.slice():n}return e}const Vh=new WeakMap;class Ih extends al{constructor(t){let e,i=rl(t.languageData),n={name:(s=t).name||"",token:s.token,blankLine:s.blankLine||(()=>{}),startState:s.startState||(()=>!0),copyState:s.copyState||_h,indent:s.indent||(()=>null),languageData:s.languageData||{},tokenTable:s.tokenTable||Nh};var s;super(i,new class extends $a{createParse(t,i,n){return new Gh(e,t,i,n)}},[xl.of(((t,e)=>this.getIndent(t,e)))],t.name),this.topNode=function(t){let e=ea.define({id:Uh.length,name:"Document",props:[sl.add((()=>t))],top:!0});return Uh.push(e),e}(i),e=this,this.streamParser=n,this.stateAfter=new Jo({perNode:!0}),this.tokenTable=t.tokenTable?new tc(n.tokenTable):ec}static define(t){return new Ih(t)}getIndent(t,e){let i,n=cl(t.state),s=n.resolve(e);for(;s&&s.type!=this.topNode;)s=s.parent;if(!s)return null;let{overrideIndentation:r}=t.options;r&&(i=Vh.get(t.state),null!=i&&i<e-1e4&&(i=void 0));let o,a,l=zh(this,n,0,s.from,null!=i?i:e);if(l?(a=l.state,o=l.pos+1):(a=this.streamParser.startState(t.unit),o=0),e-o>1e4)return null;for(;o<e;){let i=t.state.doc.lineAt(o),n=Math.min(e,i.to);if(i.length){let e=r?r(i.from):-1,s=new qh(i.text,t.state.tabSize,t.unit,e<0?void 0:e);for(;s.pos<n-i.from;)Lh(this.streamParser.token,s,a)}else this.streamParser.blankLine(a,t.unit);if(n==e)break;o=i.to+1}let h=t.lineAt(e);return r&&null==i&&Vh.set(t.state,h.from),this.streamParser.indent(a,/^\s*(.*)/.exec(h.text)[1],t)}get allowsNesting(){return!1}}function zh(t,e,i,n,s){let r=i>=n&&i+e.length<=s&&e.prop(t.stateAfter);if(r)return{state:t.streamParser.copyState(r),pos:i+e.length};for(let r=e.children.length-1;r>=0;r--){let o=e.children[r],a=i+e.positions[r],l=o instanceof oa&&a<s&&zh(t,o,a,n,s);if(l)return l}return null}function Bh(t,e,i,n,s){if(s&&i<=0&&n>=e.length)return e;s||e.type!=t.topNode||(s=!0);for(let r=e.children.length-1;r>=0;r--){let o,a=e.positions[r],l=e.children[r];if(a<n&&l instanceof oa){if(!(o=Bh(t,l,i-a,n-a,s)))break;return s?new oa(e.type,e.children.slice(0,r).concat(o),e.positions.slice(0,r+1),a+o.length):o}}return null}let Gh=class{constructor(t,e,i,n){this.lang=t,this.input=e,this.fragments=i,this.ranges=n,this.stoppedAt=null,this.chunks=[],this.chunkPos=[],this.chunk=[],this.chunkReused=void 0,this.rangeIndex=0,this.to=n[n.length-1].to;let s=pl.get(),r=n[0].from,{state:o,tree:a}=function(t,e,i,n){for(let n of e){let e,s=n.from+(n.openStart?25:0),r=n.to-(n.openEnd?25:0),o=s<=i&&r>i&&zh(t,n.tree,0-n.offset,i,r);if(o&&(e=Bh(t,n.tree,i+n.offset,o.pos+n.offset,!1)))return{state:o.state,tree:e}}return{state:t.streamParser.startState(n?Ql(n):4),tree:oa.empty}}(t,i,r,null==s?void 0:s.state);this.state=o,this.parsedPos=this.chunkStart=r+a.length;for(let t=0;t<a.children.length;t++)this.chunks.push(a.children[t]),this.chunkPos.push(a.positions[t]);s&&this.parsedPos<s.viewport.from-1e5&&(this.state=this.lang.streamParser.startState(Ql(s.state)),s.skipUntilInView(this.parsedPos,s.viewport.from),this.parsedPos=s.viewport.from),this.moveRangeIndex()}advance(){let t=pl.get(),e=null==this.stoppedAt?this.to:Math.min(this.to,this.stoppedAt),i=Math.min(e,this.chunkStart+2048);for(t&&(i=Math.min(i,t.viewport.to));this.parsedPos<i;)this.parseLine(t);return this.chunkStart<this.parsedPos&&this.finishChunk(),this.parsedPos>=e?this.finish():t&&this.parsedPos>=t.viewport.to?(t.skipUntilInView(this.parsedPos,e),this.finish()):null}stopAt(t){this.stoppedAt=t}lineAfter(t){let e=this.input.chunk(t);if(this.input.lineChunks)"\n"==e&&(e="");else{let t=e.indexOf("\n");t>-1&&(e=e.slice(0,t))}return t+e.length<=this.to?e:e.slice(0,this.to-t)}nextLine(){let t=this.parsedPos,e=this.lineAfter(t),i=t+e.length;for(let t=this.rangeIndex;;){let n=this.ranges[t].to;if(n>=i)break;if(e=e.slice(0,n-(i-e.length)),t++,t==this.ranges.length)break;let s=this.ranges[t].from,r=this.lineAfter(s);e+=r,i=s+r.length}return{line:e,end:i}}skipGapsTo(t,e,i){for(;;){let n=this.ranges[this.rangeIndex].to,s=t+e;if(i>0?n>s:n>=s)break;e+=this.ranges[++this.rangeIndex].from-n}return e}moveRangeIndex(){for(;this.ranges[this.rangeIndex].to<this.parsedPos;)this.rangeIndex++}emitToken(t,e,i,n,s){if(this.ranges.length>1){e+=s=this.skipGapsTo(e,s,1);let t=this.chunk.length;i+=s=this.skipGapsTo(i,s,-1),n+=this.chunk.length-t}return this.chunk.push(t,e,i,n),s}parseLine(t){let{line:e,end:i}=this.nextLine(),n=0,{streamParser:s}=this.lang,r=new qh(e,t?t.state.tabSize:4,t?Ql(t.state):2);if(r.eol())s.blankLine(this.state,r.indentUnit);else for(;!r.eol();){let t=Lh(s.token,r,this.state);if(t&&(n=this.emitToken(this.lang.tokenTable.resolve(t),this.parsedPos+r.start,this.parsedPos+r.pos,4,n)),r.start>1e4)break}this.parsedPos=i,this.moveRangeIndex(),this.parsedPos<this.to&&this.parsedPos++}finishChunk(){let t=oa.build({buffer:this.chunk,start:this.chunkStart,length:this.parsedPos-this.chunkStart,nodeSet:Hh,topID:0,maxBufferLength:2048,reused:this.chunkReused});t=new oa(t.type,t.children,t.positions,t.length,[[this.lang.stateAfter,this.lang.streamParser.copyState(this.state)]]),this.chunks.push(t),this.chunkPos.push(this.chunkStart-this.ranges[0].from),this.chunk=[],this.chunkReused=void 0,this.chunkStart=this.parsedPos}finish(){return new oa(this.lang.topNode,this.chunks,this.chunkPos,this.parsedPos-this.ranges[0].from).balance()}};function Lh(t,e,i){e.start=e.pos;for(let n=0;n<10;n++){let n=t(e,i);if(e.pos>e.start)return n}throw new Error("Stream parser failed to advance stream.")}const Nh=Object.create(null),Uh=[ea.none],Hh=new ia(Uh),Fh=[],Jh=Object.create(null),Kh=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])Kh[t]=nc(Nh,e);class tc{constructor(t){this.extra=t,this.table=Object.assign(Object.create(null),Kh)}resolve(t){return t?this.table[t]||(this.table[t]=nc(this.extra,t)):0}}const ec=new tc(Nh);function ic(t,e){Fh.indexOf(t)>-1||(Fh.push(t),console.warn(e))}function nc(t,e){let i=[];for(let n of e.split(" ")){let e=[];for(let i of n.split(".")){let n=t[i]||tl[i];n?"function"==typeof n?e.length?e=e.map(n):ic(i,`Modifier ${i} used at start of tag`):e.length?ic(i,`Tag ${i} used as modifier`):e=Array.isArray(n)?n:[n]:ic(i,`Unknown highlighting tag ${i}`)}for(let t of e)i.push(t)}if(!i.length)return 0;let n=e.replace(/ /g,"_"),s=n+" "+i.map((t=>t.id)),r=Jh[s];if(r)return r.id;let o=Jh[s]=ea.define({id:Uh.length,name:n,props:[Ra({[n]:i})]});return Uh.push(o),o.id}function sc(t){return t.length<=4096&&/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/.test(t)}function rc(t){for(let e=t.iter();!e.next().done;)if(sc(e.value))return!0;return!1}const oc=j.define({combine:t=>t.some((t=>t))});const ac=Ni.fromClass(class{constructor(t){this.always=t.state.facet(oc)||t.textDirection!=di.LTR||t.state.facet(Gs.perLineTextDirection),this.hasRTL=!this.always&&rc(t.state.doc),this.tree=cl(t.state),this.decorations=this.always||this.hasRTL?lc(t,this.tree,this.always):si.none}update(t){let e=t.state.facet(oc)||t.view.textDirection!=di.LTR||t.state.facet(Gs.perLineTextDirection);if(e||this.hasRTL||!function(t){let e=!1;return t.iterChanges(((t,i,n,s,r)=>{!e&&rc(r)&&(e=!0)})),e}(t.changes)||(this.hasRTL=!0),!e&&!this.hasRTL)return;let i=cl(t.state);(e!=this.always||i!=this.tree||t.docChanged||t.viewportChanged)&&(this.tree=i,this.always=e,this.decorations=lc(t.view,i,e))}},{provide:t=>{function e(e){var i,n;return null!==(n=null===(i=e.plugin(t))||void 0===i?void 0:i.decorations)&&void 0!==n?n:si.none}return[Gs.outerDecorations.of(e),H.lowest(Gs.bidiIsolatedRanges.of(e))]}});function lc(t,e,i){let n=new Rt,s=t.visibleRanges;i||(s=function(t,e){let i=e.iter(),n=0,s=[],r=null;for(let{from:e,to:o}of t)for(e!=n&&(n<e&&i.next(e-n),n=e);;){let t=n,e=n+i.value.length;if(!i.lineBreak&&sc(i.value)&&(r&&r.to>t-10?r.to=Math.min(o,e):s.push(r={from:t,to:Math.min(o,e)})),n>=o)break;n=e,i.next()}return s}(s,t.state.doc));for(let{from:t,to:i}of s)e.iterate({enter:t=>{let e=t.type.prop(Jo.isolate);e&&n.add(t.from,t.to,hc[e])},from:t,to:i});return n.finish()}const hc={rtl:si.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:di.RTL}),ltr:si.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:di.LTR}),auto:si.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var cc=Object.freeze({__proto__:null,DocInput:ul,HighlightStyle:gh,IndentContext:Zl,LRLanguage:hl,Language:al,LanguageDescription:Sl,LanguageSupport:yl,ParseContext:pl,StreamLanguage:Ih,StringStream:qh,TreeIndentContext:Xl,bidiIsolates:function(t={}){let e=[ac];return t.alwaysIsolate&&e.push(oc.of(!0)),e},bracketMatching:Xh,bracketMatchingHandle:Yh,codeFolding:lh,continuedIndent:Dl,defaultHighlightStyle:xh,defineLanguageFacet:rl,delimitedIndent:Wl,ensureSyntaxTree:fl,flatIndent:jl,foldAll:ih,foldCode:Kl,foldEffect:Gl,foldGutter:ph,foldInside:Vl,foldKeymap:rh,foldNodeProp:_l,foldService:ql,foldState:Ul,foldable:zl,foldedRanges:function(t){return t.field(Ul,!1)||At.empty},forceParsing:function(t,e=t.viewport.to,i=100){let n=fl(t.state,e,i);return n!=cl(t.state)&&t.dispatch({}),!!n},getIndentUnit:Ql,getIndentation:Pl,highlightingFor:function(t,e,i){let n=vh(t),s=null;if(n)for(let t of n)if(!t.scope||i&&t.scope(i)){let i=t.style(e);i&&(s=s?s+" "+i:i)}return s},indentNodeProp:Cl,indentOnInput:El,indentRange:function(t,e,i){let n=Object.create(null),s=new Zl(t,{overrideIndentation:t=>{var e;return null!==(e=n[t])&&void 0!==e?e:-1}}),r=[];for(let o=e;o<=i;){let e=t.doc.lineAt(o);o=e.to+1;let i=Pl(s,e.from);if(null==i)continue;/\S/.test(e.text)||(i=0);let a=/^\s*/.exec(e.text)[0],l=$l(t,i);a!=l&&(n[e.from]=i,r.push({from:e.from,to:e.from+a.length,insert:l}))}return t.changes(r)},indentService:xl,indentString:$l,indentUnit:kl,language:bl,languageDataProp:sl,matchBrackets:jh,sublanguageProp:ol,syntaxHighlighting:bh,syntaxParserRunning:function(t){var e;return(null===(e=t.plugin(vl))||void 0===e?void 0:e.isWorking())||!1},syntaxTree:cl,syntaxTreeAvailable:function(t,e=t.doc.length){var i;return(null===(i=t.field(al.state,!1))||void 0===i?void 0:i.context.isDone(e))||!1},toggleFold:t=>{let e=[];for(let i of Nl(t)){let n=Hl(t.state,i.from,i.to);if(n)e.push(Ll.of(n),eh(t,n,!1));else{let n=sh(t,i);n&&e.push(Gl.of(n),eh(t,n))}}return e.length>0&&t.dispatch({effects:Jl(t.state,e)}),!!e.length},unfoldAll:nh,unfoldCode:th,unfoldEffect:Ll});function fc(t,e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=t(e,i);return!!s&&(n(i.update(s)),!0)}}const uc=fc(wc,0),dc=fc(mc,0),pc=fc(((t,e)=>mc(t,e,function(t){let e=[];for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),s=i.to<=n.to?n:t.doc.lineAt(i.to),r=e.length-1;r>=0&&e[r].to>n.from?e[r].to=s.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return e}(e))),0);function Oc(t,e){let i=t.languageDataAt("commentTokens",e);return i.length?i[0]:{}}const gc=50;function mc(t,e,i=e.selection.ranges){let n=i.map((t=>Oc(e,t.from).block));if(!n.every((t=>t)))return null;let s=i.map(((t,i)=>function(t,{open:e,close:i},n,s){let r,o,a=t.sliceDoc(n-gc,n),l=t.sliceDoc(s,s+gc),h=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(l)[0].length,f=a.length-h;if(a.slice(f-e.length,f)==e&&l.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*gc?r=o=t.sliceDoc(n,s):(r=t.sliceDoc(n,n+gc),o=t.sliceDoc(s-gc,s));let u=/^\s*/.exec(r)[0].length,d=/\s*$/.exec(o)[0].length,p=o.length-d-i.length;return r.slice(u,u+e.length)==e&&o.slice(p,p+i.length)==i?{open:{pos:n+u+e.length,margin:/\s/.test(r.charAt(u+e.length))?1:0},close:{pos:s-d-i.length,margin:/\s/.test(o.charAt(p-1))?1:0}}:null}(e,n[i],t.from,t.to)));if(2!=t&&!s.every((t=>t)))return{changes:e.changes(i.map(((t,e)=>s[e]?[]:[{from:t.from,insert:n[e].open+" "},{from:t.to,insert:" "+n[e].close}])))};if(1!=t&&s.some((t=>t))){let t=[];for(let e,i=0;i<s.length;i++)if(e=s[i]){let s=n[i],{open:r,close:o}=e;t.push({from:r.pos-s.open.length,to:r.pos+r.margin},{from:o.pos-o.margin,to:o.pos+s.close.length})}return{changes:t}}return null}function wc(t,e,i=e.selection.ranges){let n=[],s=-1;for(let{from:t,to:r}of i){let i=n.length,o=1e9,a=Oc(e,t).line;if(a){for(let i=t;i<=r;){let l=e.doc.lineAt(i);if(l.from>s&&(t==r||r>l.from)){s=l.from;let t=/^\s*/.exec(l.text)[0].length,e=t==l.length,i=l.text.slice(t,t+a.length)==a?t:-1;t<l.text.length&&t<o&&(o=t),n.push({line:l,comment:i,token:a,indent:t,empty:e,single:!1})}i=l.to+1}if(o<1e9)for(let t=i;t<n.length;t++)n[t].indent<n[t].line.text.length&&(n[t].indent=o);n.length==i+1&&(n[i].single=!0)}}if(2!=t&&n.some((t=>t.comment<0&&(!t.empty||t.single)))){let t=[];for(let{line:e,token:i,indent:s,empty:r,single:o}of n)!o&&r||t.push({from:e.from+s,insert:i+" "});let i=e.changes(t);return{changes:i,selection:e.selection.map(i,1)}}if(1!=t&&n.some((t=>t.comment>=0))){let t=[];for(let{line:e,comment:i,token:s}of n)if(i>=0){let n=e.from+i,r=n+s.length;" "==e.text[r-e.from]&&r++,t.push({from:n,to:r})}return{changes:t}}return null}const vc=ct.define(),bc=ct.define(),yc=j.define(),Sc=j.define({combine:t=>$t(t,{minDepth:100,newGroupDelay:500,joinToEvent:(t,e)=>e},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(t,e)=>(i,n)=>t(i,n)||e(i,n)})}),xc=z.define({create:()=>qc.empty,update(t,e){let i=e.state.facet(Sc),n=e.annotation(vc);if(n){let s=Tc.fromTransaction(e,n.selection),r=n.side,o=0==r?t.undone:t.done;return o=s?Ac(o,o.length,i.minDepth,s):Wc(o,e.startState.selection),new qc(0==r?n.rest:o,0==r?o:n.rest)}let s=e.annotation(bc);if("full"!=s&&"before"!=s||(t=t.isolate()),!1===e.annotation(pt.addToHistory))return e.changes.empty?t:t.addMapping(e.changes.desc);let r=Tc.fromTransaction(e),o=e.annotation(pt.time),a=e.annotation(pt.userEvent);return r?t=t.addChanges(r,o,a,i,e):e.selection&&(t=t.addSelection(e.startState.selection,o,a,i.newGroupDelay)),"full"!=s&&"after"!=s||(t=t.isolate()),t},toJSON:t=>({done:t.done.map((t=>t.toJSON())),undone:t.undone.map((t=>t.toJSON()))}),fromJSON:t=>new qc(t.done.map(Tc.fromJSON),t.undone.map(Tc.fromJSON))});function kc(t={}){return[xc,Sc.of(t),Gs.domEventHandlers({beforeinput(t,e){let i="historyUndo"==t.inputType?$c:"historyRedo"==t.inputType?Pc:null;return!!i&&(t.preventDefault(),i(e))}})]}function Qc(t,e){return function({state:i,dispatch:n}){if(!e&&i.readOnly)return!1;let s=i.field(xc,!1);if(!s)return!1;let r=s.pop(t,i,e);return!!r&&(n(r),!0)}}const $c=Qc(0,!1),Pc=Qc(1,!1),Zc=Qc(0,!0),Cc=Qc(1,!0);class Tc{constructor(t,e,i,n,s){this.changes=t,this.effects=e,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(t){return new Tc(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){var t,e,i;return{changes:null===(t=this.changes)||void 0===t?void 0:t.toJSON(),mapped:null===(e=this.mapped)||void 0===e?void 0:e.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((t=>t.toJSON()))}}static fromJSON(t){return new Tc(t.changes&&$.fromJSON(t.changes),[],t.mapped&&Q.fromJSON(t.mapped),t.startSelection&&Y.fromJSON(t.startSelection),t.selectionsAfter.map(Y.fromJSON))}static fromTransaction(t,e){let i=Xc;for(let e of t.startState.facet(yc)){let n=e(t);n.length&&(i=i.concat(n))}return!i.length&&t.changes.empty?null:new Tc(t.changes.invert(t.startState.doc),i,void 0,e||t.startState.selection,Xc)}static selection(t){return new Tc(void 0,Xc,void 0,void 0,t)}}function Ac(t,e,i,n){let s=e+1>i+20?e-i-1:0,r=t.slice(s,e);return r.push(n),r}function Rc(t,e){return t.length?e.length?t.concat(e):t:e}const Xc=[],Yc=200;function Wc(t,e){if(t.length){let i=t[t.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Yc));return n.length&&n[n.length-1].eq(e)?t:(n.push(e),Ac(t,t.length-1,1e9,i.setSelAfter(n)))}return[Tc.selection([e])]}function Mc(t){let e=t[t.length-1],i=t.slice();return i[t.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),i}function jc(t,e){if(!t.length)return t;let i=t.length,n=Xc;for(;i;){let s=Dc(t[i-1],e,n);if(s.changes&&!s.changes.empty||s.effects.length){let e=t.slice(0,i);return e[i-1]=s,e}e=s.mapped,i--,n=s.selectionsAfter}return n.length?[Tc.selection(n)]:Xc}function Dc(t,e,i){let n=Rc(t.selectionsAfter.length?t.selectionsAfter.map((t=>t.map(e))):Xc,i);if(!t.changes)return Tc.selection(n);let s=t.changes.map(e),r=e.mapDesc(t.changes,!0),o=t.mapped?t.mapped.composeDesc(r):r;return new Tc(s,dt.mapEffects(t.effects,e),o,t.startSelection.map(r),n)}const Ec=/^(input\.type|delete)($|\.)/;class qc{constructor(t,e,i=0,n=void 0){this.done=t,this.undone=e,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new qc(this.done,this.undone):this}addChanges(t,e,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&t.changes&&(!i||Ec.test(i))&&(!o.selectionsAfter.length&&e-this.prevTime<n.newGroupDelay&&n.joinToEvent(s,function(t,e){let i=[],n=!1;return t.iterChangedRanges(((t,e)=>i.push(t,e))),e.iterChangedRanges(((t,e,s,r)=>{for(let t=0;t<i.length;){let e=i[t++],o=i[t++];r>=e&&s<=o&&(n=!0)}})),n}(o.changes,t.changes))||"input.type.compose"==i)?Ac(r,r.length-1,n.minDepth,new Tc(t.changes.compose(o.changes),Rc(t.effects,o.effects),o.mapped,o.startSelection,Xc)):Ac(r,r.length,n.minDepth,t),new qc(r,Xc,e,i)}addSelection(t,e,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:Xc;return s.length>0&&e-this.prevTime<n&&i==this.prevUserEvent&&i&&/^select($|\.)/.test(i)&&(r=s[s.length-1],o=t,r.ranges.length==o.ranges.length&&0===r.ranges.filter(((t,e)=>t.empty!=o.ranges[e].empty)).length)?this:new qc(Wc(this.done,t),this.undone,e,i);var r,o}addMapping(t){return new qc(jc(this.done,t),jc(this.undone,t),this.prevTime,this.prevUserEvent)}pop(t,e,i){let n=0==t?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1],r=s.selectionsAfter[0]||e.selection;if(i&&s.selectionsAfter.length)return e.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:vc.of({side:t,rest:Mc(n),selection:r}),userEvent:0==t?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?Xc:n.slice(0,n.length-1);return s.mapped&&(i=jc(i,s.mapped)),e.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:vc.of({side:t,rest:i,selection:r}),filter:!1,userEvent:0==t?"undo":"redo",scrollIntoView:!0})}return null}}qc.empty=new qc(Xc,Xc);const _c=[{key:"Mod-z",run:$c,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:Pc,preventDefault:!0},{linux:"Ctrl-Shift-z",run:Pc,preventDefault:!0},{key:"Mod-u",run:Zc,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:Cc,preventDefault:!0}];function Vc(t,e){return Y.create(t.ranges.map(e),t.mainIndex)}function Ic(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function zc({state:t,dispatch:e},i){let n=Vc(t.selection,i);return!n.eq(t.selection,!0)&&(e(Ic(t,n)),!0)}function Bc(t,e){return Y.cursor(e?t.to:t.from)}function Gc(t,e){return zc(t,(i=>i.empty?t.moveByChar(i,e):Bc(i,e)))}function Lc(t){return t.textDirectionAt(t.state.selection.main.head)==di.LTR}const Nc=t=>Gc(t,!Lc(t)),Uc=t=>Gc(t,Lc(t));function Hc(t,e){return zc(t,(i=>i.empty?t.moveByGroup(i,e):Bc(i,e)))}function Fc(t,e,i){if(e.type.prop(i))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function Jc(t,e,i){let n,s,r=cl(t).resolveInner(e.head),o=i?Jo.closedBy:Jo.openedBy;for(let n=e.head;;){let e=i?r.childAfter(n):r.childBefore(n);if(!e)break;Fc(t,e,o)?r=e:n=i?e.to:e.from}return s=r.type.prop(o)&&(n=i?jh(t,r.from,1):jh(t,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,Y.cursor(s,i?-1:1)}function Kc(t,e){return zc(t,(i=>{if(!i.empty)return Bc(i,e);let n=t.moveVertically(i,e);return n.head!=i.head?n:t.moveToLineBoundary(i,e)}))}const tf=t=>Kc(t,!1),ef=t=>Kc(t,!0);function nf(t){let e,i=t.scrollDOM.clientHeight<t.scrollDOM.scrollHeight-2,n=0,s=0;if(i){for(let e of t.state.facet(Gs.scrollMargins)){let i=e(t);(null==i?void 0:i.top)&&(n=Math.max(null==i?void 0:i.top,n)),(null==i?void 0:i.bottom)&&(s=Math.max(null==i?void 0:i.bottom,s))}e=t.scrollDOM.clientHeight-n-s}else e=(t.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:n,marginBottom:s,selfScroll:i,height:Math.max(t.defaultLineHeight,e-5)}}function sf(t,e){let i,n=nf(t),{state:s}=t,r=Vc(s.selection,(i=>i.empty?t.moveVertically(i,e,n.height):Bc(i,e)));if(r.eq(s.selection))return!1;if(n.selfScroll){let e=t.coordsAtPos(s.selection.main.head),o=t.scrollDOM.getBoundingClientRect(),a=o.top+n.marginTop,l=o.bottom-n.marginBottom;e&&e.top>a&&e.bottom<l&&(i=Gs.scrollIntoView(r.main.head,{y:"start",yMargin:e.top-a}))}return t.dispatch(Ic(s,r),{effects:i}),!0}const rf=t=>sf(t,!1),of=t=>sf(t,!0);function af(t,e,i){let n=t.lineBlockAt(e.head),s=t.moveToLineBoundary(e,i);if(s.head==e.head&&s.head!=(i?n.to:n.from)&&(s=t.moveToLineBoundary(e,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(t.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&e.head!=n.from+i&&(s=Y.cursor(n.from+i))}return s}function lf(t,e){let i=Vc(t.state.selection,(t=>{let i=e(t);return Y.range(t.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(t.state.selection)&&(t.dispatch(Ic(t.state,i)),!0)}function hf(t,e){return lf(t,(i=>t.moveByChar(i,e)))}const cf=t=>hf(t,!Lc(t)),ff=t=>hf(t,Lc(t));function uf(t,e){return lf(t,(i=>t.moveByGroup(i,e)))}function df(t,e){return lf(t,(i=>t.moveVertically(i,e)))}const pf=t=>df(t,!1),Of=t=>df(t,!0);function gf(t,e){return lf(t,(i=>t.moveVertically(i,e,nf(t).height)))}const mf=t=>gf(t,!1),wf=t=>gf(t,!0),vf=({state:t,dispatch:e})=>(e(Ic(t,{anchor:0})),!0),bf=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.doc.length})),!0),yf=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:0})),!0),Sf=({state:t,dispatch:e})=>(e(Ic(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0);function xf(t,e){if(t.state.readOnly)return!1;let i="delete.selection",{state:n}=t,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=e(n);o<s?(i="delete.backward",o=kf(t,o,!1)):o>s&&(i="delete.forward",o=kf(t,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=kf(t,s,!1),r=kf(t,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:Y.cursor(s,s<n.head?-1:1)}}));return!s.changes.empty&&(t.dispatch(n.update(s,{scrollIntoView:!0,userEvent:i,effects:"delete.selection"==i?Gs.announce.of(n.phrase("Selection deleted")):void 0})),!0)}function kf(t,e,i){if(t instanceof Gs)for(let n of t.state.facet(Gs.atomicRanges).map((e=>e(t))))n.between(e,e,((t,n)=>{t<e&&n>e&&(e=i?n:t)}));return e}const Qf=(t,e)=>xf(t,(i=>{let n,s,r=i.from,{state:o}=t,a=o.doc.lineAt(r);if(!e&&r>a.from&&r<a.from+200&&!/[^ \t]/.test(n=a.text.slice(0,r-a.from))){if("\t"==n[n.length-1])return r-1;let t=It(n,o.tabSize)%Ql(o)||Ql(o);for(let e=0;e<t&&" "==n[n.length-1-e];e++)r--;s=r}else s=O(a.text,r-a.from,e,e)+a.from,s==r&&a.number!=(e?o.doc.lines:1)?s+=e?1:-1:!e&&/[\ufe00-\ufe0f]/.test(a.text.slice(s-a.from,r-a.from))&&(s=O(a.text,s-a.from,!1,!1)+a.from);return s})),$f=t=>Qf(t,!1),Pf=t=>Qf(t,!0),Zf=(t,e)=>xf(t,(i=>{let n=i.head,{state:s}=t,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let t=null;;){if(n==(e?r.to:r.from)){n==i.head&&r.number!=(e?s.doc.lines:1)&&(n+=e?1:-1);break}let a=O(r.text,n-r.from,e)+r.from,l=r.text.slice(Math.min(n,a)-r.from,Math.max(n,a)-r.from),h=o(l);if(null!=t&&h!=t)break;" "==l&&n==i.head||(t=h),n=a}return n})),Cf=t=>Zf(t,!1);function Tf(t){let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.from),r=t.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=t.doc.lineAt(n.to-1)),i>=s.number){let t=e[e.length-1];t.to=r.to,t.ranges.push(n)}else e.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return e}function Af(t,e,i){if(t.readOnly)return!1;let n=[],s=[];for(let e of Tf(t)){if(i?e.to==t.doc.length:0==e.from)continue;let r=t.doc.lineAt(i?e.to+1:e.from-1),o=r.length+1;if(i){n.push({from:e.to,to:r.to},{from:e.from,insert:r.text+t.lineBreak});for(let i of e.ranges)s.push(Y.range(Math.min(t.doc.length,i.anchor+o),Math.min(t.doc.length,i.head+o)))}else{n.push({from:r.from,to:e.from},{from:e.to,insert:t.lineBreak+r.text});for(let t of e.ranges)s.push(Y.range(t.anchor-o,t.head-o))}}return!!n.length&&(e(t.update({changes:n,scrollIntoView:!0,selection:Y.create(s,t.selection.mainIndex),userEvent:"move.line"})),!0)}function Rf(t,e,i){if(t.readOnly)return!1;let n=[];for(let e of Tf(t))i?n.push({from:e.from,insert:t.doc.slice(e.from,e.to)+t.lineBreak}):n.push({from:e.to,insert:t.lineBreak+t.doc.slice(e.from,e.to)});return e(t.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Xf=Yf(!1);function Yf(t){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),a=!t&&s==r&&function(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let i,n=cl(t).resolveInner(e),s=n.childBefore(e),r=n.childAfter(e);return s&&r&&s.to<=e&&r.from>=e&&(i=s.type.prop(Jo.closedBy))&&i.indexOf(r.name)>-1&&t.doc.lineAt(s.to).from==t.doc.lineAt(r.from).from&&!/\S/.test(t.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);t&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let l=new Zl(i,{simulateBreak:s,simulateDoubleBreak:!!a}),h=Pl(l,s);for(null==h&&(h=It(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));r<o.to&&/\s/.test(o.text[r-o.from]);)r++;a?({from:s,to:r}=a):s>o.from&&s<o.from+100&&!/\S/.test(o.text.slice(0,s))&&(s=o.from);let c=["",$l(i,h)];return a&&c.push($l(i,l.lineIndent(o.from,-1))),{changes:{from:s,to:r,insert:e.of(c)},range:Y.cursor(s+1+c[1].length)}}));return n(i.update(s,{scrollIntoView:!0,userEvent:"input"})),!0}}function Wf(t,e){let i=-1;return t.changeByRange((n=>{let s=[];for(let r=n.from;r<=n.to;){let o=t.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(e(o,s,n),i=o.number),r=o.to+1}let r=t.changes(s);return{changes:s,range:Y.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Mf=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:t=>zc(t,(e=>Jc(t.state,e,!Lc(t)))),shift:t=>lf(t,(e=>Jc(t.state,e,!Lc(t))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:t=>zc(t,(e=>Jc(t.state,e,Lc(t)))),shift:t=>lf(t,(e=>Jc(t.state,e,Lc(t))))},{key:"Alt-ArrowUp",run:({state:t,dispatch:e})=>Af(t,e,!1)},{key:"Shift-Alt-ArrowUp",run:({state:t,dispatch:e})=>Rf(t,e,!1)},{key:"Alt-ArrowDown",run:({state:t,dispatch:e})=>Af(t,e,!0)},{key:"Shift-Alt-ArrowDown",run:({state:t,dispatch:e})=>Rf(t,e,!0)},{key:"Escape",run:({state:t,dispatch:e})=>{let i=t.selection,n=null;return i.ranges.length>1?n=Y.create([i.main]):i.main.empty||(n=Y.create([Y.cursor(i.main.head)])),!!n&&(e(Ic(t,n)),!0)}},{key:"Mod-Enter",run:Yf(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:t,dispatch:e})=>{let i=Tf(t).map((({from:e,to:i})=>Y.range(e,Math.min(i+1,t.doc.length))));return e(t.update({selection:Y.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:t,dispatch:e})=>{let i=Vc(t.selection,(e=>{var i;for(let n=cl(t).resolveStack(e.from,1);n;n=n.next){let{node:t}=n;if((t.from<e.from&&t.to>=e.to||t.to>e.to&&t.from<=e.from)&&(null===(i=t.parent)||void 0===i?void 0:i.parent))return Y.range(t.to,t.from)}return e}));return e(Ic(t,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Wf(t,((e,i)=>{let n=/^\s*/.exec(e.text)[0];if(!n)return;let s=It(n,t.tabSize),r=0,o=$l(t,Math.max(0,s-Ql(t)));for(;r<n.length&&r<o.length&&n.charCodeAt(r)==o.charCodeAt(r);)r++;i.push({from:e.from+r,to:e.from+n.length,insert:o.slice(r)})})),{userEvent:"delete.dedent"})),!0)},{key:"Mod-]",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Wf(t,((e,i)=>{i.push({from:e.from,insert:t.facet(kl)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Object.create(null),n=new Zl(t,{overrideIndentation:t=>{let e=i[t];return null==e?-1:e}}),s=Wf(t,((e,s,r)=>{let o=Pl(n,e.from);if(null==o)return;/\S/.test(e.text)||(o=0);let a=/^\s*/.exec(e.text)[0],l=$l(t,o);(a!=l||r.from<e.from+a.length)&&(i[e.from]=o,s.push({from:e.from,to:e.from+a.length,insert:l}))}));return s.changes.empty||e(t.update(s,{userEvent:"indent"})),!0}},{key:"Shift-Mod-k",run:t=>{if(t.state.readOnly)return!1;let{state:e}=t,i=e.changes(Tf(e).map((({from:t,to:i})=>(t>0?t--:i<e.doc.length&&i++,{from:t,to:i})))),n=Vc(e.selection,(e=>t.moveVertically(e,!0))).map(i);return t.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:t,dispatch:e})=>function(t,e,i){let n=!1,s=Vc(t.selection,(e=>{let s=jh(t,e.head,-1)||jh(t,e.head,1)||e.head>0&&jh(t,e.head-1,1)||e.head<t.doc.length&&jh(t,e.head+1,-1);if(!s||!s.end)return e;n=!0;let r=s.start.from==e.head?s.end.to:s.end.from;return i?Y.range(e.anchor,r):Y.cursor(r)}));return!!n&&(e(Ic(t,s)),!0)}(t,e,!1)},{key:"Mod-/",run:t=>{let{state:e}=t,i=e.doc.lineAt(e.selection.main.from),n=Oc(t.state,i.from);return n.line?uc(t):!!n.block&&pc(t)}},{key:"Alt-A",run:dc}].concat([{key:"ArrowLeft",run:Nc,shift:cf,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:t=>Hc(t,!Lc(t)),shift:t=>uf(t,!Lc(t)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:t=>zc(t,(e=>af(t,e,!Lc(t)))),shift:t=>lf(t,(e=>af(t,e,!Lc(t)))),preventDefault:!0},{key:"ArrowRight",run:Uc,shift:ff,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:t=>Hc(t,Lc(t)),shift:t=>uf(t,Lc(t)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:t=>zc(t,(e=>af(t,e,Lc(t)))),shift:t=>lf(t,(e=>af(t,e,Lc(t)))),preventDefault:!0},{key:"ArrowUp",run:tf,shift:pf,preventDefault:!0},{mac:"Cmd-ArrowUp",run:vf,shift:yf},{mac:"Ctrl-ArrowUp",run:rf,shift:mf},{key:"ArrowDown",run:ef,shift:Of,preventDefault:!0},{mac:"Cmd-ArrowDown",run:bf,shift:Sf},{mac:"Ctrl-ArrowDown",run:of,shift:wf},{key:"PageUp",run:rf,shift:mf},{key:"PageDown",run:of,shift:wf},{key:"Home",run:t=>zc(t,(e=>af(t,e,!1))),shift:t=>lf(t,(e=>af(t,e,!1))),preventDefault:!0},{key:"Mod-Home",run:vf,shift:yf},{key:"End",run:t=>zc(t,(e=>af(t,e,!0))),shift:t=>lf(t,(e=>af(t,e,!0))),preventDefault:!0},{key:"Mod-End",run:bf,shift:Sf},{key:"Enter",run:Xf},{key:"Mod-a",run:({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:$f,shift:$f},{key:"Delete",run:Pf},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Cf},{key:"Mod-Delete",mac:"Alt-Delete",run:t=>Zf(t,!0)},{mac:"Mod-Backspace",run:t=>xf(t,(e=>{let i=t.moveToLineBoundary(e,!1).head;return e.head>i?i:Math.max(0,e.head-1)}))},{mac:"Mod-Delete",run:t=>xf(t,(e=>{let i=t.moveToLineBoundary(e,!0).head;return e.head<i?i:Math.min(t.state.doc.length,e.head+1)}))}].concat([{key:"Ctrl-b",run:Nc,shift:cf,preventDefault:!0},{key:"Ctrl-f",run:Uc,shift:ff},{key:"Ctrl-p",run:tf,shift:pf},{key:"Ctrl-n",run:ef,shift:Of},{key:"Ctrl-a",run:t=>zc(t,(e=>Y.cursor(t.lineBlockAt(e.head).from,1))),shift:t=>lf(t,(e=>Y.cursor(t.lineBlockAt(e.head).from)))},{key:"Ctrl-e",run:t=>zc(t,(e=>Y.cursor(t.lineBlockAt(e.head).to,-1))),shift:t=>lf(t,(e=>Y.cursor(t.lineBlockAt(e.head).to)))},{key:"Ctrl-d",run:Pf},{key:"Ctrl-h",run:$f},{key:"Ctrl-k",run:t=>xf(t,(e=>{let i=t.lineBlockAt(e.head).to;return e.head<i?i:Math.min(t.state.doc.length,e.head+1)}))},{key:"Ctrl-Alt-h",run:Cf},{key:"Ctrl-o",run:({state:t,dispatch:i})=>{if(t.readOnly)return!1;let n=t.changeByRange((t=>({changes:{from:t.from,to:t.to,insert:e.of(["",""])},range:Y.cursor(t.from)})));return i(t.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=t.changeByRange((e=>{if(!e.empty||0==e.from||e.from==t.doc.length)return{range:e};let i=e.from,n=t.doc.lineAt(i),s=i==n.from?i-1:O(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:O(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:t.doc.slice(i,r).append(t.doc.slice(s,i))},range:Y.cursor(r)}}));return!i.changes.empty&&(e(t.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:of}].map((t=>({mac:t.key,run:t.run,shift:t.shift})))));function jf(){var t=arguments[0];"string"==typeof t&&(t=document.createElement(t));var e=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?t.setAttribute(n,s):null!=s&&(t[n]=s)}e++}for(;e<arguments.length;e++)Df(t,arguments[e]);return t}function Df(t,e){if("string"==typeof e)t.appendChild(document.createTextNode(e));else if(null==e);else if(null!=e.nodeType)t.appendChild(e);else{if(!Array.isArray(e))throw new RangeError("Unsupported child node: "+e);for(var i=0;i<e.length;i++)Df(t,e[i])}}const Ef="function"==typeof String.prototype.normalize?t=>t.normalize("NFKD"):t=>t;class qf{constructor(t,e,i=0,n=t.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=t.iterRange(i,n),this.bufferStart=i,this.normalize=s?t=>s(Ef(t)):Ef,this.query=this.normalize(e)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return b(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let t=this.peek();if(t<0)return this.done=!0,this;let e=y(t),i=this.bufferStart+this.bufferPos;this.bufferPos+=S(t);let n=this.normalize(e);for(let t=0,s=i;;t++){let r=n.charCodeAt(t),o=this.match(r,s);if(t==n.length-1){if(o)return this.value=o,this;break}s==i&&t<e.length&&e.charCodeAt(t)==r&&s++}}}match(t,e){let i=null;for(let n=0;n<this.matches.length;n+=2){let s=this.matches[n],r=!1;this.query.charCodeAt(s)==t&&(s==this.query.length-1?i={from:this.matches[n+1],to:e+1}:(this.matches[n]++,r=!0)),r||(this.matches.splice(n,2),n-=2)}return this.query.charCodeAt(0)==t&&(1==this.query.length?i={from:e,to:e+1}:this.matches.push(1,e)),i&&this.test&&!this.test(i.from,i.to,this.buffer,this.bufferStart)&&(i=null),i}}"undefined"!=typeof Symbol&&(qf.prototype[Symbol.iterator]=function(){return this});const _f={from:-1,to:-1,match:/.*/.exec("")},Vf="gm"+(null==/x/.unicode?"":"u");class If{constructor(t,e,i,n=0,s=t.length){if(this.text=t,this.to=s,this.curLine="",this.done=!1,this.value=_f,/\\[sWDnr]|\n|\r|\[\^/.test(e))return new Gf(t,e,i,n,s);this.re=new RegExp(e,Vf+((null==i?void 0:i.ignoreCase)?"i":"")),this.test=null==i?void 0:i.test,this.iter=t.iter();let r=t.lineAt(n);this.curLineStart=r.from,this.matchPos=Lf(t,n),this.getLine(this.curLineStart)}getLine(t){this.iter.next(t),this.iter.lineBreak?this.curLine="":(this.curLine=this.iter.value,this.curLineStart+this.curLine.length>this.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let t=this.matchPos-this.curLineStart;;){this.re.lastIndex=t;let e=this.matchPos<=this.to&&this.re.exec(this.curLine);if(e){let i=this.curLineStart+e.index,n=i+e[0].length;if(this.matchPos=Lf(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(i<n||i>this.value.to)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this;t=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length<this.to))return this.done=!0,this;this.nextLine(),t=0}}}}const zf=new WeakMap;class Bf{constructor(t,e){this.from=t,this.text=e}get to(){return this.from+this.text.length}static get(t,e,i){let n=zf.get(t);if(!n||n.from>=i||n.to<=e){let n=new Bf(e,t.sliceString(e,i));return zf.set(t,n),n}if(n.from==e&&n.to==i)return n;let{text:s,from:r}=n;return r>e&&(s=t.sliceString(e,r)+s,r=e),n.to<i&&(s+=t.sliceString(n.to,i)),zf.set(t,new Bf(r,s)),new Bf(e,s.slice(e-r,i-r))}}class Gf{constructor(t,e,i,n,s){this.text=t,this.to=s,this.done=!1,this.value=_f,this.matchPos=Lf(t,n),this.re=new RegExp(e,Vf+((null==i?void 0:i.ignoreCase)?"i":"")),this.test=null==i?void 0:i.test,this.flat=Bf.get(t,n,this.chunkEnd(n+5e3))}chunkEnd(t){return t>=this.to?this.to:this.text.lineAt(t).to}next(){for(;;){let t=this.re.lastIndex=this.matchPos-this.flat.from,e=this.re.exec(this.flat.text);if(e&&!e[0]&&e.index==t&&(this.re.lastIndex=t+1,e=this.re.exec(this.flat.text)),e){let t=this.flat.from+e.index,i=t+e[0].length;if((this.flat.to>=this.to||e.index+e[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,i,e)))return this.value={from:t,to:i,match:e},this.matchPos=Lf(this.text,i+(t==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=Bf.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function Lf(t,e){if(e>=t.length)return e;let i,n=t.lineAt(e);for(;e<n.to&&(i=n.text.charCodeAt(e-n.from))>=56320&&i<57344;)e++;return e}function Nf(t){let e=jf("input",{class:"cm-textfield",name:"line",value:String(t.state.doc.lineAt(t.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(e.value);if(!i)return;let{state:n}=t,s=n.doc.lineAt(n.selection.main.head),[,r,o,a,l]=i,h=a?+a.slice(1):0,c=o?+o:s.number;if(o&&l){let t=c/100;r&&(t=t*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*t)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let f=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),u=Y.cursor(f.from+Math.max(0,Math.min(h,f.length)));t.dispatch({effects:[Uf.of(!1),Gs.scrollIntoView(u.from,{y:"center"})],selection:u}),t.focus()}return{dom:jf("form",{class:"cm-gotoLine",onkeydown:e=>{27==e.keyCode?(e.preventDefault(),t.dispatch({effects:Uf.of(!1)}),t.focus()):13==e.keyCode&&(e.preventDefault(),i())},onsubmit:t=>{t.preventDefault(),i()}},jf("label",t.state.phrase("Go to line"),": ",e)," ",jf("button",{class:"cm-button",type:"submit"},t.state.phrase("go")))}}"undefined"!=typeof Symbol&&(If.prototype[Symbol.iterator]=Gf.prototype[Symbol.iterator]=function(){return this});const Uf=dt.define(),Hf=z.define({create:()=>!0,update(t,e){for(let i of e.effects)i.is(Uf)&&(t=i.value);return t},provide:t=>vo.from(t,(t=>t?Nf:null))}),Ff=Gs.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),Jf={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Kf=j.define({combine:t=>$t(t,Jf,{highlightWordAroundCursor:(t,e)=>t||e,minSelectionLength:Math.min,maxMatches:Math.min})});function tu(t){let e=[ru,su];return t&&e.push(Kf.of(t)),e}const eu=si.mark({class:"cm-selectionMatch"}),iu=si.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function nu(t,e,i,n){return!(0!=i&&t(e.sliceDoc(i-1,i))==yt.Word||n!=e.doc.length&&t(e.sliceDoc(n,n+1))==yt.Word)}const su=Ni.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(Kf),{state:i}=t,n=i.selection;if(n.ranges.length>1)return si.none;let s,r=n.main,o=null;if(r.empty){if(!e.highlightWordAroundCursor)return si.none;let t=i.wordAt(r.head);if(!t)return si.none;o=i.charCategorizer(r.head),s=i.sliceDoc(t.from,t.to)}else{let t=r.to-r.from;if(t<e.minSelectionLength||t>200)return si.none;if(e.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!nu(o,i,r.from,r.to)||!function(t,e,i,n){return t(e.sliceDoc(i,i+1))==yt.Word&&t(e.sliceDoc(n-1,n))==yt.Word}(o,i,r.from,r.to))return si.none}else if(s=i.sliceDoc(r.from,r.to).trim(),!s)return si.none}let a=[];for(let n of t.visibleRanges){let t=new qf(i.doc,s,n.from,n.to);for(;!t.next().done;){let{from:n,to:s}=t.value;if((!o||nu(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?a.push(iu.range(n,s)):(n>=r.to||s<=r.from)&&a.push(eu.range(n,s)),a.length>e.maxMatches))return si.none}}return si.set(a)}},{decorations:t=>t.decorations}),ru=Gs.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}});const ou=j.define({combine:t=>$t(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:t=>new Wu(t),scrollToMatch:t=>Gs.scrollIntoView(t)})});class au{constructor(t){this.search=t.search,this.caseSensitive=!!t.caseSensitive,this.literal=!!t.literal,this.regexp=!!t.regexp,this.replace=t.replace||"",this.valid=!!this.search&&(!this.regexp||function(t){try{return new RegExp(t,Vf),!0}catch(t){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!t.wholeWord}unquote(t){return this.literal?t:t.replace(/\\([nrt\\])/g,((t,e)=>"n"==e?"\n":"r"==e?"\r":"t"==e?"\t":"\\"))}eq(t){return this.search==t.search&&this.replace==t.replace&&this.caseSensitive==t.caseSensitive&&this.regexp==t.regexp&&this.wholeWord==t.wholeWord}create(){return this.regexp?new pu(this):new cu(this)}getCursor(t,e=0,i){let n=t.doc?t:Qt.create({doc:t});return null==i&&(i=n.doc.length),this.regexp?fu(this,n,e,i):hu(this,n,e,i)}}class lu{constructor(t){this.spec=t}}function hu(t,e,i,n){return new qf(e.doc,t.unquoted,i,n,t.caseSensitive?void 0:t=>t.toLowerCase(),t.wholeWord?function(t,e){return(i,n,s,r)=>((r>i||r+s.length<n)&&(r=Math.max(0,i-2),s=t.sliceString(r,Math.min(t.length,n+2))),!(e(uu(s,i-r))==yt.Word&&e(du(s,i-r))==yt.Word||e(du(s,n-r))==yt.Word&&e(uu(s,n-r))==yt.Word))}(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}class cu extends lu{constructor(t){super(t)}nextMatch(t,e,i){let n=hu(this.spec,t,i,t.doc.length).nextOverlapping();return n.done&&(n=hu(this.spec,t,0,e).nextOverlapping()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=i;;){let i=Math.max(e,n-1e4-this.spec.unquoted.length),s=hu(this.spec,t,i,n),r=null;for(;!s.nextOverlapping().done;)r=s.value;if(r)return r;if(i==e)return null;n-=1e4}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace)}matchAll(t,e){let i=hu(this.spec,t,0,t.doc.length),n=[];for(;!i.next().done;){if(n.length>=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=hu(this.spec,t,Math.max(0,e-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function fu(t,e,i,n){return new If(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?(s=e.charCategorizer(e.selection.main.head),(t,e,i)=>!i[0].length||(s(uu(i.input,i.index))!=yt.Word||s(du(i.input,i.index))!=yt.Word)&&(s(du(i.input,i.index+i[0].length))!=yt.Word||s(uu(i.input,i.index+i[0].length))!=yt.Word)):void 0},i,n);var s}function uu(t,e){return t.slice(O(t,e,!1),e)}function du(t,e){return t.slice(e,O(t,e))}class pu extends lu{nextMatch(t,e,i){let n=fu(this.spec,t,i,t.doc.length).next();return n.done&&(n=fu(this.spec,t,0,e).next()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=1;;n++){let s=Math.max(e,i-1e4*n),r=fu(this.spec,t,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==e||o.from>s+10))return o;if(s==e)return null}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace).replace(/\$([$&\d+])/g,((e,i)=>"$"==i?"$":"&"==i?t.match[0]:"0"!=i&&+i<t.match.length?t.match[i]:e))}matchAll(t,e){let i=fu(this.spec,t,0,t.doc.length),n=[];for(;!i.next().done;){if(n.length>=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=fu(this.spec,t,Math.max(0,e-250),Math.min(i+250,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const Ou=dt.define(),gu=dt.define(),mu=z.define({create:t=>new wu(Cu(t).create(),null),update(t,e){for(let i of e.effects)i.is(Ou)?t=new wu(i.value.create(),t.panel):i.is(gu)&&(t=new wu(t.query,i.value?Zu:null));return t},provide:t=>vo.from(t,(t=>t.panel))});class wu{constructor(t,e){this.query=t,this.panel=e}}const vu=si.mark({class:"cm-searchMatch"}),bu=si.mark({class:"cm-searchMatch cm-searchMatch-selected"}),yu=Ni.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(mu))}update(t){let e=t.state.field(mu);(e!=t.startState.field(mu)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return si.none;let{view:i}=this,n=new Rt;for(let e=0,s=i.visibleRanges,r=s.length;e<r;e++){let{from:o,to:a}=s[e];for(;e<r-1&&a>s[e+1].from-500;)a=s[++e].to;t.highlight(i.state,o,a,((t,e)=>{let s=i.state.selection.ranges.some((i=>i.from==t&&i.to==e));n.add(t,e,s?bu:vu)}))}return n.finish()}},{decorations:t=>t.decorations});function Su(t){return e=>{let i=e.state.field(mu,!1);return i&&i.query.spec.valid?t(e,i):Ru(e)}}const xu=Su(((t,{query:e})=>{let{to:i}=t.state.selection.main,n=e.nextMatch(t.state,i,i);if(!n)return!1;let s=Y.single(n.from,n.to),r=t.state.facet(ou);return t.dispatch({selection:s,effects:[Eu(t,n),r.scrollToMatch(s.main,t)],userEvent:"select.search"}),Au(t),!0})),ku=Su(((t,{query:e})=>{let{state:i}=t,{from:n}=i.selection.main,s=e.prevMatch(i,n,n);if(!s)return!1;let r=Y.single(s.from,s.to),o=t.state.facet(ou);return t.dispatch({selection:r,effects:[Eu(t,s),o.scrollToMatch(r.main,t)],userEvent:"select.search"}),Au(t),!0})),Qu=Su(((t,{query:e})=>{let i=e.matchAll(t.state,1e3);return!(!i||!i.length)&&(t.dispatch({selection:Y.create(i.map((t=>Y.range(t.from,t.to)))),userEvent:"select.search.matches"}),!0)})),$u=Su(((t,{query:e})=>{let{state:i}=t,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=e.nextMatch(i,n,n);if(!r)return!1;let o,a,l=[],h=[];if(r.from==n&&r.to==s&&(a=i.toText(e.getReplacement(r)),l.push({from:r.from,to:r.to,insert:a}),r=e.nextMatch(i,r.from,r.to),h.push(Gs.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let e=0==l.length||l[0].from>=r.to?0:r.to-r.from-a.length;o=Y.single(r.from-e,r.to-e),h.push(Eu(t,r)),h.push(i.facet(ou).scrollToMatch(o.main,t))}return t.dispatch({changes:l,selection:o,effects:h,userEvent:"input.replace"}),!0})),Pu=Su(((t,{query:e})=>{if(t.state.readOnly)return!1;let i=e.matchAll(t.state,1e9).map((t=>{let{from:i,to:n}=t;return{from:i,to:n,insert:e.getReplacement(t)}}));if(!i.length)return!1;let n=t.state.phrase("replaced $ matches",i.length)+".";return t.dispatch({changes:i,effects:Gs.announce.of(n),userEvent:"input.replace.all"}),!0}));function Zu(t){return t.state.facet(ou).createPanel(t)}function Cu(t,e){var i,n,s,r,o;let a=t.selection.main,l=a.empty||a.to>a.from+100?"":t.sliceDoc(a.from,a.to);if(e&&!l)return e;let h=t.facet(ou);return new au({search:(null!==(i=null==e?void 0:e.literal)&&void 0!==i?i:h.literal)?l:l.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==e?void 0:e.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==e?void 0:e.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==e?void 0:e.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==e?void 0:e.wholeWord)&&void 0!==o?o:h.wholeWord})}function Tu(t){let e=Oo(t,Zu);return e&&e.dom.querySelector("[main-field]")}function Au(t){let e=Tu(t);e&&e==t.root.activeElement&&e.select()}const Ru=t=>{let e=t.state.field(mu,!1);if(e&&e.panel){let i=Tu(t);if(i&&i!=t.root.activeElement){let n=Cu(t.state,e.query.spec);n.valid&&t.dispatch({effects:Ou.of(n)}),i.focus(),i.select()}}else t.dispatch({effects:[gu.of(!0),e?Ou.of(Cu(t.state,e.query.spec)):dt.appendConfig.of(_u)]});return!0},Xu=t=>{let e=t.state.field(mu,!1);if(!e||!e.panel)return!1;let i=Oo(t,Zu);return i&&i.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:gu.of(!1)}),!0},Yu=[{key:"Mod-f",run:Ru,scope:"editor search-panel"},{key:"F3",run:xu,shift:ku,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:xu,shift:ku,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Xu,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:t,dispatch:e})=>{let i=t.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let e=new qf(t.doc,t.sliceDoc(n,s));!e.next().done;){if(r.length>1e3)return!1;e.value.from==n&&(o=r.length),r.push(Y.range(e.value.from,e.value.to))}return e(t.update({selection:Y.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Mod-Alt-g",run:t=>{let e=Oo(t,Nf);if(!e){let i=[Uf.of(!0)];null==t.state.field(Hf,!1)&&i.push(dt.appendConfig.of([Hf,Ff])),t.dispatch({effects:i}),e=Oo(t,Nf)}return e&&e.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:t,dispatch:e})=>{let{ranges:i}=t.selection;if(i.some((t=>t.from===t.to)))return(({state:t,dispatch:e})=>{let{selection:i}=t,n=Y.create(i.ranges.map((e=>t.wordAt(e.head)||Y.cursor(e.head))),i.mainIndex);return!n.eq(i)&&(e(t.update({selection:n})),!0)})({state:t,dispatch:e});let n=t.sliceDoc(i[0].from,i[0].to);if(t.selection.ranges.some((e=>t.sliceDoc(e.from,e.to)!=n)))return!1;let s=function(t,e){let{main:i,ranges:n}=t.selection,s=t.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new qf(t.doc,e,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((t=>t.from==s.value.from)))continue;if(r){let e=t.wordAt(s.value.from);if(!e||e.from!=s.value.from||e.to!=s.value.to)continue}return s.value}if(i)return null;s=new qf(t.doc,e,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(t,n);return!!s&&(e(t.update({selection:t.selection.addRange(Y.range(s.from,s.to),!1),effects:Gs.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Wu{constructor(t){this.view=t;let e=this.query=t.state.field(mu).query.spec;function i(t,e,i){return jf("button",{class:"cm-button",name:t,onclick:e,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=jf("input",{value:e.search,placeholder:Mu(t,"Find"),"aria-label":Mu(t,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=jf("input",{value:e.replace,placeholder:Mu(t,"Replace"),"aria-label":Mu(t,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=jf("input",{type:"checkbox",name:"case",form:"",checked:e.caseSensitive,onchange:this.commit}),this.reField=jf("input",{type:"checkbox",name:"re",form:"",checked:e.regexp,onchange:this.commit}),this.wordField=jf("input",{type:"checkbox",name:"word",form:"",checked:e.wholeWord,onchange:this.commit}),this.dom=jf("div",{onkeydown:t=>this.keydown(t),class:"cm-search"},[this.searchField,i("next",(()=>xu(t)),[Mu(t,"next")]),i("prev",(()=>ku(t)),[Mu(t,"previous")]),i("select",(()=>Qu(t)),[Mu(t,"all")]),jf("label",null,[this.caseField,Mu(t,"match case")]),jf("label",null,[this.reField,Mu(t,"regexp")]),jf("label",null,[this.wordField,Mu(t,"by word")]),...t.state.readOnly?[]:[jf("br"),this.replaceField,i("replace",(()=>$u(t)),[Mu(t,"replace")]),i("replaceAll",(()=>Pu(t)),[Mu(t,"replace all")])],jf("button",{name:"close",onclick:()=>Xu(t),"aria-label":Mu(t,"close"),type:"button"},["×"])])}commit(){let t=new au({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});t.eq(this.query)||(this.query=t,this.view.dispatch({effects:Ou.of(t)}))}keydown(t){nr(this.view,t,"search-panel")?t.preventDefault():13==t.keyCode&&t.target==this.searchField?(t.preventDefault(),(t.shiftKey?ku:xu)(this.view)):13==t.keyCode&&t.target==this.replaceField&&(t.preventDefault(),$u(this.view))}update(t){for(let e of t.transactions)for(let t of e.effects)t.is(Ou)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(t){this.query=t,this.searchField.value=t.search,this.replaceField.value=t.replace,this.caseField.checked=t.caseSensitive,this.reField.checked=t.regexp,this.wordField.checked=t.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(ou).top}}function Mu(t,e){return t.state.phrase(e)}const ju=30,Du=/[\s\.,:;?!]/;function Eu(t,{from:e,to:i}){let n=t.state.doc.lineAt(e),s=t.state.doc.lineAt(i).to,r=Math.max(n.from,e-ju),o=Math.min(s,i+ju),a=t.state.sliceDoc(r,o);if(r!=n.from)for(let t=0;t<ju;t++)if(!Du.test(a[t+1])&&Du.test(a[t])){a=a.slice(t);break}if(o!=s)for(let t=a.length-1;t>a.length-ju;t--)if(!Du.test(a[t-1])&&Du.test(a[t])){a=a.slice(0,t);break}return Gs.announce.of(`${t.state.phrase("current match")}. ${a} ${t.state.phrase("on line")} ${n.number}.`)}const qu=Gs.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),_u=[mu,H.low(yu),qu];class Vu{constructor(t,e,i){this.state=t,this.pos=e,this.explicit=i,this.abortListeners=[]}tokenBefore(t){let e=cl(this.state).resolveInner(this.pos,-1);for(;e&&t.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(t){let e=this.state.doc.lineAt(this.pos),i=Math.max(e.from,this.pos-250),n=e.text.slice(i-e.from,this.pos-e.from),s=n.search(Lu(t,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(t,e){"abort"==t&&this.abortListeners&&this.abortListeners.push(e)}}function Iu(t){let e=Object.keys(t).join(""),i=/\w/.test(e);return i&&(e=e.replace(/\w/g,"")),`[${i?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function zu(t){let e=t.map((t=>"string"==typeof t?{label:t}:t)),[i,n]=e.every((t=>/^\w+$/.test(t.label)))?[/\w*$/,/\w+$/]:function(t){let e=Object.create(null),i=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let t=1;t<n.length;t++)i[n[t]]=!0}let n=Iu(e)+Iu(i)+"*$";return[new RegExp("^"+n),new RegExp(n)]}(e);return t=>{let s=t.matchBefore(n);return s||t.explicit?{from:s?s.from:t.pos,options:e,validFor:i}:null}}class Bu{constructor(t,e,i,n){this.completion=t,this.source=e,this.match=i,this.score=n}}function Gu(t){return t.selection.main.from}function Lu(t,e){var i;let{source:n}=t,s=e&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=t.flags)&&void 0!==i?i:t.ignoreCase?"i":""):t}const Nu=ct.define();const Uu=new WeakMap;function Hu(t){if(!Array.isArray(t))return t;let e=Uu.get(t);return e||Uu.set(t,e=zu(t)),e}const Fu=dt.define(),Ju=dt.define();class Ku{constructor(t){this.pattern=t,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let e=0;e<t.length;){let i=b(t,e),n=S(i);this.chars.push(i);let s=t.slice(e,e+n),r=s.toUpperCase();this.folded.push(b(r==s?s.toLowerCase():r,0)),e+=n}this.astral=t.length!=this.chars.length}ret(t,e){return this.score=t,this.matched=e,!0}match(t){if(0==this.pattern.length)return this.ret(-100,[]);if(t.length<this.pattern.length)return!1;let{chars:e,folded:i,any:n,precise:s,byWord:r}=this;if(1==e.length){let n=b(t,0),s=S(n),r=s==t.length?0:-100;if(n==e[0]);else{if(n!=i[0])return!1;r+=-200}return this.ret(r,[0,s])}let o=t.indexOf(this.pattern);if(0==o)return this.ret(t.length==this.pattern.length?0:-100,[0,this.pattern.length]);let a=e.length,l=0;if(o<0){for(let s=0,r=Math.min(t.length,200);s<r&&l<a;){let r=b(t,s);r!=e[l]&&r!=i[l]||(n[l++]=s),s+=S(r)}if(l<a)return!1}let h=0,c=0,f=!1,u=0,d=-1,p=-1,O=/[a-z]/.test(t),g=!0;for(let n=0,l=Math.min(t.length,200),m=0;n<l&&c<a;){let l=b(t,n);o<0&&(h<a&&l==e[h]&&(s[h++]=n),u<a&&(l==e[u]||l==i[u]?(0==u&&(d=n),p=n+1,u++):u=0));let w,v=l<255?l>=48&&l<=57||l>=97&&l<=122?2:l>=65&&l<=90?1:0:(w=y(l))!=w.toLowerCase()?1:w!=w.toUpperCase()?2:0;(!n||1==v&&O||0==m&&0!=v)&&(e[c]==l||i[c]==l&&(f=!0)?r[c++]=n:r.length&&(g=!1)),m=v,n+=S(l)}return c==a&&0==r[0]&&g?this.result((f?-200:0)-100,r,t):u==a&&0==d?this.ret(-200-t.length+(p==t.length?0:-100),[0,p]):o>-1?this.ret(-700-t.length,[o,o+this.pattern.length]):u==a?this.ret(-900-t.length,[d,p]):c==a?this.result((f?-200:0)-100-700+(g?0:-1100),r,t):2!=e.length&&this.result((n[0]?-700:0)-200-1100,n,t)}result(t,e,i){let n=[],s=0;for(let t of e){let e=t+(this.astral?S(b(i,t)):1);s&&n[s-1]==t?n[s-1]=e:(n[s++]=t,n[s++]=e)}return this.ret(t-i.length,n)}}const td=j.define({combine:t=>$t(t,{activateOnTyping:!0,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:id,compareCompletions:(t,e)=>t.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(t,e)=>t&&e,closeOnBlur:(t,e)=>t&&e,icons:(t,e)=>t&&e,tooltipClass:(t,e)=>i=>ed(t(i),e(i)),optionClass:(t,e)=>i=>ed(t(i),e(i)),addToOptions:(t,e)=>t.concat(e)})});function ed(t,e){return t?e?t+" "+e:t:e}function id(t,e,i,n,s,r){let o,a,l=t.textDirection==di.RTL,h=l,c=!1,f="top",u=e.left-s.left,d=s.right-e.right,p=n.right-n.left,O=n.bottom-n.top;if(h&&u<Math.min(p,d)?h=!1:!h&&d<Math.min(p,u)&&(h=!0),p<=(h?u:d))o=Math.max(s.top,Math.min(i.top,s.bottom-O))-e.top,a=Math.min(400,h?u:d);else{c=!0,a=Math.min(400,(l?e.right:s.right-e.left)-30);let t=s.bottom-e.bottom;t>=O||t>e.top?o=i.bottom-e.top:(f="bottom",o=e.bottom-i.top)}return{style:`${f}: ${o/((e.bottom-e.top)/r.offsetHeight)}px; max-width: ${a/((e.right-e.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?l?"left-narrow":"right-narrow":h?"left":"right")}}function nd(t,e,i){if(t<=i)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let t=Math.floor(e/i);return{from:t*i,to:(t+1)*i}}let n=Math.floor((t-e)/i);return{from:t-(n+1)*i,to:t-n*i}}class sd{constructor(t,e,i){this.view=t,this.stateField=e,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:t=>this.placeInfo(t),key:this},this.space=null,this.currentClass="";let n=t.state.field(e),{options:s,selected:r}=n.open,o=t.state.facet(td);this.optionContent=function(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(t){let e=document.createElement("div");return e.classList.add("cm-completionIcon"),t.type&&e.classList.add(...t.type.split(/\s+/g).map((t=>"cm-completionIcon-"+t))),e.setAttribute("aria-hidden","true"),e},position:20}),e.push({render(t,e,i,n){let s=document.createElement("span");s.className="cm-completionLabel";let r=t.displayLabel||t.label,o=0;for(let t=0;t<n.length;){let e=n[t++],i=n[t++];e>o&&s.appendChild(document.createTextNode(r.slice(o,e)));let a=s.appendChild(document.createElement("span"));a.appendChild(document.createTextNode(r.slice(e,i))),a.className="cm-completionMatchedText",o=i}return o<r.length&&s.appendChild(document.createTextNode(r.slice(o))),s},position:50},{render(t){if(!t.detail)return null;let e=document.createElement("span");return e.className="cm-completionDetail",e.textContent=t.detail,e},position:80}),e.sort(((t,e)=>t.position-e.position)).map((t=>t.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=nd(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(t.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=t.state.field(e).open;for(let e,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(e=/-(\d+)$/.exec(s.id))&&+e[1]<n.length)return this.applyCompletion(t,n[+e[1]]),void i.preventDefault()})),this.dom.addEventListener("focusout",(e=>{let i=t.state.field(this.stateField,!1);i&&i.tooltip&&t.state.facet(td).closeOnBlur&&e.relatedTarget!=t.contentDOM&&t.dispatch({effects:Ju.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(t,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(t,e,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(t){var e;let i=t.state.field(this.stateField),n=t.startState.field(this.stateField);if(this.updateTooltipClass(t.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=nd(s.length,r,t.state.facet(td).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(e=n.open)||void 0===e?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(t){let e=this.tooltipClass(t);if(e!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of e.split(" "))t&&this.dom.classList.add(t);this.currentClass=e}}positioned(t){this.space=t,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let t=this.view.state.field(this.stateField),e=t.open;if((e.selected>-1&&e.selected<this.range.from||e.selected>=this.range.to)&&(this.range=nd(e.options.length,e.selected,this.view.state.facet(td).maxRenderedOptions),this.showOptions(e.options,t.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:i}=e.options[e.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((e=>{e&&this.view.state.field(this.stateField,!1)==t&&this.addInfoPane(e,i)})).catch((t=>zi(this.view.state,t,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(t,e){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=t.nodeType)i.appendChild(t),this.infoDestroy=null;else{let{dom:e,destroy:n}=t;i.appendChild(e),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(t){let e=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==t?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),e=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return e&&function(t,e){let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),s=i.height/t.offsetHeight;n.top<i.top?t.scrollTop-=(i.top-n.top)/s:n.bottom>i.bottom&&(t.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,e),e}measureInfo(){let t=this.dom.querySelector("[aria-selected]");if(!t||!this.info)return null;let e=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=t.getBoundingClientRect(),s=this.space;if(!s){let t=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:t.innerWidth,bottom:t.innerHeight}}return n.top>Math.min(s.bottom,e.bottom)-10||n.bottom<Math.max(s.top,e.top)+10?null:this.view.state.facet(td).positionInfo(this.view,e,n,i,s,this.dom)}placeInfo(t){this.info&&(t?(t.style&&(this.info.style.cssText=t.style),this.info.className="cm-tooltip cm-completionInfo "+(t.class||"")):this.info.style.cssText="top: -1e6px")}createListBox(t,e,i){const n=document.createElement("ul");n.id=e,n.setAttribute("role","listbox"),n.setAttribute("aria-expanded","true"),n.setAttribute("aria-label",this.view.state.phrase("Completions"));let s=null;for(let r=i.from;r<i.to;r++){let{completion:o,match:a}=t[r],{section:l}=o;if(l){let t="string"==typeof l?l:l.name;if(t!=s&&(r>i.from||0==i.from))if(s=t,"string"!=typeof l&&l.header)n.appendChild(l.header(l));else{n.appendChild(document.createElement("completion-section")).textContent=t}}const h=n.appendChild(document.createElement("li"));h.id=e+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let t of this.optionContent){let e=t(o,this.view.state,this.view,a);e&&h.appendChild(e)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.to<t.length&&n.classList.add("cm-completionListIncompleteBottom"),n}destroyInfo(){this.info&&(this.infoDestroy&&this.infoDestroy(),this.info.remove(),this.info=null)}destroy(){this.destroyInfo()}}function rd(t,e){return i=>new sd(i,t,e)}function od(t){return 100*(t.boost||0)+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}class ad{constructor(t,e,i,n,s,r){this.options=t,this.attrs=e,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(t,e){return t==this.selected||t>=this.options.length?this:new ad(this.options,cd(e,t),this.tooltip,this.timestamp,t,this.disabled)}static build(t,e,i,n,s){let r=function(t,e){let i=[],n=null,s=t=>{i.push(t);let{section:e}=t.completion;if(e){n||(n=[]);let t="string"==typeof e?e:e.name;n.some((e=>e.name==t))||n.push("string"==typeof e?{name:t}:e)}};for(let n of t)if(n.hasResult()){let t=n.result.getMatch;if(!1===n.result.filter)for(let e of n.result.options)s(new Bu(e,n.source,t?t(e):[],1e9-i.length));else{let i=new Ku(e.sliceDoc(n.from,n.to));for(let e of n.result.options)if(i.match(e.label)){let r=e.displayLabel?t?t(e,i.matched):[]:i.matched;s(new Bu(e,n.source,r,i.score+(e.boost||0)))}}}if(n){let t=Object.create(null),e=0,s=(t,e)=>{var i,n;return(null!==(i=t.rank)&&void 0!==i?i:1e9)-(null!==(n=e.rank)&&void 0!==n?n:1e9)||(t.name<e.name?-1:1)};for(let i of n.sort(s))e-=1e5,t[i.name]=e;for(let e of i){let{section:i}=e.completion;i&&(e.score+=t["string"==typeof i?i:i.name])}}let r=[],o=null,a=e.facet(td).compareCompletions;for(let t of i.sort(((t,e)=>e.score-t.score||a(t.completion,e.completion)))){let e=t.completion;!o||o.label!=e.label||o.detail!=e.detail||null!=o.type&&null!=e.type&&o.type!=e.type||o.apply!=e.apply||o.boost!=e.boost?r.push(t):od(t.completion)>od(o)&&(r[r.length-1]=t),o=t.completion}return r}(t,e);if(!r.length)return n&&t.some((t=>1==t.state))?new ad(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=e.facet(td).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let t=n.options[n.selected].completion;for(let e=0;e<r.length;e++)if(r[e].completion==t){o=e;break}}return new ad(r,cd(i,o),{pos:t.reduce(((t,e)=>e.hasResult()?Math.min(t,e.from):t),1e8),create:vd,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(t){return new ad(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:t.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class ld{constructor(t,e,i){this.active=t,this.id=e,this.open=i}static start(){return new ld(fd,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(t){let{state:e}=t,i=e.facet(td),n=(i.override||e.languageDataAt("autocomplete",Gu(e)).map(Hu)).map((e=>(this.active.find((t=>t.source==e))||new dd(e,this.active.some((t=>0!=t.state))?1:0)).update(t,i)));n.length==this.active.length&&n.every(((t,e)=>t==this.active[e]))&&(n=this.active);let s=this.open;s&&t.docChanged&&(s=s.map(t.changes)),t.selection||n.some((e=>e.hasResult()&&t.changes.touchesRange(e.from,e.to)))||!function(t,e){if(t==e)return!0;for(let i=0,n=0;;){for(;i<t.length&&!t[i].hasResult;)i++;for(;n<e.length&&!e[n].hasResult;)n++;let s=i==t.length,r=n==e.length;if(s||r)return s==r;if(t[i++].result!=e[n++].result)return!1}}(n,this.active)?s=ad.build(n,e,this.id,s,i):s&&s.disabled&&!n.some((t=>1==t.state))&&(s=null),!s&&n.every((t=>1!=t.state))&&n.some((t=>t.hasResult()))&&(n=n.map((t=>t.hasResult()?new dd(t.source,0):t)));for(let e of t.effects)e.is(gd)&&(s=s&&s.setSelected(e.value,this.id));return n==this.active&&s==this.open?this:new ld(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:hd}}const hd={"aria-autocomplete":"list"};function cd(t,e){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":t};return e>-1&&(i["aria-activedescendant"]=t+"-"+e),i}const fd=[];function ud(t){return t.isUserEvent("input.type")?"input":t.isUserEvent("delete.backward")?"delete":null}class dd{constructor(t,e,i=-1){this.source=t,this.state=e,this.explicitPos=i}hasResult(){return!1}update(t,e){let i=ud(t),n=this;i?n=n.handleUserEvent(t,i,e):t.docChanged?n=n.handleChange(t):t.selection&&0!=n.state&&(n=new dd(n.source,0));for(let e of t.effects)if(e.is(Fu))n=new dd(n.source,1,e.value?Gu(t.state):-1);else if(e.is(Ju))n=new dd(n.source,0);else if(e.is(Od))for(let t of e.value)t.source==n.source&&(n=t);return n}handleUserEvent(t,e,i){return"delete"!=e&&i.activateOnTyping?new dd(this.source,1):this.map(t.changes)}handleChange(t){return t.changes.touchesRange(Gu(t.startState))?new dd(this.source,0):this.map(t.changes)}map(t){return t.empty||this.explicitPos<0?this:new dd(this.source,this.state,t.mapPos(this.explicitPos))}}class pd extends dd{constructor(t,e,i,n,s){super(t,2,e),this.result=i,this.from=n,this.to=s}hasResult(){return!0}handleUserEvent(t,e,i){var n;let s=t.changes.mapPos(this.from),r=t.changes.mapPos(this.to,1),o=Gu(t.state);if((this.explicitPos<0?o<=s:o<this.from)||o>r||"delete"==e&&Gu(t.startState)==this.from)return new dd(this.source,"input"==e&&i.activateOnTyping?1:0);let a,l=this.explicitPos<0?-1:t.changes.mapPos(this.explicitPos);return function(t,e,i,n){if(!t)return!1;let s=e.sliceDoc(i,n);return"function"==typeof t?t(s,i,n,e):Lu(t,!0).test(s)}(this.result.validFor,t.state,s,r)?new pd(this.source,l,this.result,s,r):this.result.update&&(a=this.result.update(this.result,s,r,new Vu(t.state,o,l>=0)))?new pd(this.source,l,a,a.from,null!==(n=a.to)&&void 0!==n?n:Gu(t.state)):new dd(this.source,1,l)}handleChange(t){return t.changes.touchesRange(this.from,this.to)?new dd(this.source,0):this.map(t.changes)}map(t){return t.empty?this:new pd(this.source,this.explicitPos<0?-1:t.mapPos(this.explicitPos),this.result,t.mapPos(this.from),t.mapPos(this.to,1))}}const Od=dt.define({map:(t,e)=>t.map((t=>t.map(e)))}),gd=dt.define(),md=z.define({create:()=>ld.start(),update:(t,e)=>t.update(e),provide:t=>[no.from(t,(t=>t.tooltip)),Gs.contentAttributes.from(t,(t=>t.attrs))]});function wd(t,e){const i=e.completion.apply||e.completion.label;let n=t.state.field(md).active.find((t=>t.source==e.source));return n instanceof pd&&("string"==typeof i?t.dispatch(Object.assign(Object.assign({},function(t,e,i,n){let{main:s}=t.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},t.changeByRange((a=>a!=s&&i!=n&&t.sliceDoc(a.from+r,a.from+o)!=t.sliceDoc(i,n)?{range:a}:{changes:{from:a.from+r,to:n==s.from?a.to:a.from+o,insert:e},range:Y.cursor(a.from+r+e.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(t.state,i,n.from,n.to)),{annotations:Nu.of(e.completion)})):i(t,e.completion,n.from,n.to),!0)}const vd=rd(md,wd);function bd(t,e="option"){return i=>{let n=i.state.field(md,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp<i.state.facet(td).interactionDelay)return!1;let s,r=1;"page"==e&&(s=co(i,n.open.tooltip))&&(r=Math.max(2,Math.floor(s.dom.offsetHeight/s.dom.querySelector("li").offsetHeight)-1));let{length:o}=n.open.options,a=n.open.selected>-1?n.open.selected+r*(t?1:-1):t?0:o-1;return a<0?a="page"==e?0:o-1:a>=o&&(a="page"==e?o-1:0),i.dispatch({effects:gd.of(a)}),!0}}class yd{constructor(t,e){this.active=t,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}}const Sd=Ni.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(md).active)1==e.state&&this.startQuery(e)}update(t){let e=t.state.field(md);if(!t.selectionSet&&!t.docChanged&&t.startState.field(md)==e)return;let i=t.transactions.some((t=>(t.selection||t.docChanged)&&!ud(t)));for(let e=0;e<this.running.length;e++){let n=this.running[e];if(i||n.updates.length+t.transactions.length>50&&Date.now()-n.time>1e3){for(let t of n.context.abortListeners)try{t()}catch(t){zi(this.view.state,t)}n.context.abortListeners=null,this.running.splice(e--,1)}else n.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some((t=>t.effects.some((t=>t.is(Fu)))))&&(this.pendingStart=!0);let n=this.pendingStart?50:t.state.facet(td).activateOnTypingDelay;if(this.debounceUpdate=e.active.some((t=>1==t.state&&!this.running.some((e=>e.active.source==t.source))))?setTimeout((()=>this.startUpdate()),n):-1,0!=this.composing)for(let e of t.transactions)"input"==ud(e)?this.composing=2:2==this.composing&&e.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(md);for(let t of e.active)1!=t.state||this.running.some((e=>e.active.source==t.source))||this.startQuery(t)}startQuery(t){let{state:e}=this.view,i=Gu(e),n=new Vu(e,i,t.explicitPos==i),s=new yd(t,n);this.running.push(s),Promise.resolve(t.source(n)).then((t=>{s.context.aborted||(s.done=t||null,this.scheduleAccept())}),(t=>{this.view.dispatch({effects:Ju.of(null)}),zi(this.view.state,t)}))}scheduleAccept(){this.running.every((t=>void 0!==t.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(td).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],i=this.view.state.facet(td);for(let n=0;n<this.running.length;n++){let s=this.running[n];if(void 0===s.done)continue;if(this.running.splice(n--,1),s.done){let n=new pd(s.active.source,s.active.explicitPos,s.done,s.done.from,null!==(t=s.done.to)&&void 0!==t?t:Gu(s.updates.length?s.updates[0].startState:this.view.state));for(let t of s.updates)n=n.update(t,i);if(n.hasResult()){e.push(n);continue}}let r=this.view.state.field(md).active.find((t=>t.source==s.active.source));if(r&&1==r.state)if(null==s.done){let t=new dd(s.active.source,0);for(let e of s.updates)t=t.update(e,i);1!=t.state&&e.push(t)}else this.startQuery(r)}e.length&&this.view.dispatch({effects:Od.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(md,!1);if(e&&e.tooltip&&this.view.state.facet(td).closeOnBlur){let i=e.open&&co(this.view,e.open.tooltip);i&&i.dom.contains(t.relatedTarget)||setTimeout((()=>this.view.dispatch({effects:Ju.of(null)})),10)}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:Fu.of(!1)})),20),this.composing=0}}}),xd=Gs.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class kd{constructor(t,e,i,n){this.field=t,this.line=e,this.from=i,this.to=n}}class Qd{constructor(t,e,i){this.field=t,this.from=e,this.to=i}map(t){let e=t.mapPos(this.from,-1,k.TrackDel),i=t.mapPos(this.to,1,k.TrackDel);return null==e||null==i?null:new Qd(this.field,e,i)}}class $d{constructor(t,e){this.lines=t,this.fieldPositions=e}instantiate(t,e){let i=[],n=[e],s=t.doc.lineAt(e),r=/^\s*/.exec(s.text)[0];for(let s of this.lines){if(i.length){let i=r,o=/^\t*/.exec(s)[0].length;for(let e=0;e<o;e++)i+=t.facet(kl);n.push(e+i.length-o),s=i+s.slice(o)}i.push(s),e+=s.length+1}let o=this.fieldPositions.map((t=>new Qd(t.field,n[t.line]+t.from,n[t.line]+t.to)));return{text:i,ranges:o}}static parse(t){let e,i=[],n=[],s=[];for(let r of t.split(/\r\n?|\n/)){for(;e=/[#$]\{(?:(\d+)(?::([^}]*))?|([^}]*))\}/.exec(r);){let t=e[1]?+e[1]:null,o=e[2]||e[3]||"",a=-1;for(let e=0;e<i.length;e++)(null!=t?i[e].seq==t:o&&i[e].name==o)&&(a=e);if(a<0){let e=0;for(;e<i.length&&(null==t||null!=i[e].seq&&i[e].seq<t);)e++;i.splice(e,0,{seq:t,name:o}),a=e;for(let t of s)t.field>=a&&t.field++}s.push(new kd(a,n.length,e.index,e.index+o.length)),r=r.slice(0,e.index)+o+r.slice(e.index+e[0].length)}for(let t;t=/\\([{}])/.exec(r);){r=r.slice(0,t.index)+t[1]+r.slice(t.index+t[0].length);for(let e of s)e.line==n.length&&e.from>t.index&&(e.from--,e.to--)}n.push(r)}return new $d(n,s)}}let Pd=si.widget({widget:new class extends ii{toDOM(){let t=document.createElement("span");return t.className="cm-snippetFieldPosition",t}ignoreEvent(){return!1}}}),Zd=si.mark({class:"cm-snippetField"});class Cd{constructor(t,e){this.ranges=t,this.active=e,this.deco=si.set(t.map((t=>(t.from==t.to?Pd:Zd).range(t.from,t.to))))}map(t){let e=[];for(let i of this.ranges){let n=i.map(t);if(!n)return null;e.push(n)}return new Cd(e,this.active)}selectionInsideField(t){return t.ranges.every((t=>this.ranges.some((e=>e.field==this.active&&e.from<=t.from&&e.to>=t.to))))}}const Td=dt.define({map:(t,e)=>t&&t.map(e)}),Ad=dt.define(),Rd=z.define({create:()=>null,update(t,e){for(let i of e.effects){if(i.is(Td))return i.value;if(i.is(Ad)&&t)return new Cd(t.ranges,i.value)}return t&&e.docChanged&&(t=t.map(e.changes)),t&&e.selection&&!t.selectionInsideField(e.selection)&&(t=null),t},provide:t=>Gs.decorations.from(t,(t=>t?t.deco:si.none))});function Xd(t,e){return Y.create(t.filter((t=>t.field==e)).map((t=>Y.range(t.from,t.to))))}function Yd(t){let i=$d.parse(t);return(t,n,s,r)=>{let{text:o,ranges:a}=i.instantiate(t.state,s),l={changes:{from:s,to:r,insert:e.of(o)},scrollIntoView:!0,annotations:n?[Nu.of(n),pt.userEvent.of("input.complete")]:void 0};if(a.length&&(l.selection=Xd(a,0)),a.some((t=>t.field>0))){let e=new Cd(a,0),i=l.effects=[Td.of(e)];void 0===t.state.field(Rd,!1)&&i.push(dt.appendConfig.of([Rd,Dd,qd,xd]))}t.dispatch(t.state.update(l))}}function Wd(t){return({state:e,dispatch:i})=>{let n=e.field(Rd,!1);if(!n||t<0&&0==n.active)return!1;let s=n.active+t,r=t>0&&!n.ranges.some((e=>e.field==s+t));return i(e.update({selection:Xd(n.ranges,s),effects:Td.of(r?null:new Cd(n.ranges,s)),scrollIntoView:!0})),!0}}const Md=[{key:"Tab",run:Wd(1),shift:Wd(-1)},{key:"Escape",run:({state:t,dispatch:e})=>!!t.field(Rd,!1)&&(e(t.update({effects:Td.of(null)})),!0)}],jd=j.define({combine:t=>t.length?t[0]:Md}),Dd=H.highest(tr.compute([jd],(t=>t.facet(jd))));function Ed(t,e){return Object.assign(Object.assign({},e),{apply:Yd(t)})}const qd=Gs.domEventHandlers({mousedown(t,e){let i,n=e.state.field(Rd,!1);if(!n||null==(i=e.posAtCoords({x:t.clientX,y:t.clientY})))return!1;let s=n.ranges.find((t=>t.from<=i&&t.to>=i));return!(!s||s.field==n.active)&&(e.dispatch({selection:Xd(n.ranges,s.field),effects:Td.of(n.ranges.some((t=>t.field>s.field))?new Cd(n.ranges,s.field):null),scrollIntoView:!0}),!0)}}),_d={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Vd=dt.define({map(t,e){let i=e.mapPos(t,-1,k.TrackAfter);return null==i?void 0:i}}),Id=new class extends Pt{};Id.startSide=1,Id.endSide=-1;const zd=z.define({create:()=>At.empty,update(t,e){if(t=t.map(e.changes),e.selection){let i=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:t=>t>=i.from&&t<=i.to})}for(let i of e.effects)i.is(Vd)&&(t=t.update({add:[Id.range(i.value,i.value+1)]}));return t}});const Bd="()[]{}<>";function Gd(t){for(let e=0;e<Bd.length;e+=2)if(Bd.charCodeAt(e)==t)return Bd.charAt(e+1);return y(t<128?t:t+1)}function Ld(t,e){return t.languageDataAt("closeBrackets",e)[0]||_d}const Nd="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),Ud=Gs.inputHandler.of(((t,e,i,n)=>{if((Nd?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let s=t.state.selection.main;if(n.length>2||2==n.length&&1==S(b(n,0))||e!=s.from||i!=s.to)return!1;let r=function(t,e){let i=Ld(t,t.selection.main.head),n=i.brackets||_d.brackets;for(let s of n){let r=Gd(b(s,0));if(e==s)return r==s?ep(t,s,n.indexOf(s+s+s)>-1,i):Kd(t,s,r,i.before||_d.before);if(e==r&&Fd(t,t.selection.main.from))return tp(t,s,r)}return null}(t.state,n);return!!r&&(t.dispatch(r),!0)})),Hd=[{key:"Backspace",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Ld(t,t.selection.main.head).brackets||_d.brackets,n=null,s=t.changeByRange((e=>{if(e.empty){let n=function(t,e){let i=t.sliceString(e-2,e);return S(b(i,0))==i.length?i:i.slice(1)}(t.doc,e.head);for(let s of i)if(s==n&&Jd(t.doc,e.head)==Gd(b(s,0)))return{changes:{from:e.head-s.length,to:e.head+s.length},range:Y.cursor(e.head-s.length)}}return{range:n=e}}));return n||e(t.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function Fd(t,e){let i=!1;return t.field(zd).between(0,t.doc.length,(t=>{t==e&&(i=!0)})),i}function Jd(t,e){let i=t.sliceString(e,e+2);return i.slice(0,S(b(i,0)))}function Kd(t,e,i,n){let s=null,r=t.changeByRange((r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:i,from:r.to}],effects:Vd.of(r.to+e.length),range:Y.range(r.anchor+e.length,r.head+e.length)};let o=Jd(t.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+i,from:r.head},effects:Vd.of(r.head+e.length),range:Y.cursor(r.head+e.length)}:{range:s=r}}));return s?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function tp(t,e,i){let n=null,s=t.changeByRange((e=>e.empty&&Jd(t.doc,e.head)==i?{changes:{from:e.head,to:e.head+i.length,insert:i},range:Y.cursor(e.head+i.length)}:n={range:e}));return n?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function ep(t,e,i,n){let s=n.stringPrefixes||_d.stringPrefixes,r=null,o=t.changeByRange((n=>{if(!n.empty)return{changes:[{insert:e,from:n.from},{insert:e,from:n.to}],effects:Vd.of(n.to+e.length),range:Y.range(n.anchor+e.length,n.head+e.length)};let o,a=n.head,l=Jd(t.doc,a);if(l==e){if(ip(t,a))return{changes:{insert:e+e,from:a},effects:Vd.of(a+e.length),range:Y.cursor(a+e.length)};if(Fd(t,a)){let n=i&&t.sliceDoc(a,a+3*e.length)==e+e+e?e+e+e:e;return{changes:{from:a,to:a+n.length,insert:n},range:Y.cursor(a+n.length)}}}else{if(i&&t.sliceDoc(a-2*e.length,a)==e+e&&(o=np(t,a-2*e.length,s))>-1&&ip(t,o))return{changes:{insert:e+e+e+e,from:a},effects:Vd.of(a+e.length),range:Y.cursor(a+e.length)};if(t.charCategorizer(a)(l)!=yt.Word&&np(t,a,s)>-1&&!function(t,e,i,n){let s=cl(t).resolveInner(e,-1),r=n.reduce(((t,e)=>Math.max(t,e.length)),0);for(let o=0;o<5;o++){let o=t.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),a=o.indexOf(i);if(!a||a>-1&&n.indexOf(o.slice(0,a))>-1){let e=s.firstChild;for(;e&&e.from==s.from&&e.to-e.from>i.length+a;){if(t.sliceDoc(e.to-i.length,e.to)==i)return!1;e=e.firstChild}return!0}let l=s.to==e&&s.parent;if(!l)break;s=l}return!1}(t,a,e,s))return{changes:{insert:e+e,from:a},effects:Vd.of(a+e.length),range:Y.cursor(a+e.length)}}return{range:r=n}}));return r?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function ip(t,e){let i=cl(t).resolveInner(e+1);return i.parent&&i.from==e}function np(t,e,i){let n=t.charCategorizer(e);if(n(t.sliceDoc(e-1,e))!=yt.Word)return e;for(let s of i){let i=e-s.length;if(t.sliceDoc(i,e)==s&&n(t.sliceDoc(i-1,i))!=yt.Word)return i}return-1}function sp(t={}){return[md,td.of(t),Sd,op,xd]}const rp=[{key:"Ctrl-Space",run:t=>!!t.state.field(md,!1)&&(t.dispatch({effects:Fu.of(!0)}),!0)},{key:"Escape",run:t=>{let e=t.state.field(md,!1);return!(!e||!e.active.some((t=>0!=t.state)))&&(t.dispatch({effects:Ju.of(null)}),!0)}},{key:"ArrowDown",run:bd(!0)},{key:"ArrowUp",run:bd(!1)},{key:"PageDown",run:bd(!0,"page")},{key:"PageUp",run:bd(!1,"page")},{key:"Enter",run:t=>{let e=t.state.field(md,!1);return!(t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestamp<t.state.facet(td).interactionDelay)&&wd(t,e.open.options[e.open.selected])}}],op=H.highest(tr.computeN([td],(t=>t.facet(td).defaultKeymap?[rp]:[])));class ap{constructor(t,e,i){this.from=t,this.to=e,this.diagnostic=i}}class lp{constructor(t,e,i){this.diagnostics=t,this.panel=e,this.selected=i}static init(t,e,i){let n=t,s=i.facet(vp).markerFilter;s&&(n=s(n,i));let r=si.set(n.map((t=>t.from==t.to||t.from==t.to-1&&i.doc.lineAt(t.from).to==t.from?si.widget({widget:new Sp(t),diagnostic:t}).range(t.from):si.mark({attributes:{class:"cm-lintRange cm-lintRange-"+t.severity+(t.markClass?" "+t.markClass:"")},diagnostic:t,inclusive:!0}).range(t.from,t.to))),!0);return new lp(r,e,hp(r))}}function hp(t,e=null,i=0){let n=null;return t.between(i,1e9,((t,i,{spec:s})=>{if(!e||s.diagnostic==e)return n=new ap(t,i,s.diagnostic),!1})),n}const cp=dt.define(),fp=dt.define(),up=dt.define(),dp=z.define({create:()=>new lp(si.none,null,null),update(t,e){if(e.docChanged){let i=t.diagnostics.map(e.changes),n=null;if(t.selected){let s=e.changes.mapPos(t.selected.from,1);n=hp(i,t.selected.diagnostic,s)||hp(i,null,s)}t=new lp(i,t.panel,n)}for(let i of e.effects)i.is(cp)?t=lp.init(i.value,t.panel,e.state):i.is(fp)?t=new lp(t.diagnostics,i.value?kp.open:null,t.selected):i.is(up)&&(t=new lp(t.diagnostics,t.panel,i.value));return t},provide:t=>[vo.from(t,(t=>t.panel)),Gs.decorations.from(t,(t=>t.diagnostics))]}),pp=si.mark({class:"cm-lintRange cm-lintRange-active",inclusive:!0});function Op(t,e,i){let{diagnostics:n}=t.state.field(dp),s=[],r=2e8,o=0;n.between(e-(i<0?1:0),e+(i>0?1:0),((t,n,{spec:a})=>{e>=t&&e<=n&&(t==n||(e>t||i>0)&&(e<n||i<0))&&(s.push(a.diagnostic),r=Math.min(t,r),o=Math.max(n,o))}));let a=t.state.facet(vp).tooltipFilter;return a&&(s=a(s,t.state)),s.length?{pos:r,end:o,above:t.state.doc.lineAt(r).to<o,create:()=>({dom:gp(t,s)})}:null}function gp(t,e){return jf("ul",{class:"cm-tooltip-lint"},e.map((e=>yp(t,e,!1))))}const mp=t=>{let e=t.state.field(dp,!1);return!(!e||!e.panel)&&(t.dispatch({effects:fp.of(!1)}),!0)},wp=[{key:"Mod-Shift-m",run:t=>{let e=t.state.field(dp,!1);var i,n;e&&e.panel||t.dispatch({effects:(i=t.state,n=[fp.of(!0)],i.field(dp,!1)?n:n.concat(dt.appendConfig.of(Pp)))});let s=Oo(t,kp.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:t=>{let e=t.state.field(dp,!1);if(!e)return!1;let i=t.state.selection.main,n=e.diagnostics.iter(i.to+1);return!(!n.value&&(n=e.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to))&&(t.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),!0)}}],vp=j.define({combine:t=>Object.assign({sources:t.map((t=>t.source)).filter((t=>null!=t))},$t(t.map((t=>t.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null},{needsRefresh:(t,e)=>t?e?i=>t(i)||e(i):t:e}))});function bp(t){let e=[];if(t)t:for(let{name:i}of t){for(let t=0;t<i.length;t++){let n=i[t];if(/[a-zA-Z]/.test(n)&&!e.some((t=>t.toLowerCase()==n.toLowerCase()))){e.push(n);continue t}}e.push("")}return e}function yp(t,e,i){var n;let s=i?bp(e.actions):[];return jf("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},jf("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage():e.message),null===(n=e.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=hp(t.state.field(dp).diagnostics,e);s&&i.apply(t,s.from,s.to)},{name:a}=i,l=s[n]?a.indexOf(s[n]):-1,h=l<0?a:[a.slice(0,l),jf("u",a.slice(l,l+1)),a.slice(l+1)];return jf("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${a}${l<0?"":` (access key "${s[n]})"`}.`},h)})),e.source&&jf("div",{class:"cm-diagnosticSource"},e.source))}class Sp extends ii{constructor(t){super(),this.diagnostic=t}eq(t){return t.diagnostic==this.diagnostic}toDOM(){return jf("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class xp{constructor(t,e){this.diagnostic=e,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=yp(t,e,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class kp{constructor(t){this.view=t,this.items=[];this.list=jf("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:e=>{if(27==e.keyCode)mp(this.view),this.view.focus();else if(38==e.keyCode||33==e.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==e.keyCode||34==e.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==e.keyCode)this.moveSelection(0);else if(35==e.keyCode)this.moveSelection(this.items.length-1);else if(13==e.keyCode)this.view.focus();else{if(!(e.keyCode>=65&&e.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=bp(i.actions);for(let s=0;s<n.length;s++)if(n[s].toUpperCase().charCodeAt(0)==e.keyCode){let e=hp(this.view.state.field(dp).diagnostics,i);e&&i.actions[s].apply(t,e.from,e.to)}}}e.preventDefault()},onclick:t=>{for(let e=0;e<this.items.length;e++)this.items[e].dom.contains(t.target)&&this.moveSelection(e)}}),this.dom=jf("div",{class:"cm-panel-lint"},this.list,jf("button",{type:"button",name:"close","aria-label":this.view.state.phrase("close"),onclick:()=>mp(this.view)},"×")),this.update()}get selectedIndex(){let t=this.view.state.field(dp).selected;if(!t)return-1;for(let e=0;e<this.items.length;e++)if(this.items[e].diagnostic==t.diagnostic)return e;return-1}update(){let{diagnostics:t,selected:e}=this.view.state.field(dp),i=0,n=!1,s=null;for(t.between(0,this.view.state.doc.length,((t,r,{spec:o})=>{let a,l=-1;for(let t=i;t<this.items.length;t++)if(this.items[t].diagnostic==o.diagnostic){l=t;break}l<0?(a=new xp(this.view,o.diagnostic),this.items.splice(i,0,a),n=!0):(a=this.items[l],l>i&&(this.items.splice(i,l-i),n=!0)),e&&a.diagnostic==e.diagnostic?a.dom.hasAttribute("aria-selected")||(a.dom.setAttribute("aria-selected","true"),s=a):a.dom.hasAttribute("aria-selected")&&a.dom.removeAttribute("aria-selected"),i++}));i<this.items.length&&!(1==this.items.length&&this.items[0].diagnostic.from<0);)n=!0,this.items.pop();0==this.items.length&&(this.items.push(new xp(this.view,{from:-1,to:-1,severity:"info",message:this.view.state.phrase("No diagnostics")})),n=!0),s?(this.list.setAttribute("aria-activedescendant",s.id),this.view.requestMeasure({key:this,read:()=>({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:t,panel:e})=>{let i=e.height/this.list.offsetHeight;t.top<e.top?this.list.scrollTop-=(e.top-t.top)/i:t.bottom>e.bottom&&(this.list.scrollTop+=(t.bottom-e.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let t=this.list.firstChild;function e(){let e=t;t=e.nextSibling,e.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;t!=i.dom;)e();t=i.dom.nextSibling}else this.list.insertBefore(i.dom,t);for(;t;)e()}moveSelection(t){if(this.selectedIndex<0)return;let e=hp(this.view.state.field(dp).diagnostics,this.items[t].diagnostic);e&&this.view.dispatch({selection:{anchor:e.from,head:e.to},scrollIntoView:!0,effects:up.of(e)})}static open(t){return new kp(t)}}function Qp(t){return function(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" ${e}>${encodeURIComponent(t)}</svg>')`}(`<path d="m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0" stroke="${t}" fill="none" stroke-width=".7"/>`,'width="6" height="3"')}const $p=Gs.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:Qp("#d11")},".cm-lintRange-warning":{backgroundImage:Qp("orange")},".cm-lintRange-info":{backgroundImage:Qp("#999")},".cm-lintRange-hint":{backgroundImage:Qp("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),Pp=[dp,Gs.decorations.compute([dp],(t=>{let{selected:e,panel:i}=t.field(dp);return e&&i&&e.from!=e.to?si.set([pp.range(e.from,e.to)]):si.none})),ho(Op,{hideOn:function(t,e){let i=t.startState.doc.lineAt(e.pos);return!(!t.effects.some((t=>t.is(cp)))&&!t.changes.touchesRange(i.from,i.to))}}),$p],Zp=(()=>[Do(),Vo(),Xr(),kc(),ph(),Or(),Qr(),Qt.allowMultipleSelections.of(!0),El(),bh(xh,{fallback:!0}),Xh(),[Ud,zd],sp(),Br(),Nr(),Dr(),tu(),tr.of([...Hd,...Mf,...Yu,..._c,...rh,...rp,...wp])])(),Cp=(()=>[Xr(),kc(),Or(),bh(xh,{fallback:!0}),tr.of([...Mf,..._c])])();var Tp=Object.freeze({__proto__:null,EditorView:Gs,basicSetup:Zp,minimalSetup:Cp});class Ap{constructor(t,e,i,n,s,r,o,a,l,h=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=a,this.curContext=l,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((t,e)=>e%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new Ap(t,[],e,i,i,0,[],0,n?new Rp(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=65535&t,{parser:s}=this.p,r=s.dynamicPrecedence(n);if(r&&(this.score+=r),0==i)return this.pushState(s.getGoto(this.state,n,!0),this.reducePos),n<s.minRepeatTerm&&this.storeNode(n,this.reducePos,this.reducePos,4,!0),void this.reduceContext(n,this.reducePos);let o=this.stack.length-3*(i-1)-(262144&t?6:0),a=o?this.stack[o-2]:this.p.ranges[0].from,l=this.reducePos-a;l>=2e3&&!(null===(e=this.p.parser.nodeSet.types[n])||void 0===e?void 0:e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSize<l&&(this.p.bigReductionCount=1,this.p.lastBigReductionStart=a,this.p.lastBigReductionSize=l));let h=o?this.stack[o-1]:0,c=this.bufferBase+this.buffer.length-h;if(n<s.minRepeatTerm||131072&t){let t=s.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(n,a,t,c+4,!0)}if(262144&t)this.state=this.stack[o];else{let t=this.stack[o-3];this.state=s.getGoto(t,n,!0)}for(;this.stack.length>o;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,s=!1){if(0==t&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let t=this,n=this.buffer.length;if(0==n&&t.parent&&(n=t.bufferBase-t.parent.bufferBase,t=t.parent),n>0&&0==t.buffer[n-4]&&t.buffer[n-1]>-1){if(e==i)return;if(t.buffer[n-2]>=e)return void(t.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4])for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4);this.buffer[s]=t,this.buffer[s+1]=e,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(t,e,i,n)}shift(t,e,i,n){if(131072&t)this.pushState(65535&t,this.pos);else if(0==(262144&t)){let s=t,{parser:r}=this.p;(n>this.pos||e<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(e,i),e<=r.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(t,e,i,n){65536&t?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new Ap(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Xp(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(0==i)return!1;if(0==(65536&i))return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s<e.length;s+=2)(n=e[s+1])!=this.state&&this.p.parser.hasAction(n,t)&&i.push(e[s],n);if(this.stack.length<120)for(let t=0;i.length<8&&t<e.length;t+=2){let n=e[t+1];i.some(((t,e)=>1&e&&t==n))||i.push(e[t],n)}e=i}let i=[];for(let t=0;t<e.length&&i.length<4;t+=2){let n=e[t+1];if(n==this.state)continue;let s=this.split();s.pushState(n,this.pos),s.storeNode(0,s.pos,s.pos,4,!0),s.shiftContext(e[t],this.pos),s.reducePos=this.pos,s.score-=200,i.push(s)}return i}forceReduce(){let{parser:t}=this.p,e=t.stateSlot(this.state,5);if(0==(65536&e))return!1;if(!t.validAction(this.state,e)){let i=e>>19,n=65535&e,s=this.stack.length-3*i;if(s<0||t.getGoto(this.stack[s],n,!1)<0){let t=this.findForcedReduction();if(null==t)return!1;e=t}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,s)=>{if(!e.includes(n))return e.push(n),t.allActions(n,(e=>{if(393216&e);else if(65536&e){let i=(e>>19)-s;if(i>1){let n=65535&e,s=this.stack.length-3*i;if(s>=0&&t.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let t=i(e,s+1);if(null!=t)return t}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:t}=this.p;return 65535==t.data[t.stateSlot(this.state,1)]&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;e<this.stack.length;e+=3)if(this.stack[e]!=t.stack[e])return!1;return!0}get parser(){return this.p.parser}dialectEnabled(t){return this.p.parser.dialect.flags[t]}shiftContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,t,this,this.p.stream.reset(e)))}reduceContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,t,this,this.p.stream.reset(e)))}emitContext(){let t=this.buffer.length-1;(t<0||-3!=this.buffer[t])&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let t=this.buffer.length-1;(t<0||-4!=this.buffer[t])&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(t){if(t!=this.curContext.context){let e=new Rp(this.curContext.tracker,t);e.hash!=this.curContext.hash&&this.emitContext(),this.curContext=e}}setLookAhead(t){t>this.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class Rp{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}}class Xp{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=65535&t,i=t>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}}class Yp{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,0==this.index&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new Yp(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;null!=t&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Yp(this.stack,this.pos,this.index)}}function Wp(t,e=Uint16Array){if("string"!=typeof t)return t;let i=null;for(let n=0,s=0;n<t.length;){let r=0;for(;;){let e=t.charCodeAt(n++),i=!1;if(126==e){r=65535;break}e>=92&&e--,e>=34&&e--;let s=e-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new e(r)}return i}class Mp{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const jp=new Mp;class Dp{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=jp,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,s=this.pos+t;for(;s<i.from;){if(!n)return null;let t=this.ranges[--n];s-=i.from-t.to,i=t}for(;e<0?s>i.to:s>=i.to;){if(n==this.ranges.length-1)return null;let t=this.ranges[++n];s+=t.from-i.to,i=t}return s}clipPos(t){if(t>=this.range.from&&t<this.range.to)return t;for(let e of this.ranges)if(e.to>t)return Math.max(t,e.from);return this.end}peek(t){let e,i,n=this.chunkOff+t;if(n>=0&&n<this.chunk.length)e=this.pos+t,i=this.chunk.charCodeAt(n);else{let n=this.resolveOffset(t,1);if(null==n)return-1;if(e=n,e>=this.chunk2Pos&&e<this.chunk2Pos+this.chunk2.length)i=this.chunk2.charCodeAt(e-this.chunk2Pos);else{let t=this.rangeIndex,n=this.range;for(;n.to<=e;)n=this.ranges[++t];this.chunk2=this.input.chunk(this.chunk2Pos=e),e+this.chunk2.length>n.to&&(this.chunk2=this.chunk2.slice(0,n.to-e)),i=this.chunk2.charCodeAt(0)}}return e>=this.token.lookAhead&&(this.token.lookAhead=e+1),i}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(null==i||i<this.token.start)throw new RangeError("Token end out of bounds");this.token.value=t,this.token.end=i}acceptTokenTo(t,e){this.token.value=t,this.token.end=e}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:t,chunkPos:e}=this;this.chunk=this.chunk2,this.chunkPos=this.chunk2Pos,this.chunk2=t,this.chunk2Pos=e,this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk,this.chunk2Pos=this.chunkPos;let t=this.input.chunk(this.pos),e=this.pos+t.length;this.chunk=e>this.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=jp,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t<this.range.from;)this.range=this.ranges[--this.rangeIndex];for(;t>=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t<this.chunkPos+this.chunk.length?this.chunkOff=t-this.chunkPos:(this.chunk="",this.chunkOff=0),this.readNext()}return this}read(t,e){if(t>=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}}class Ep{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;Vp(this.data,t,e,this.id,i.data,i.tokenPrecTable)}}Ep.prototype.contextual=Ep.prototype.fallback=Ep.prototype.extend=!1;class qp{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data="string"==typeof t?Wp(t):t}token(t,e){let i=t.pos,n=0;for(;;){let i=t.next<0,s=t.resolveOffset(1,1);if(Vp(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(null==this.elseToken)return;if(i||n++,null==s)break;t.reset(s,t.token)}n&&(t.reset(i,t.token),t.acceptToken(this.elseToken,n))}}qp.prototype.contextual=Ep.prototype.fallback=Ep.prototype.extend=!1;class _p{constructor(t,e={}){this.token=t,this.contextual=!!e.contextual,this.fallback=!!e.fallback,this.extend=!!e.extend}}function Vp(t,e,i,n,s,r){let o=0,a=1<<n,{dialect:l}=i.p.parser;t:for(;0!=(a&t[o]);){let i=t[o+1];for(let n=o+3;n<i;n+=2)if((t[n+1]&a)>0){let i=t[n];if(l.allows(i)&&(-1==e.token.value||e.token.value==i||zp(i,e.token.value,s,r))){e.acceptToken(i);break}}let n=e.next,h=0,c=t[o+2];if(!(e.next<0&&c>h&&65535==t[i+3*c-3])){for(;h<c;){let s=h+c>>1,r=i+s+(s<<1),a=t[r],l=t[r+1]||65536;if(n<a)c=s;else{if(!(n>=l)){o=t[r+2],e.advance();continue t}h=s+1}}break}o=t[i+3*c-1]}}function Ip(t,e,i){for(let n,s=e;65535!=(n=t[s]);s++)if(n==i)return s-e;return-1}function zp(t,e,i,n){let s=Ip(i,n,e);return s<0||Ip(i,n,t)<s}const Bp="undefined"!=typeof process&&process.env&&/\bparse\b/.test(process.env.LOG);let Gp=null;function Lp(t,e,i){let n=t.cursor(ra.IncludeAnonymous);for(n.moveTo(e);;)if(!(i<0?n.childBefore(e):n.childAfter(e)))for(;;){if((i<0?n.to<e:n.from>e)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(t.length,Math.max(n.from+1,e+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:t.length}}class Np{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Lp(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Lp(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(t<this.nextStart)return null;for(;this.fragment&&this.safeTo<=t;)this.nextFragment();if(!this.fragment)return null;for(;;){let e=this.trees.length-1;if(e<0)return this.nextFragment(),null;let i=this.trees[e],n=this.index[e];if(n==i.children.length){this.trees.pop(),this.start.pop(),this.index.pop();continue}let s=i.children[n],r=this.start[e]+i.positions[n];if(r>t)return this.nextStart=r,null;if(s instanceof oa){if(r==t){if(r<this.safeFrom)return null;let t=r+s.length;if(t<=this.safeTo){let e=s.prop(Jo.lookAhead);if(!e||t+e<this.fragment.to)return s}}this.index[e]++,r+s.length>=Math.max(this.safeFrom,t)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[e]++,this.nextStart=r+s.length}}}class Up{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map((t=>new Mp))}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:s}=n,r=n.stateSlot(t.state,3),o=t.curContext?t.curContext.hash:0,a=0;for(let n=0;n<s.length;n++){if(0==(1<<n&r))continue;let l=s[n],h=this.tokens[n];if((!i||l.fallback)&&((l.contextual||h.start!=t.pos||h.mask!=r||h.context!=o)&&(this.updateCachedToken(h,l,t),h.mask=r,h.context=o),h.lookAhead>h.end+25&&(a=Math.max(h.lookAhead,a)),0!=h.value)){let n=e;if(h.extended>-1&&(e=this.addActions(t,h.extended,h.end,e)),e=this.addActions(t,h.value,h.end,e),!l.extend&&(i=h,e>n))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),i||t.pos!=this.stream.end||(i=new Mp,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Mp,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:e}=i.p;for(let n=0;n<e.specialized.length;n++)if(e.specialized[n]==t.value){let s=e.specializers[n](this.stream.read(t.start,t.end),i);if(s>=0&&i.p.parser.dialect.allows(s>>1)){0==(1&s)?t.value=s>>1:t.extended=s>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let e=0;e<n;e+=3)if(this.actions[e]==t)return n;return this.actions[n++]=t,this.actions[n++]=e,this.actions[n++]=i,n}addActions(t,e,i,n){let{state:s}=t,{parser:r}=t.p,{data:o}=r;for(let t=0;t<2;t++)for(let a=r.stateSlot(s,t?2:1);;a+=3){if(65535==o[a]){if(1!=o[a+1]){0==n&&2==o[a+1]&&(n=this.putAction(eO(o,a+2),e,i,n));break}a=eO(o,a+2)}o[a]==e&&(n=this.putAction(eO(o,a+1),e,i,n))}return n}}class Hp{constructor(t,e,i,n){this.parser=t,this.input=e,this.ranges=n,this.recovering=0,this.nextStackID=9812,this.minStackPos=0,this.reused=[],this.stoppedAt=null,this.lastBigReductionStart=-1,this.lastBigReductionSize=0,this.bigReductionCount=0,this.stream=new Dp(e,n),this.tokens=new Up(t,this.stream),this.topTerm=t.top[1];let{from:s}=n[0];this.stacks=[Ap.start(this,t.top[0],s)],this.fragments=i.length&&this.stream.end-s>4*t.bufferLength?new Np(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t,e,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[t]=i;for(;t.forceReduce()&&t.stack.length&&t.stack[t.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;r<i.length;r++){let o=i[r];for(;;){if(this.tokens.mainToken=null,o.pos>n)s.push(o);else{if(this.advanceStack(o,s,i))continue;{t||(t=[],e=[]),t.push(o);let i=this.tokens.getMainToken(o);e.push(i.value,i.end)}}break}}if(!s.length){let e=t&&function(t){let e=null;for(let i of t){let t=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=t&&i.pos>t)&&i.p.parser.stateFlag(i.state,2)&&(!e||e.score<i.score)&&(e=i)}return e}(t);if(e)return Bp&&console.log("Finish with "+this.stackID(e)),this.stackToTree(e);if(this.parser.strict)throw Bp&&t&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+n);this.recovering||(this.recovering=5)}if(this.recovering&&t){let i=null!=this.stoppedAt&&t[0].pos>this.stoppedAt?t[0]:this.runRecovery(t,e,s);if(i)return Bp&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let t=1==this.recovering?1:3*this.recovering;if(s.length>t)for(s.sort(((t,e)=>e.score-t.score));s.length>t;)s.pop();s.some((t=>t.reducePos>n))&&this.recovering--}else if(s.length>1){t:for(let t=0;t<s.length-1;t++){let e=s[t];for(let i=t+1;i<s.length;i++){let n=s[i];if(e.sameState(n)||e.buffer.length>500&&n.buffer.length>500){if(!((e.score-n.score||e.buffer.length-n.buffer.length)>0)){s.splice(t--,1);continue t}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let t=1;t<s.length;t++)s[t].pos<this.minStackPos&&(this.minStackPos=s[t].pos);return null}stopAt(t){if(null!=this.stoppedAt&&this.stoppedAt<t)throw new RangeError("Can't move stoppedAt forward");this.stoppedAt=t}advanceStack(t,e,i){let n=t.pos,{parser:s}=this,r=Bp?this.stackID(t)+" -> ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let e=t.curContext&&t.curContext.tracker.strict,i=e?t.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(t.state,o.type.id):-1;if(n>-1&&o.length&&(!e||(o.prop(Jo.contextHash)||0)==i))return t.useNode(o,n),Bp&&console.log(r+this.stackID(t)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof oa)||0==o.children.length||o.positions[0]>0)break;let a=o.children[0];if(!(a instanceof oa&&0==o.positions[0]))break;o=a}}let o=s.stateSlot(t.state,4);if(o>0)return t.reduce(o),Bp&&console.log(r+this.stackID(t)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let o=0;o<a.length;){let l=a[o++],h=a[o++],c=a[o++],f=o==a.length||!i,u=f?t:t.split(),d=this.tokens.mainToken;if(u.apply(l,h,d?d.start:u.pos,c),Bp&&console.log(r+this.stackID(u)+` (via ${0==(65536&l)?"shift":`reduce of ${s.getName(65535&l)}`} for ${s.getName(h)} @ ${n}${u==t?"":", split"})`),f)return!0;u.pos>n?e.push(u):i.push(u)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Fp(t,e),!0}}runRecovery(t,e,i){let n=null,s=!1;for(let r=0;r<t.length;r++){let o=t[r],a=e[r<<1],l=e[1+(r<<1)],h=Bp?this.stackID(o)+" -> ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),Bp&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),f=h;for(let t=0;c.forceReduce()&&t<10;t++){if(Bp&&console.log(f+this.stackID(c)+" (via force-reduce)"),this.advanceFully(c,i))break;Bp&&(f=this.stackID(c)+" -> ")}for(let t of o.recoverByInsert(a))Bp&&console.log(h+this.stackID(t)+" (via recover-insert)"),this.advanceFully(t,i);this.stream.end>o.pos?(l==o.pos&&(l++,a=0),o.recoverByDelete(a,l),Bp&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(a)})`),Fp(o,i)):(!n||n.score<o.score)&&(n=o)}return n}stackToTree(t){return t.close(),oa.build({buffer:Yp.create(t),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:t.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(t){let e=(Gp||(Gp=new WeakMap)).get(t);return e||Gp.set(t,e=String.fromCodePoint(this.nextStackID++)),e+t}}function Fp(t,e){for(let i=0;i<e.length;i++){let n=e[i];if(n.pos==t.pos&&n.sameState(t))return void(e[i].score<t.score&&(e[i]=t))}e.push(t)}class Jp{constructor(t,e,i){this.source=t,this.flags=e,this.disabled=i}allows(t){return!this.disabled||0==this.disabled[t]}}const Kp=t=>t;class tO extends $a{constructor(t){if(super(),this.wrappers=[],14!=t.version)throw new RangeError(`Parser version (${t.version}) doesn't match runtime version (14)`);let e=t.nodeNames.split(" ");this.minRepeatTerm=e.length;for(let i=0;i<t.repeatNodeCount;i++)e.push("");let i=Object.keys(t.topRules).map((e=>t.topRules[e][1])),n=[];for(let t=0;t<e.length;t++)n.push([]);function s(t,e,i){n[t].push([e,e.deserialize(String(i))])}if(t.nodeProps)for(let e of t.nodeProps){let t=e[0];"string"==typeof t&&(t=Jo[t]);for(let i=1;i<e.length;){let n=e[i++];if(n>=0)s(n,t,e[i++]);else{let r=e[i+-n];for(let o=-n;o>0;o--)s(e[i++],t,r);i++}}}this.nodeSet=new ia(e.map(((e,s)=>ea.define({name:s>=this.minRepeatTerm?void 0:e,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:t.skippedNodes&&t.skippedNodes.indexOf(s)>-1})))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=Uo;let r=Wp(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let t=0;t<this.specializerSpecs.length;t++)this.specialized[t]=this.specializerSpecs[t].term;this.specializers=this.specializerSpecs.map(iO),this.states=Wp(t.states,Uint32Array),this.data=Wp(t.stateData),this.goto=Wp(t.goto),this.maxTerm=t.maxTerm,this.tokenizers=t.tokenizers.map((t=>"number"==typeof t?new Ep(r,t):t)),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new Hp(this,t,e,i);for(let s of this.wrappers)n=s(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let s=n[e+1];;){let e=n[s++],r=1&e,o=n[s++];if(r&&i)return o;for(let i=s+(e>>1);s<i;s++)if(n[s]==t)return o;if(r)return-1}}hasAction(t,e){let i=this.data;for(let n=0;n<2;n++)for(let s,r=this.stateSlot(t,n?2:1);;r+=3){if(65535==(s=i[r])){if(1!=i[r+1]){if(2==i[r+1])return eO(i,r+2);break}s=i[r=eO(i,r+2)]}if(s==e||0==s)return eO(i,r+1)}return 0}stateSlot(t,e){return this.states[6*t+e]}stateFlag(t,e){return(this.stateSlot(t,0)&e)>0}validAction(t,e){return!!this.allActions(t,(t=>t==e||null))}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let i=this.stateSlot(t,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=eO(this.data,i+2)}n=e(eO(this.data,i+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=eO(this.data,i+2)}if(0==(1&this.data[i+2])){let t=this.data[i+1];e.some(((e,i)=>1&i&&e==t))||e.push(this.data[i],t)}}return e}configure(t){let e=Object.assign(Object.create(tO.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map((e=>{let i=t.tokenizers.find((t=>t.from==e));return i?i.to:e}))),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=t.specializers.find((t=>t.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return e.specializers[n]=iO(r),r}))),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),null!=t.strict&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),null!=t.bufferLength&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return null==e?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map((()=>!1));if(t)for(let n of t.split(" ")){let t=e.indexOf(n);t>=0&&(i[t]=!0)}let n=null;for(let t=0;t<e.length;t++)if(!i[t])for(let i,s=this.dialects[e[t]];65535!=(i=this.data[s++]);)(n||(n=new Uint8Array(this.maxTerm+1)))[i]=1;return new Jp(t,i,n)}static deserialize(t){return new tO(t)}}function eO(t,e){return t[e]|t[e+1]<<16}function iO(t){if(t.external){let e=t.extend?1:0;return(i,n)=>t.external(i,n)<<1|e}return t.get}const nO=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],sO=new class{constructor(t){this.start=t.start,this.shift=t.shift||Kp,this.reduce=t.reduce||Kp,this.reuse=t.reuse||Kp,this.hash=t.hash||(()=>0),this.strict=!1!==t.strict}}({start:!1,shift:(t,e)=>4==e||5==e||312==e?t:313==e,strict:!1}),rO=new _p(((t,e)=>{let{next:i}=t;(125==i||-1==i||e.context)&&t.acceptToken(310)}),{contextual:!0,fallback:!0}),oO=new _p(((t,e)=>{let i,{next:n}=t;nO.indexOf(n)>-1||(47!=n||47!=(i=t.peek(1))&&42!=i)&&(125==n||59==n||-1==n||e.context||t.acceptToken(309))}),{contextual:!0}),aO=new _p(((t,e)=>{let{next:i}=t;if((43==i||45==i)&&(t.advance(),i==t.next)){t.advance();let i=!e.context&&e.canShift(1);t.acceptToken(i?1:2)}}),{contextual:!0});function lO(t,e){return t>=65&&t<=90||t>=97&&t<=122||95==t||t>=192||!e&&t>=48&&t<=57}const hO=new _p(((t,e)=>{if(60!=t.next||!e.dialectEnabled(0))return;if(t.advance(),47==t.next)return;let i=0;for(;nO.indexOf(t.next)>-1;)t.advance(),i++;if(lO(t.next,!0)){for(t.advance(),i++;lO(t.next,!1);)t.advance(),i++;for(;nO.indexOf(t.next)>-1;)t.advance(),i++;if(44==t.next)return;for(let e=0;;e++){if(7==e){if(!lO(t.next,!0))return;break}if(t.next!="extends".charCodeAt(e))break;t.advance(),i++}}t.acceptToken(3,-i)})),cO=Ra({"get set async static":tl.modifier,"for while do if else switch try catch finally return throw break continue default case":tl.controlKeyword,"in of await yield void typeof delete instanceof":tl.operatorKeyword,"let var const using function class extends":tl.definitionKeyword,"import export from":tl.moduleKeyword,"with debugger as new":tl.keyword,TemplateString:tl.special(tl.string),super:tl.atom,BooleanLiteral:tl.bool,this:tl.self,null:tl.null,Star:tl.modifier,VariableName:tl.variableName,"CallExpression/VariableName TaggedTemplateExpression/VariableName":tl.function(tl.variableName),VariableDefinition:tl.definition(tl.variableName),Label:tl.labelName,PropertyName:tl.propertyName,PrivatePropertyName:tl.special(tl.propertyName),"CallExpression/MemberExpression/PropertyName":tl.function(tl.propertyName),"FunctionDeclaration/VariableDefinition":tl.function(tl.definition(tl.variableName)),"ClassDeclaration/VariableDefinition":tl.definition(tl.className),PropertyDefinition:tl.definition(tl.propertyName),PrivatePropertyDefinition:tl.definition(tl.special(tl.propertyName)),UpdateOp:tl.updateOperator,"LineComment Hashbang":tl.lineComment,BlockComment:tl.blockComment,Number:tl.number,String:tl.string,Escape:tl.escape,ArithOp:tl.arithmeticOperator,LogicOp:tl.logicOperator,BitOp:tl.bitwiseOperator,CompareOp:tl.compareOperator,RegExp:tl.regexp,Equals:tl.definitionOperator,Arrow:tl.function(tl.punctuation),": Spread":tl.punctuation,"( )":tl.paren,"[ ]":tl.squareBracket,"{ }":tl.brace,"InterpolationStart InterpolationEnd":tl.special(tl.brace),".":tl.derefOperator,", ;":tl.separator,"@":tl.meta,TypeName:tl.typeName,TypeDefinition:tl.definition(tl.typeName),"type enum interface implements namespace module declare":tl.definitionKeyword,"abstract global Privacy readonly override":tl.modifier,"is keyof unique infer":tl.operatorKeyword,JSXAttributeValue:tl.attributeValue,JSXText:tl.content,"JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag":tl.angleBracket,"JSXIdentifier JSXNameSpacedName":tl.tagName,"JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName":tl.attributeName,"JSXBuiltin/JSXIdentifier":tl.standard(tl.tagName)}),fO={__proto__:null,export:18,as:23,from:31,default:34,async:39,function:40,extends:52,this:56,true:64,false:64,null:76,void:80,typeof:84,super:102,new:136,delete:152,yield:161,await:165,class:170,public:227,private:227,protected:227,readonly:229,instanceof:248,satisfies:251,in:252,const:254,import:286,keyof:339,unique:343,infer:349,is:385,abstract:405,implements:407,type:409,let:412,var:414,using:417,interface:423,enum:427,namespace:433,module:435,declare:439,global:443,for:462,of:471,while:474,with:478,do:482,if:486,else:488,switch:492,case:498,try:504,catch:508,finally:512,return:516,throw:520,break:524,continue:528,debugger:532},uO={__proto__:null,async:123,get:125,set:127,declare:187,public:189,private:189,protected:189,static:191,abstract:193,override:195,readonly:201,accessor:203,new:389},dO={__proto__:null,"<":143},pO=tO.deserialize({version:14,states:"$<UO%TQ^OOO%[Q^OOO'_Q`OOP(lOWOOO*zQ08SO'#ChO+RO!bO'#CiO+aO#tO'#CiO+oO?MpO'#D^O.QQ^O'#DdO.bQ^O'#DoO%[Q^O'#DyO0fQ^O'#EROOQ07b'#EZ'#EZO1PQWO'#EWOOQO'#El'#ElOOQO'#Ie'#IeO1XQWO'#GmO1dQWO'#EkO1iQWO'#EkO3kQ08SO'#JiO6[Q08SO'#JjO6xQWO'#FZO6}Q&jO'#FqOOQ07b'#Fc'#FcO7YO,YO'#FcO7hQ7[O'#FxO9UQWO'#FwOOQ07b'#Jj'#JjOOQ07`'#Ji'#JiO9ZQWO'#GqOOQU'#KU'#KUO9fQWO'#IRO9kQ07hO'#ISOOQU'#JW'#JWOOQU'#IW'#IWQ`Q^OOO`Q^OOO%[Q^O'#DqO9sQ^O'#D}O9zQ^O'#EPO9aQWO'#GmO:RQ7[O'#CnO:aQWO'#EjO:lQWO'#EuO:qQ7[O'#FbO;`QWO'#GmOOQO'#KV'#KVO;eQWO'#KVO;sQWO'#GuO;sQWO'#GvO;sQWO'#GxO9aQWO'#G{O<jQWO'#HOO>RQWO'#CdO>cQWO'#H[O>kQWO'#HbO>kQWO'#HdO`Q^O'#HfO>kQWO'#HhO>kQWO'#HkO>pQWO'#HqO>uQ07iO'#HwO%[Q^O'#HyO?QQ07iO'#H{O?]Q07iO'#H}O9kQ07hO'#IPO?hQ08SO'#ChO@jQ`O'#DiQOQWOOO%[Q^O'#EPOAQQWO'#ESO:RQ7[O'#EjOA]QWO'#EjOAhQpO'#FbOOQU'#Cf'#CfOOQ07`'#Dn'#DnOOQ07`'#Jm'#JmO%[Q^O'#JmOOQO'#Jq'#JqOOQO'#Ib'#IbOBhQ`O'#EcOOQ07`'#Eb'#EbOCdQ07pO'#EcOCnQ`O'#EVOOQO'#Jp'#JpODSQ`O'#JqOEaQ`O'#EVOCnQ`O'#EcPEnO!0LbO'#CaPOOO)CDu)CDuOOOO'#IX'#IXOEyO!bO,59TOOQ07b,59T,59TOOOO'#IY'#IYOFXO#tO,59TO%[Q^O'#D`OOOO'#I['#I[OFgO?MpO,59xOOQ07b,59x,59xOFuQ^O'#I]OGYQWO'#JkOI[QrO'#JkO+}Q^O'#JkOIcQWO,5:OOIyQWO'#ElOJWQWO'#JyOJcQWO'#JxOJcQWO'#JxOJkQWO,5;YOJpQWO'#JwOOQ07f,5:Z,5:ZOJwQ^O,5:ZOLxQ08SO,5:eOMiQWO,5:mONSQ07hO'#JvONZQWO'#JuO9ZQWO'#JuONoQWO'#JuONwQWO,5;XON|QWO'#JuO!#UQrO'#JjOOQ07b'#Ch'#ChO%[Q^O'#ERO!#tQpO,5:rOOQO'#Jr'#JrOOQO-E<c-E<cO9aQWO,5=XO!$[QWO,5=XO!$aQ^O,5;VO!&dQ7[O'#EgO!'}QWO,5;VO!)mQ7[O'#DsO!)tQ^O'#DxO!*OQ`O,5;`O!*WQ`O,5;`O%[Q^O,5;`OOQU'#FR'#FROOQU'#FT'#FTO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aOOQU'#FX'#FXO!*fQ^O,5;rOOQ07b,5;w,5;wOOQ07b,5;x,5;xO!,iQWO,5;xOOQ07b,5;y,5;yO%[Q^O'#IiO!,qQ07hO,5<eO!&dQ7[O,5;aO!-`Q7[O,5;aO%[Q^O,5;uO!-gQ&jO'#FgO!.dQ&jO'#J}O!.OQ&jO'#J}O!.kQ&jO'#J}OOQO'#J}'#J}O!/PQ&jO,5<POOOS,5<],5<]O!/bQ^O'#FsOOOS'#Ih'#IhO7YO,YO,5;}O!/iQ&jO'#FuOOQ07b,5;},5;}O!0YQMhO'#CuOOQ07b'#Cy'#CyO!0mQWO'#CyO!0rO?MpO'#C}O!1`Q7[O,5<bO!1gQWO,5<dO!3SQ!LQO'#GSO!3aQWO'#GTO!3fQWO'#GTO!3kQ!LQO'#GXO!4jQ`O'#G]OOQO'#Gh'#GhO!(SQ7[O'#GgOOQO'#Gj'#GjO!(SQ7[O'#GiO!5]QMhO'#JdOOQ07b'#Jd'#JdO!5gQWO'#JcO!5uQWO'#JbO!5}QWO'#CtOOQ07b'#Cw'#CwOOQ07b'#DR'#DROOQ07b'#DT'#DTO1SQWO'#DVO!(SQ7[O'#FzO!(SQ7[O'#F|O!6VQWO'#GOO!6[QWO'#GPO!3fQWO'#GVO!(SQ7[O'#G[O!6aQWO'#EmO!7OQWO,5<cOOQ07`'#Cq'#CqO!7WQWO'#EnO!8QQ`O'#EoOOQ07`'#Jw'#JwO!8XQ07hO'#KWO9kQ07hO,5=]O`Q^O,5>mOOQU'#J`'#J`OOQU,5>n,5>nOOQU-E<U-E<UO!:ZQ08SO,5:]O!<wQ08SO,5:iO%[Q^O,5:iO!?bQ08SO,5:kOOQO,5@q,5@qO!@RQ7[O,5=XO!@aQ07hO'#JaO9UQWO'#JaO!@rQ07hO,59YO!@}Q`O,59YO!AVQ7[O,59YO:RQ7[O,59YO!AbQWO,5;VO!AjQWO'#HZO!BOQWO'#KZO%[Q^O,5;zO!7{Q`O,5;|O!BWQWO,5=tO!B]QWO,5=tO!BbQWO,5=tO9kQ07hO,5=tO;sQWO,5=dOOQO'#Cu'#CuO!BpQ`O,5=aO!BxQ7[O,5=bO!CTQWO,5=dO!CYQpO,5=gO!CbQWO'#KVO>pQWO'#HQO9aQWO'#HSO!CgQWO'#HSO:RQ7[O'#HUO!ClQWO'#HUOOQU,5=j,5=jO!CqQWO'#HVO!DSQWO'#CnO!DXQWO,59OO!DcQWO,59OO!FhQ^O,59OOOQU,59O,59OO!FxQ07hO,59OO%[Q^O,59OO!ITQ^O'#H^OOQU'#H_'#H_OOQU'#H`'#H`O`Q^O,5=vO!IkQWO,5=vO`Q^O,5=|O`Q^O,5>OO!IpQWO,5>QO`Q^O,5>SO!IuQWO,5>VO!IzQ^O,5>]OOQU,5>c,5>cO%[Q^O,5>cO9kQ07hO,5>eOOQU,5>g,5>gO!NUQWO,5>gOOQU,5>i,5>iO!NUQWO,5>iOOQU,5>k,5>kO!NZQ`O'#D[O%[Q^O'#JmO!NxQ`O'#JmO# gQ`O'#DjO# xQ`O'#DjO#$ZQ^O'#DjO#$bQWO'#JlO#$jQWO,5:TO#$oQWO'#EpO#$}QWO'#JzO#%VQWO,5;ZO#%[Q`O'#DjO#%iQ`O'#EUOOQ07b,5:n,5:nO%[Q^O,5:nO#%pQWO,5:nO>pQWO,5;UO!@}Q`O,5;UO!AVQ7[O,5;UO:RQ7[O,5;UO#%xQWO,5@XO#%}Q$ISO,5:rOOQO-E<`-E<`O#'TQ07pO,5:}OCnQ`O,5:qO#'_Q`O,5:qOCnQ`O,5:}O!@rQ07hO,5:qOOQ07`'#Ef'#EfOOQO,5:},5:}O%[Q^O,5:}O#'lQ07hO,5:}O#'wQ07hO,5:}O!@}Q`O,5:qOOQO,5;T,5;TO#(VQ07hO,5:}POOO'#IV'#IVP#(kO!0LbO,58{POOO,58{,58{OOOO-E<V-E<VOOQ07b1G.o1G.oOOOO-E<W-E<WO#(vQpO,59zOOOO-E<Y-E<YOOQ07b1G/d1G/dO#({QrO,5>wO+}Q^O,5>wOOQO,5>},5>}O#)VQ^O'#I]OOQO-E<Z-E<ZO#)dQWO,5@VO#)lQrO,5@VO#)sQWO,5@dOOQ07b1G/j1G/jO%[Q^O,5@eO#){QWO'#IcOOQO-E<a-E<aO#)sQWO,5@dOOQ07`1G0t1G0tOOQ07f1G/u1G/uOOQ07f1G0X1G0XO%[Q^O,5@bO#*aQ07hO,5@bO#*rQ07hO,5@bO#*yQWO,5@aO9ZQWO,5@aO#+RQWO,5@aO#+aQWO'#IfO#*yQWO,5@aOOQ07`1G0s1G0sO!*OQ`O,5:tO!*ZQ`O,5:tOOQO,5:v,5:vO#,RQWO,5:vO#,ZQ7[O1G2sO9aQWO1G2sOOQ07b1G0q1G0qO#,iQ08SO1G0qO#-nQ08QO,5;ROOQ07b'#GR'#GRO#.[Q08SO'#JdO!$aQ^O1G0qO#0dQ7[O'#JnO#0nQWO,5:_O#0sQrO'#JoO%[Q^O'#JoO#0}QWO,5:dOOQ07b'#D['#D[OOQ07b1G0z1G0zO%[Q^O1G0zOOQ07b1G1d1G1dO#1SQWO1G0zO#3kQ08SO1G0{O#3rQ08SO1G0{O#6]Q08SO1G0{O#6dQ08SO1G0{O#8nQ08SO1G0{O#9UQ08SO1G0{O#<OQ08SO1G0{O#<VQ08SO1G0{O#>jQ08SO1G0{O#>wQ08SO1G0{O#@uQ08SO1G0{O#CuQ(CYO'#ChO#EsQ(CYO1G1^O#EzQ(CYO'#JjO!,lQWO1G1dO#F[Q08SO,5?TOOQ07`-E<g-E<gO#GOQ08SO1G0{OOQ07b1G0{1G0{O#IZQ08SO1G1aO#I}Q&jO,5<TO#JVQ&jO,5<UO#J_Q&jO'#FlO#JvQWO'#FkOOQO'#KO'#KOOOQO'#Ig'#IgO#J{Q&jO1G1kOOQ07b1G1k1G1kOOOS1G1v1G1vO#K^Q(CYO'#JiO#KhQWO,5<_O!*fQ^O,5<_OOOS-E<f-E<fOOQ07b1G1i1G1iO#KmQ`O'#J}OOQ07b,5<a,5<aO#KuQ`O,5<aOOQ07b,59e,59eO!&dQ7[O'#DPOOOO'#IZ'#IZO#KzO?MpO,59iOOQ07b,59i,59iO%[Q^O1G1|O!6[QWO'#IkO#LVQ7[O,5<uOOQ07b,5<r,5<rO!(SQ7[O'#InO#LuQ7[O,5=RO!(SQ7[O'#IpO#MhQ7[O,5=TO!&dQ7[O,5=VOOQO1G2O1G2OO#MrQpO'#CqO#NVQpO,5<nO#N^QWO'#KRO9aQWO'#KRO#NlQWO,5<pO!(SQ7[O,5<oO#NqQWO'#GUO#N|QWO,5<oO$ RQpO'#GRO$ `QpO'#KSO$ jQWO'#KSO!&dQ7[O'#KSO$ oQWO,5<sO$ tQ`O'#G^O!4eQ`O'#G^O$!VQWO'#G`O$![QWO'#GbO!3fQWO'#GeO$!aQ07hO'#ImO$!lQ`O,5<wOOQ07f,5<w,5<wO$!sQ`O'#G^O$#RQ`O'#G_O$#ZQ`O'#G_O$#`Q7[O,5=RO$#pQ7[O,5=TOOQ07b,5=W,5=WO!(SQ7[O,5?}O!(SQ7[O,5?}O$$QQWO'#IrO$$]QWO,5?|O$$eQWO,59`O$%UQ7[O,59qOOQ07b,59q,59qO$%wQ7[O,5<fO$&jQ7[O,5<hO@bQWO,5<jOOQ07b,5<k,5<kO$&tQWO,5<qO$&yQ7[O,5<vO$'ZQWO'#JuO!$aQ^O1G1}O$'`QWO1G1}O9ZQWO'#JxO9ZQWO'#EpO%[Q^O'#EpO9ZQWO'#ItO$'eQ07hO,5@rOOQU1G2w1G2wOOQU1G4X1G4XOOQ07b1G/w1G/wO!,iQWO1G/wO$)jQ08SO1G0TOOQU1G2s1G2sO!&dQ7[O1G2sO%[Q^O1G2sO#,^QWO1G2sO$+nQ7[O'#EgOOQ07`,5?{,5?{O$+xQ07hO,5?{OOQU1G.t1G.tO!@rQ07hO1G.tO!@}Q`O1G.tO!AVQ7[O1G.tO$,ZQWO1G0qO$,`QWO'#ChO$,kQWO'#K[O$,sQWO,5=uO$,xQWO'#K[O$,}QWO'#K[O$-]QWO'#IzO$-kQWO,5@uO$-sQrO1G1fOOQ07b1G1h1G1hO9aQWO1G3`O@bQWO1G3`O$-zQWO1G3`O$.PQWO1G3`OOQU1G3`1G3`O!CTQWO1G3OO!&dQ7[O1G2{O$.UQWO1G2{OOQU1G2|1G2|O!&dQ7[O1G2|O$.ZQWO1G2|O$.cQ`O'#GzOOQU1G3O1G3OO!4eQ`O'#IvO!CYQpO1G3ROOQU1G3R1G3ROOQU,5=l,5=lO$.kQ7[O,5=nO9aQWO,5=nO$![QWO,5=pO9UQWO,5=pO!@}Q`O,5=pO!AVQ7[O,5=pO:RQ7[O,5=pO$.yQWO'#KYO$/UQWO,5=qOOQU1G.j1G.jO$/ZQ07hO1G.jO@bQWO1G.jO$/fQWO1G.jO9kQ07hO1G.jO$1kQrO,5@wO$1{QWO,5@wO9ZQWO,5@wO$2WQ^O,5=xO$2_QWO,5=xOOQU1G3b1G3bO`Q^O1G3bOOQU1G3h1G3hOOQU1G3j1G3jO>kQWO1G3lO$2dQ^O1G3nO$6hQ^O'#HmOOQU1G3q1G3qO$6uQWO'#HsO>pQWO'#HuOOQU1G3w1G3wO$6}Q^O1G3wO9kQ07hO1G3}OOQU1G4P1G4POOQ07`'#GY'#GYO9kQ07hO1G4RO9kQ07hO1G4TO$;UQWO,5@XO!*fQ^O,5;[O9ZQWO,5;[O>pQWO,5:UO!*fQ^O,5:UO!@}Q`O,5:UO$;ZQ(CYO,5:UOOQO,5;[,5;[O$;eQ`O'#I^O$;{QWO,5@WOOQ07b1G/o1G/oO$<TQ`O'#IdO$<_QWO,5@fOOQ07`1G0u1G0uO# xQ`O,5:UOOQO'#Ia'#IaO$<gQ`O,5:pOOQ07f,5:p,5:pO#%sQWO1G0YOOQ07b1G0Y1G0YO%[Q^O1G0YOOQ07b1G0p1G0pO>pQWO1G0pO!@}Q`O1G0pO!AVQ7[O1G0pOOQ07`1G5s1G5sO!@rQ07hO1G0]OOQO1G0i1G0iO%[Q^O1G0iO$<nQ07hO1G0iO$<yQ07hO1G0iO!@}Q`O1G0]OCnQ`O1G0]O$=XQ07hO1G0iOOQO1G0]1G0]O$=mQ08SO1G0iPOOO-E<T-E<TPOOO1G.g1G.gOOOO1G/f1G/fO$=wQpO,5<eO$>PQrO1G4cOOQO1G4i1G4iO%[Q^O,5>wO$>ZQWO1G5qO$>cQWO1G6OO$>kQrO1G6PO9ZQWO,5>}O$>uQ08SO1G5|O%[Q^O1G5|O$?VQ07hO1G5|O$?hQWO1G5{O$?hQWO1G5{O9ZQWO1G5{O$?pQWO,5?QO9ZQWO,5?QOOQO,5?Q,5?QO$@UQWO,5?QO$'ZQWO,5?QOOQO-E<d-E<dOOQO1G0`1G0`OOQO1G0b1G0bO!,lQWO1G0bOOQU7+(_7+(_O!&dQ7[O7+(_O%[Q^O7+(_O$@dQWO7+(_O$@oQ7[O7+(_O$@}Q08SO,5=RO$CYQ08SO,5=TO$EeQ08SO,5=RO$GvQ08SO,5=TO$JXQ08SO,59qO$LaQ08SO,5<fO$NlQ08SO,5<hO%!wQ08SO,5<vOOQ07b7+&]7+&]O%%YQ08SO7+&]O%%|Q7[O'#I_O%&WQWO,5@YOOQ07b1G/y1G/yO%&`Q^O'#I`O%&mQWO,5@ZO%&uQrO,5@ZOOQ07b1G0O1G0OO%'PQWO7+&fOOQ07b7+&f7+&fO%'UQ(CYO,5:eO%[Q^O7+&xO%'`Q(CYO,5:]O%'mQ(CYO,5:iO%'wQ(CYO,5:kOOQ07b7+'O7+'OOOQO1G1o1G1oOOQO1G1p1G1pO%(RQtO,5<WO!*fQ^O,5<VOOQO-E<e-E<eOOQ07b7+'V7+'VOOOS7+'b7+'bOOOS1G1y1G1yO%(^QWO1G1yOOQ07b1G1{1G1{O%(cQpO,59kOOOO-E<X-E<XOOQ07b1G/T1G/TO%(jQ08SO7+'hOOQ07b,5?V,5?VO%)^QpO,5?VOOQ07b1G2a1G2aP!&dQ7[O'#IkPOQ07b-E<i-E<iO%)|Q7[O,5?YOOQ07b-E<l-E<lO%*oQ7[O,5?[OOQ07b-E<n-E<nO%*yQpO1G2qOOQ07b1G2Y1G2YO%+QQWO'#IjO%+`QWO,5@mO%+`QWO,5@mO%+hQWO,5@mO%+sQWO,5@mOOQO1G2[1G2[O%,RQ7[O1G2ZO!(SQ7[O1G2ZO%,cQ!LQO'#IlO%,sQWO,5@nO!&dQ7[O,5@nO%,{QpO,5@nOOQ07b1G2_1G2_OOQ07`,5<x,5<xOOQ07`,5<y,5<yO$'ZQWO,5<yOC_QWO,5<yO!@}Q`O,5<xOOQO'#Ga'#GaO%-VQWO,5<zOOQ07`,5<|,5<|O$'ZQWO,5=POOQO,5?X,5?XOOQO-E<k-E<kOOQ07f1G2c1G2cO!4eQ`O,5<xO%-_QWO,5<yO$!VQWO,5<zO!4eQ`O,5<yO!(SQ7[O'#InO%.RQ7[O1G2mO!(SQ7[O'#IpO%.tQ7[O1G2oO%/OQ7[O1G5iO%/YQ7[O1G5iOOQO,5?^,5?^OOQO-E<p-E<pOOQO1G.z1G.zO!7{Q`O,59sO%[Q^O,59sO%/gQWO1G2UO!(SQ7[O1G2]O%/lQ08SO7+'iOOQ07b7+'i7+'iO!$aQ^O7+'iO%0`QWO,5;[OOQ07`,5?`,5?`OOQ07`-E<r-E<rOOQ07b7+%c7+%cO%0eQpO'#KTO#%sQWO7+(_O%0oQrO7+(_O$@gQWO7+(_O%0vQ08QO'#ChO%1ZQ08QO,5<}O%1{QWO,5<}OOQ07`1G5g1G5gOOQU7+$`7+$`O!@rQ07hO7+$`O!@}Q`O7+$`O!$aQ^O7+&]O%2QQWO'#IyO%2iQWO,5@vOOQO1G3a1G3aO9aQWO,5@vO%2iQWO,5@vO%2qQWO,5@vOOQO,5?f,5?fOOQO-E<x-E<xOOQ07b7+'Q7+'QO%2vQWO7+(zO9kQ07hO7+(zO9aQWO7+(zO@bQWO7+(zOOQU7+(j7+(jO%2{Q08QO7+(gO!&dQ7[O7+(gO%3VQpO7+(hOOQU7+(h7+(hO!&dQ7[O7+(hO%3^QWO'#KXO%3iQWO,5=fOOQO,5?b,5?bOOQO-E<t-E<tOOQU7+(m7+(mO%4xQ`O'#HTOOQU1G3Y1G3YO!&dQ7[O1G3YO%[Q^O1G3YO%5PQWO1G3YO%5[Q7[O1G3YO9kQ07hO1G3[O$![QWO1G3[O9UQWO1G3[O!@}Q`O1G3[O!AVQ7[O1G3[O%5jQWO'#IxO%6OQWO,5@tO%6WQ`O,5@tOOQ07`1G3]1G3]OOQU7+$U7+$UO@bQWO7+$UO9kQ07hO7+$UO%6cQWO7+$UO%[Q^O1G6cO%[Q^O1G6dO%6hQ07hO1G6cO%6rQ^O1G3dO%6yQWO1G3dO%7OQ^O1G3dOOQU7+(|7+(|O9kQ07hO7+)WO`Q^O7+)YOOQU'#K_'#K_OOQU'#I{'#I{O%7VQ^O,5>XOOQU,5>X,5>XO%[Q^O'#HnO%7dQWO'#HpOOQU,5>_,5>_O9ZQWO,5>_OOQU,5>a,5>aOOQU7+)c7+)cOOQU7+)i7+)iOOQU7+)m7+)mOOQU7+)o7+)oO%7iQ`O1G5sO%7}Q(CYO1G0vO%8XQWO1G0vOOQO1G/p1G/pO%8dQ(CYO1G/pO>pQWO1G/pO!*fQ^O'#DjOOQO,5>x,5>xOOQO-E<[-E<[OOQO,5?O,5?OOOQO-E<b-E<bO!@}Q`O1G/pOOQO-E<_-E<_OOQ07f1G0[1G0[OOQ07b7+%t7+%tO#%sQWO7+%tOOQ07b7+&[7+&[O>pQWO7+&[O!@}Q`O7+&[OOQO7+%w7+%wO$=mQ08SO7+&TOOQO7+&T7+&TO%[Q^O7+&TO%8nQ07hO7+&TO!@rQ07hO7+%wO!@}Q`O7+%wO%8yQ07hO7+&TO%9XQ08SO7++hO%[Q^O7++hO%9iQWO7++gO%9iQWO7++gOOQO1G4l1G4lO9ZQWO1G4lO%9qQWO1G4lOOQO7+%|7+%|O#%sQWO<<KyO%0oQrO<<KyO%:PQWO<<KyOOQU<<Ky<<KyO!&dQ7[O<<KyO%[Q^O<<KyO%:XQWO<<KyO%:dQ08SO,5?YO%<oQ08SO,5?[O%>zQ08SO1G2ZO%A]Q08SO1G2mO%ChQ08SO1G2oO%EsQ7[O,5>yOOQO-E<]-E<]O%E}QrO,5>zO%[Q^O,5>zOOQO-E<^-E<^O%FXQWO1G5uOOQ07b<<JQ<<JQO%FaQ(CYO1G0qO%HkQ(CYO1G0{O%HrQ(CYO1G0{O%JvQ(CYO1G0{O%J}Q(CYO1G0{O%LrQ(CYO1G0{O%MYQ(CYO1G0{O& mQ(CYO1G0{O& tQ(CYO1G0{O&#rQ(CYO1G0{O&$PQ(CYO1G0{O&%}Q(CYO1G0{O&&bQ08SO<<JdO&'gQ(CYO1G0{O&)]Q(CYO'#JdO&+`Q(CYO1G1aO&+mQ(CYO1G0TO!*fQ^O'#FnOOQO'#KP'#KPOOQO1G1r1G1rO&+wQWO1G1qO&+|Q(CYO,5?TOOOS7+'e7+'eOOOO1G/V1G/VOOQ07b1G4q1G4qO!(SQ7[O7+(]O&,WQWO,5?UO9aQWO,5?UOOQO-E<h-E<hO&,fQWO1G6XO&,fQWO1G6XO&,nQWO1G6XO&,yQ7[O7+'uO&-ZQpO,5?WO&-eQWO,5?WO!&dQ7[O,5?WOOQO-E<j-E<jO&-jQpO1G6YO&-tQWO1G6YOOQ07`1G2e1G2eO$'ZQWO1G2eOOQ07`1G2d1G2dO&-|QWO1G2fO!&dQ7[O1G2fOOQ07`1G2k1G2kO!@}Q`O1G2dOC_QWO1G2eO&.RQWO1G2fO&.ZQWO1G2eO&.}Q7[O,5?YOOQ07b-E<m-E<mO&/pQ7[O,5?[OOQ07b-E<o-E<oO!(SQ7[O7++TOOQ07b1G/_1G/_O&/zQWO1G/_OOQ07b7+'p7+'pO&0PQ7[O7+'wO&0aQ08SO<<KTOOQ07b<<KT<<KTO&1TQWO1G0vO!&dQ7[O'#IsO&1YQWO,5@oO!&dQ7[O1G2iOOQU<<Gz<<GzO!@rQ07hO<<GzO&1bQ08SO<<IwOOQ07b<<Iw<<IwOOQO,5?e,5?eO&2UQWO,5?eO&2ZQWO,5?eOOQO-E<w-E<wO&2iQWO1G6bO&2iQWO1G6bO9aQWO1G6bO@bQWO<<LfOOQU<<Lf<<LfO&2qQWO<<LfO9kQ07hO<<LfOOQU<<LR<<LRO%2{Q08QO<<LROOQU<<LS<<LSO%3VQpO<<LSO&2vQ`O'#IuO&3RQWO,5@sO!*fQ^O,5@sOOQU1G3Q1G3QO&3ZQ^O'#JmOOQO'#Iw'#IwO9kQ07hO'#IwO&3eQ`O,5=oOOQU,5=o,5=oO&3lQ`O'#EcO&4QQWO7+(tO&4VQWO7+(tOOQU7+(t7+(tO!&dQ7[O7+(tO%[Q^O7+(tO&4_QWO7+(tOOQU7+(v7+(vO9kQ07hO7+(vO$![QWO7+(vO9UQWO7+(vO!@}Q`O7+(vO&4jQWO,5?dOOQO-E<v-E<vOOQO'#HW'#HWO&4uQWO1G6`O9kQ07hO<<GpOOQU<<Gp<<GpO@bQWO<<GpO&4}QWO7++}O&5SQWO7+,OO%[Q^O7++}O%[Q^O7+,OOOQU7+)O7+)OO&5XQWO7+)OO&5^Q^O7+)OO&5eQWO7+)OOOQU<<Lr<<LrOOQU<<Lt<<LtOOQU-E<y-E<yOOQU1G3s1G3sO&5jQWO,5>YOOQU,5>[,5>[O&5oQWO1G3yO9ZQWO7+&bO!*fQ^O7+&bOOQO7+%[7+%[O&5tQ(CYO1G6PO>pQWO7+%[OOQ07b<<I`<<I`OOQ07b<<Iv<<IvO>pQWO<<IvOOQO<<Io<<IoO$=mQ08SO<<IoO%[Q^O<<IoOOQO<<Ic<<IcO!@rQ07hO<<IcO&6OQ07hO<<IoO&6ZQ08SO<= SO&6kQWO<= ROOQO7+*W7+*WO9ZQWO7+*WOOQUANAeANAeO&6sQWOANAeO!&dQ7[OANAeO#%sQWOANAeO%0oQrOANAeO%[Q^OANAeO&6{Q08SO7+'uO&9^Q08SO,5?YO&;iQ08SO,5?[O&=tQ08SO7+'wO&@VQrO1G4fO&@aQ(CYO7+&]O&BeQ(CYO,5=RO&DlQ(CYO,5=TO&D|Q(CYO,5=RO&E^Q(CYO,5=TO&EnQ(CYO,59qO&GqQ(CYO,5<fO&ItQ(CYO,5<hO&KwQ(CYO,5<vO&MmQ(CYO7+'hO&MzQ(CYO7+'iO&NXQWO,5<YOOQO7+']7+']O&N^Q7[O<<KwOOQO1G4p1G4pO&NeQWO1G4pO&NpQWO1G4pO' OQWO7++sO' OQWO7++sO!&dQ7[O1G4rO' WQpO1G4rO' bQWO7++tOOQ07`7+(P7+(PO$'ZQWO7+(QO' jQpO7+(QOOQ07`7+(O7+(OO$'ZQWO7+(PO' qQWO7+(QO!&dQ7[O7+(QOC_QWO7+(PO' vQ7[O<<NoOOQ07b7+$y7+$yO'!QQpO,5?_OOQO-E<q-E<qO'![Q08QO7+(TOOQUAN=fAN=fO9aQWO1G5POOQO1G5P1G5PO'!lQWO1G5PO'!qQWO7++|O'!qQWO7++|O9kQ07hOANBQO@bQWOANBQOOQUANBQANBQOOQUANAmANAmOOQUANAnANAnO'!yQWO,5?aOOQO-E<s-E<sO'#UQ(CYO1G6_O'%fQrO'#ChOOQO,5?c,5?cOOQO-E<u-E<uOOQU1G3Z1G3ZO&3ZQ^O,5<zOOQU<<L`<<L`O!&dQ7[O<<L`O&4QQWO<<L`O'%pQWO<<L`O%[Q^O<<L`OOQU<<Lb<<LbO9kQ07hO<<LbO$![QWO<<LbO9UQWO<<LbO'%xQ`O1G5OO'&TQWO7++zOOQUAN=[AN=[O9kQ07hOAN=[OOQU<= i<= iOOQU<= j<= jO'&]QWO<= iO'&bQWO<= jOOQU<<Lj<<LjO'&gQWO<<LjO'&lQ^O<<LjOOQU1G3t1G3tO>pQWO7+)eO'&sQWO<<I|O''OQ(CYO<<I|OOQO<<Hv<<HvOOQ07bAN?bAN?bOOQOAN?ZAN?ZO$=mQ08SOAN?ZOOQOAN>}AN>}O%[Q^OAN?ZOOQO<<Mr<<MrOOQUG27PG27PO!&dQ7[OG27PO#%sQWOG27PO''YQWOG27PO%0oQrOG27PO''bQ(CYO<<JdO''oQ(CYO1G2ZO')eQ(CYO,5?YO'+hQ(CYO,5?[O'-kQ(CYO1G2mO'/nQ(CYO1G2oO'1qQ(CYO<<KTO'2OQ(CYO<<IwOOQO1G1t1G1tO!(SQ7[OANAcOOQO7+*[7+*[O'2]QWO7+*[O'2hQWO<= _O'2pQpO7+*^OOQ07`<<Kl<<KlO$'ZQWO<<KlOOQ07`<<Kk<<KkO'2zQpO<<KlO$'ZQWO<<KkOOQO7+*k7+*kO9aQWO7+*kO'3RQWO<= hOOQUG27lG27lO9kQ07hOG27lO!*fQ^O1G4{O'3ZQWO7++yO&4QQWOANAzOOQUANAzANAzO!&dQ7[OANAzO'3cQWOANAzOOQUANA|ANA|O9kQ07hOANA|O$![QWOANA|OOQO'#HX'#HXOOQO7+*j7+*jOOQUG22vG22vOOQUANETANETOOQUANEUANEUOOQUANBUANBUO'3kQWOANBUOOQU<<MP<<MPO!*fQ^OAN?hOOQOG24uG24uO$=mQ08SOG24uO#%sQWOLD,kOOQULD,kLD,kO!&dQ7[OLD,kO'3pQWOLD,kO'3xQ(CYO7+'uO'5nQ(CYO,5?YO'7qQ(CYO,5?[O'9tQ(CYO7+'wO';jQ7[OG26}OOQO<<Mv<<MvOOQ07`ANAWANAWO$'ZQWOANAWOOQ07`ANAVANAVOOQO<<NV<<NVOOQULD-WLD-WO';zQ(CYO7+*gOOQUG27fG27fO&4QQWOG27fO!&dQ7[OG27fOOQUG27hG27hO9kQ07hOG27hOOQUG27pG27pO'<UQ(CYOG25SOOQOLD*aLD*aOOQU!$(!V!$(!VO#%sQWO!$(!VO!&dQ7[O!$(!VO'<`Q08SOG26}OOQ07`G26rG26rOOQULD-QLD-QO&4QQWOLD-QOOQULD-SLD-SOOQU!)9Eq!)9EqO#%sQWO!)9EqOOQU!$(!l!$(!lOOQU!.K;]!.K;]O'>qQ(CYOG26}O!*fQ^O'#DyO1PQWO'#EWO'@gQrO'#JiO!*fQ^O'#DqO'@nQ^O'#D}O'@uQrO'#ChO'C]QrO'#ChO!*fQ^O'#EPO'CmQ^O,5;VO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O'#IiO'EpQWO,5<eO'ExQ7[O,5;aO'GcQ7[O,5;aO!*fQ^O,5;uO!&dQ7[O'#GgO'ExQ7[O'#GgO!&dQ7[O'#GiO'ExQ7[O'#GiO1SQWO'#DVO1SQWO'#DVO!&dQ7[O'#FzO'ExQ7[O'#FzO!&dQ7[O'#F|O'ExQ7[O'#F|O!&dQ7[O'#G[O'ExQ7[O'#G[O!*fQ^O,5:iO!*fQ^O,5@eO'CmQ^O1G0qO'GjQ(CYO'#ChO!*fQ^O1G1|O!&dQ7[O'#InO'ExQ7[O'#InO!&dQ7[O'#IpO'ExQ7[O'#IpO!&dQ7[O,5<oO'ExQ7[O,5<oO'CmQ^O1G1}O!*fQ^O7+&xO!&dQ7[O1G2ZO'ExQ7[O1G2ZO!&dQ7[O'#InO'ExQ7[O'#InO!&dQ7[O'#IpO'ExQ7[O'#IpO!&dQ7[O1G2]O'ExQ7[O1G2]O'CmQ^O7+'iO'CmQ^O7+&]O!&dQ7[OANAcO'ExQ7[OANAcO'GtQWO'#EkO'GyQWO'#EkO'HRQWO'#FZO'HWQWO'#EuO'H]QWO'#JyO'HhQWO'#JwO'HsQWO,5;VO'HxQ7[O,5<bO'IPQWO'#GTO'IUQWO'#GTO'IZQWO,5<cO'IcQWO,5;VO'IkQ(CYO1G1^O'IrQWO,5<oO'IwQWO,5<oO'I|QWO,5<qO'JRQWO,5<qO'JWQWO1G1}O'J]QWO1G0qO'JbQ7[O<<KwO'JiQ7[O<<KwO7hQ7[O'#FxO9UQWO'#FwOA]QWO'#EjO!*fQ^O,5;rO!3fQWO'#GTO!3fQWO'#GTO!3fQWO'#GVO!3fQWO'#GVO!(SQ7[O7+(]O!(SQ7[O7+(]O%*yQpO1G2qO%*yQpO1G2qO!&dQ7[O,5=VO!&dQ7[O,5=V",stateData:"'Km~O'tOS'uOSSOS'vRQ~OPYOQYORfOX!VO`qOczOdyOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![XO!fuO!kZO!nYO!oYO!pYO!rvO!twO!wxO!{]O#s!PO$T|O%b}O%d!QO%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO%s!UO&P!WO&V!XO&X!YO&Z!ZO&]![O&`!]O&f!^O&l!_O&n!`O&p!aO&r!bO&t!cO'{SO'}TO(QUO(XVO(g[O(tiO~OVtO~P`OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~O`!vOo!nO!P!oO!_!xO!`!uO!a!uO!{:dO#P!pO#Q!pO#R!wO#S!pO#T!pO#W!yO#X!yO'|!lO'}TO(QUO([!mO(g!sO~O'v!zO~OP[XZ[X`[Xn[X|[X}[X!P[X!Y[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X'r[X(X[X(h[X(o[X(p[X~O!d$|X~P(qO^!|O'}#OO(O!|O(P#OO~O^#PO(P#OO(Q#OO(R#PO~Ot#RO!R#SO(Y#SO(Z#UO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{:hO'}TO(QUO(XVO(g[O(tiO~O!X#YO!Y#VO!V(_P!V(lP~P+}O!Z#bO~P`OPYOQYORfOc!jOd!iOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'}TO(QUO(XVO(g[O(tiO~Ol#lO!X#hO!{]O#e#kO#f#hO'{:iO!j(iP~P.iO!k#nO'{#mO~O!w#rO!{]O%b#sO~O#g#tO~O!d#uO#g#tO~OP$]OZ$dOn$QO|#yO}#zO!P#{O!Y$aO!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O`(]X'r(]X'p(]X!j(]X!V(]X![(]X%c(]X!d(]X~P1qO#[$eO$O$eOP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#r(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X![(^X%c(^X~O`(^X!i(^X'r(^X'p(^X!V(^X!j(^Xr(^X!d(^X~P4XO#[$eO~O$Y$gO$[$fO$c$lO~ORfO![$mO$f$nO$h$pO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz%ZO!P${O![$|O!f%`O!k$xO#f%aO$T%^O$o%[O$q%]O$t%_O'{$rO'}TO(QUO(X$uO(o$}O(p%POf(UP~O!k%bO~O!P%eO![%fO'{%dO~O!d%jO~O`%kO'r%kO~O'|!lO~P%[O%h%rO~P%[Og%VO!k%bO'{%dO'|!lO~Od%yO!k%bO'{%dO~O#r$SO~O|&OO![%{O!k%}O%d&RO'{%dO'|!lO'}TO(QUO_(}P~O!w#rO~O%m&TO!P(yX![(yX'{(yX~O'{&UO~O!t&ZO#s!PO%d!QO%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO~Oc&`Od&_O!w&]O%b&^O%u&[O~P;xOc&cOdyO![&bO!t&ZO!wxO!{]O#s!PO%b}O%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO%s!UO~Oa&fO#[&iO%d&dO'|!lO~P<}O!k&jO!t&nO~O!k#nO~O![XO~O`%kO'q&vO'r%kO~O`%kO'q&yO'r%kO~O`%kO'q&{O'r%kO~O'p[X!V[Xr[X!j[X&T[X![[X%c[X!d[X~P(qO!_'YO!`'RO!a'RO'|!lO'}TO(QUO~Oo'PO!P'OO!X'SO([&}O!Z(`P!Z(nP~P@UOj']O!['ZO'{%dO~Od'bO!k%bO'{%dO~O|&OO!k%}O~Oo!nO!P!oO!{:dO#P!pO#Q!pO#S!pO#T!pO'|!lO'}TO(QUO([!mO(g!sO~O!_'hO!`'gO!a'gO#R!pO#W'iO#X'iO~PApO`%kOg%VO!d#uO!k%bO'r%kO(h'kO~O!o'oO#['mO~PCOOo!nO!P!oO'}TO(QUO([!mO(g!sO~O![XOo(eX!P(eX!_(eX!`(eX!a(eX!{(eX#P(eX#Q(eX#R(eX#S(eX#T(eX#W(eX#X(eX'|(eX'}(eX(Q(eX([(eX(g(eX~O!`'gO!a'gO'|!lO~PCnO'w'sO'x'sO'y'uO~O^!|O'}'wO(O!|O(P'wO~O^#PO(P'wO(Q'wO(R#PO~Ot#RO!R#SO(Y#SO(Z'{O~O!X'}O!V'PX!V'VX!Y'PX!Y'VX~P+}O!Y(PO!V(_X~OP$]OZ$dOn$QO|#yO}#zO!P#{O!Y(PO!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O!V(_X~PGbO!V(UO~O!V(kX!Y(kX!d(kX!j(kX(h(kX~O#[(kX#g#`X!Z(kX~PIhO#[(VO!V(mX!Y(mX~O!Y(WO!V(lX~O!V(ZO~O#[$eO~PIhO!Z([O~P`O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!maZ!man!ma!Y!ma!h!ma!o!ma#j!ma#k!ma#l!ma#m!ma#n!ma#o!ma#p!ma#q!ma#r!ma#t!ma#v!ma#x!ma#y!ma(h!ma(o!ma(p!ma~O`!ma'r!ma'p!ma!V!ma!j!mar!ma![!ma%c!ma!d!ma~PKOO!j(]O~O!d#uO#[(^O(h'kO!Y(jX`(jX'r(jX~O!j(jX~PMnO!P%eO![%fO!{]O#e(cO#f(bO'{%dO~O!Y(dO!j(iX~O!j(fO~O!P%eO![%fO#f(bO'{%dO~OP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!i(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#r(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X~O!d#uO!j(^X~P! [O|(gO}(hO!i#wO!k#xO!{!za!P!za~O!w!za%b!za![!za#e!za#f!za'{!za~P!#`O!w(lO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![XO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~O#g(rO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz%ZO!P${O![$|O!f%`O!k$xO#f%aO$T%^O$o%[O$q%]O$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~Of(bP~P!(SO!X(vO!j(cP~P%[O([(xO(g[O~O!P(zO!k#xO([(xO(g[O~OP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![!eO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'{)YO'}TO(QUO(XVO(g[O(t<YO~O})]O!k#xO~O!Y$aO`$ma'r$ma'p$ma!j$ma!V$ma![$ma%c$ma!d$ma~O#s)aO~P!&dO|)dO!d)cO![$ZX$W$ZX$Y$ZX$[$ZX$c$ZX~O!d)cO![(qX$W(qX$Y(qX$[(qX$c(qX~O|)dO~P!.OO|)dO![(qX$W(qX$Y(qX$[(qX$c(qX~O![)fO$W)jO$Y)eO$[)eO$c)kO~O!X)nO~P!*fO$Y$gO$[$fO$c)rO~Oj$uX|$uX!P$uX!i$uX(o$uX(p$uX~OfiXf$uXjiX!YiX#[iX~P!/tOo)tO~Ot)uO(Y)vO(Z)xO~Oj*RO|)zO!P){O(o$}O(p%PO~Of)yO~P!0}Of*SO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'}TO(QUO(X$uO(o$}O(p%PO~O!X*WO'{*TO!j(uP~P!1lO#g*YO~O!k*ZO~O!X*`O'{*]O!V(vP~P!1lOn*lO!P*dO!_*jO!`*cO!a*cO!k*ZO#W*kO%Y*fO'|!lO([!mO~O!Z*iO~P!3xO!i#wOj(WX|(WX!P(WX(o(WX(p(WX!Y(WX#[(WX~Of(WX#|(WX~P!4qOj*qO#[*pOf(VX!Y(VX~O!Y*rOf(UX~O'{&UOf(UP~O!k*yO~O'{(pO~Ol*}O!P%eO!X#hO![%fO!{]O#e#kO#f#hO'{%dO!j(iP~O!d#uO#g+OO~O!P%eO!X+QO!Y(WO![%fO'{%dO!V(lP~Oo'VO!P+SO!X+RO'}TO(QUO([(xO~O!Z(nP~P!7lO!Y+TO`(zX'r(zX~OP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O`!ea!Y!ea'r!ea'p!ea!V!ea!j!ear!ea![!ea%c!ea!d!ea~P!8dO|#yO}#zO!P#{O!i#wO!k#xO(XVOP!qaZ!qan!qa!Y!qa!h!qa!o!qa#j!qa#k!qa#l!qa#m!qa#n!qa#o!qa#p!qa#q!qa#r!qa#t!qa#v!qa#x!qa#y!qa(h!qa(o!qa(p!qa~O`!qa'r!qa'p!qa!V!qa!j!qar!qa![!qa%c!qa!d!qa~P!:}O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!saZ!san!sa!Y!sa!h!sa!o!sa#j!sa#k!sa#l!sa#m!sa#n!sa#o!sa#p!sa#q!sa#r!sa#t!sa#v!sa#x!sa#y!sa(h!sa(o!sa(p!sa~O`!sa'r!sa'p!sa!V!sa!j!sar!sa![!sa%c!sa!d!sa~P!=hOg%VOj+^O!['ZO%c+]O~O!d+`O`(TX![(TX'r(TX!Y(TX~O`%kO![XO'r%kO~Og%VO!k%bO~Og%VO!k%bO'{%dO~O!d#uO#g(rO~Oa+kO%d+lO'{+hO'}TO(QUO!Z)OP~O!Y+mO_(}X~OZ+qO~O_+rO~O![%{O'{%dO'|!lO_(}P~Og%VO#[+wO~Og%VOj+zO![$|O~O![+|O~O|,OO![XO~O%h%rO~O!w,TO~Od,YO~Oa,ZO'{#mO'}TO(QUO!Z(|P~Od%yO~O%d!QO'{&UO~P<}OZ,`O_,_O~OPYOQYORfOczOdyOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO!fuO!kZO!nYO!oYO!pYO!rvO!wxO!{]O%b}O'}TO(QUO(XVO(g[O(tiO~O![!eO!t!gO$T!kO'{!dO~P!DkO_,_O`%kO'r%kO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~O`,eO!twO#s!OO%f!OO%g!OO%h!OO~P!GTO!k&jO~O&V,kO~O![,mO~O&h,oO&j,pOP&eaQ&eaR&eaX&ea`&eac&ead&eal&ean&eao&eap&eav&eax&eaz&ea!P&ea!T&ea!U&ea![&ea!f&ea!k&ea!n&ea!o&ea!p&ea!r&ea!t&ea!w&ea!{&ea#s&ea$T&ea%b&ea%d&ea%f&ea%g&ea%h&ea%k&ea%m&ea%p&ea%q&ea%s&ea&P&ea&V&ea&X&ea&Z&ea&]&ea&`&ea&f&ea&l&ea&n&ea&p&ea&r&ea&t&ea'p&ea'{&ea'}&ea(Q&ea(X&ea(g&ea(t&ea!Z&ea&^&eaa&ea&c&ea~O'{,uO~Og!bX!Y!OX!Y!bX!Z!OX!Z!bX!d!OX!d!bX!k!bX#[!OX~O!d,zO#[,yOg(aX!Y#dX!Y(aX!Z#dX!Z(aX!d(aX!k(aX~Og%VO!d,|O!k%bO!Y!^X!Z!^X~Oo!nO!P!oO'}TO(QUO([!mO~OP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![!eO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'}TO(QUO(XVO(g[O(t<YO~O'{;]O~P#!ZO!Y-QO!Z(`X~O!Z-SO~O!d,zO#[,yO!Y#dX!Z#dX~O!Y-TO!Z(nX~O!Z-VO~O!`-WO!a-WO'|!lO~P# xO!Z-ZO~P'_Oj-^O!['ZO~O!V-cO~Oo!za!_!za!`!za!a!za#P!za#Q!za#R!za#S!za#T!za#W!za#X!za'|!za'}!za(Q!za([!za(g!za~P!#`O!o-hO#[-fO~PCOO!`-jO!a-jO'|!lO~PCnO`%kO#[-fO'r%kO~O`%kO!d#uO#[-fO'r%kO~O`%kO!d#uO!o-hO#[-fO'r%kO(h'kO~O'w'sO'x'sO'y-oO~Or-pO~O!V'Pa!Y'Pa~P!8dO!X-tO!V'PX!Y'PX~P%[O!Y(PO!V(_a~O!V(_a~PGbO!Y(WO!V(la~O!P%eO!X-xO![%fO'{%dO!V'VX!Y'VX~O#[-zO!Y(ja!j(ja`(ja'r(ja~O!d#uO~P#*aO!Y(dO!j(ia~O!P%eO![%fO#f.OO'{%dO~Ol.TO!P%eO!X.QO![%fO!{]O#e.SO#f.QO'{%dO!Y'YX!j'YX~O}.XO!k#xO~Og%VOj.[O!['ZO%c.ZO~O`#_i!Y#_i'r#_i'p#_i!V#_i!j#_ir#_i![#_i%c#_i!d#_i~P!8dOj<fO|)zO!P){O(o$}O(p%PO~O#g#Za`#Za#[#Za'r#Za!Y#Za!j#Za![#Za!V#Za~P#-]O#g(WXP(WXZ(WX`(WXn(WX}(WX!h(WX!k(WX!o(WX#j(WX#k(WX#l(WX#m(WX#n(WX#o(WX#p(WX#q(WX#r(WX#t(WX#v(WX#x(WX#y(WX'r(WX(X(WX(h(WX!j(WX!V(WX'p(WXr(WX![(WX%c(WX!d(WX~P!4qO!Y.iOf(bX~P!0}Of.kO~O!Y.lO!j(cX~P!8dO!j.oO~O!V.qO~OP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O(XVOZ#ii`#iin#ii!Y#ii!h#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#j#ii~P#1XO#j$OO~P#1XOP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO(XVOZ#ii`#ii!Y#ii!h#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~On#ii~P#3yOn$QO~P#3yOP$]On$QO|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO(XVO`#ii!Y#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~OZ#ii!h#ii#o#ii#p#ii#q#ii#r#ii~P#6kOZ$dO!h$SO#o$SO#p$SO#q$cO#r$SO~P#6kOP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO(XVO(p#}O`#ii!Y#ii#x#ii#y#ii'r#ii(h#ii(o#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#v$VO~P#9lO#v#ii~P#9lOP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO(XVO`#ii!Y#ii#x#ii#y#ii'r#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#v#ii(o#ii(p#ii~P#<^O#v$VO(o#|O(p#}O~P#<^OP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO(XVO(o#|O(p#}O~O`#ii!Y#ii#y#ii'r#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~P#?UOP[XZ[Xn[X|[X}[X!P[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X!Y[X!Z[X~O#|[X~P#AoOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO#v:sO#x:uO#y:vO(XVO(h$ZO(o#|O(p#}O~O#|.sO~P#C|O#[:{O$O:{O#|(^X!Z(^X~P! [O`']a!Y']a'r']a'p']a!j']a!V']ar']a![']a%c']a!d']a~P!8dOP#iiZ#ii`#iin#ii}#ii!Y#ii!h#ii!i#ii!k#ii!o#ii#j#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(X#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~P#-]O`#}i!Y#}i'r#}i'p#}i!V#}i!j#}ir#}i![#}i%c#}i!d#}i~P!8dO$Y.xO$[.xO~O$Y.yO$[.yO~O!d)cO#[.zO![$`X$W$`X$Y$`X$[$`X$c$`X~O!X.{O~O![)fO$W.}O$Y)eO$[)eO$c/OO~O!Y:wO!Z(]X~P#C|O!Z/PO~O!d)cO$c(qX~O$c/RO~Ot)uO(Y)vO(Z/UO~O!V/YO~P!&dO(o$}Oj%Za|%Za!P%Za(p%Za!Y%Za#[%Za~Of%Za#|%Za~P#L^O(p%POj%]a|%]a!P%]a(o%]a!Y%]a#[%]a~Of%]a#|%]a~P#MPO!YeX!deX!jeX!j$uX(heX~P!/tO!j/bO~P#-]O!Y/cO!d#uO(h'kO!j(uX~O!j/hO~O!X*WO'{%dO!j(uP~O#g/jO~O!V$uX!Y$uX!d$|X~P!/tO!Y/kO!V(vX~P#-]O!d/mO~O!V/oO~Og%VOn/sO!d#uO!k%bO(h'kO~O'{/uO~O!d+`O~O`%kO!Y/yO'r%kO~O!Z/{O~P!3xO!`/|O!a/|O'|!lO([!mO~O!P0OO([!mO~O#W0PO~Of%Za!Y%Za#[%Za#|%Za~P!0}Of%]a!Y%]a#[%]a#|%]a~P!0}O'{&UOf'fX!Y'fX~O!Y*rOf(Ua~Of0YO~O|0ZO}0ZO!P0[Ojya(oya(pya!Yya#[ya~Ofya#|ya~P$$jO|)zO!P){Oj$na(o$na(p$na!Y$na#[$na~Of$na#|$na~P$%`O|)zO!P){Oj$pa(o$pa(p$pa!Y$pa#[$pa~Of$pa#|$pa~P$&RO#g0^O~Of%Oa!Y%Oa#[%Oa#|%Oa~P!0}O!d#uO~O#g0aO~O!Y+TO`(za'r(za~O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!qiZ!qin!qi!Y!qi!h!qi!o!qi#j!qi#k!qi#l!qi#m!qi#n!qi#o!qi#p!qi#q!qi#r!qi#t!qi#v!qi#x!qi#y!qi(h!qi(o!qi(p!qi~O`!qi'r!qi'p!qi!V!qi!j!qir!qi![!qi%c!qi!d!qi~P$'pOg%VOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'}TO(QUO(X$uO(o$}O(p%PO~Ol0kO'{0jO~P$*ZO!d+`O`(Ta![(Ta'r(Ta!Y(Ta~O#g0qO~OZ[X!YeX!ZeX~O!Y0rO!Z)OX~O!Z0tO~OZ0uO~Oa0wO'{+hO'}TO(QUO~O![%{O'{%dO_'nX!Y'nX~O!Y+mO_(}a~O!j0zO~P!8dOZ0}O~O_1OO~O#[1RO~Oj1UO![$|O~O([(xO!Z({P~Og%VOj1_O![1[O%c1^O~OZ1iO!Y1gO!Z(|X~O!Z1jO~O_1lO`%kO'r%kO~O'{#mO'}TO(QUO~O#[$eO$O$eOP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X~O#r1oO&T1pO`(^X!i(^X~P$/qO#[$eO#r1oO&T1pO~O`1rO~P%[O`1tO~O&^1wOP&[iQ&[iR&[iX&[i`&[ic&[id&[il&[in&[io&[ip&[iv&[ix&[iz&[i!P&[i!T&[i!U&[i![&[i!f&[i!k&[i!n&[i!o&[i!p&[i!r&[i!t&[i!w&[i!{&[i#s&[i$T&[i%b&[i%d&[i%f&[i%g&[i%h&[i%k&[i%m&[i%p&[i%q&[i%s&[i&P&[i&V&[i&X&[i&Z&[i&]&[i&`&[i&f&[i&l&[i&n&[i&p&[i&r&[i&t&[i'p&[i'{&[i'}&[i(Q&[i(X&[i(g&[i(t&[i!Z&[ia&[i&c&[i~Oa1}O!Z1{O&c1|O~P`O![XO!k2PO~O&j,pOP&eiQ&eiR&eiX&ei`&eic&eid&eil&ein&eio&eip&eiv&eix&eiz&ei!P&ei!T&ei!U&ei![&ei!f&ei!k&ei!n&ei!o&ei!p&ei!r&ei!t&ei!w&ei!{&ei#s&ei$T&ei%b&ei%d&ei%f&ei%g&ei%h&ei%k&ei%m&ei%p&ei%q&ei%s&ei&P&ei&V&ei&X&ei&Z&ei&]&ei&`&ei&f&ei&l&ei&n&ei&p&ei&r&ei&t&ei'p&ei'{&ei'}&ei(Q&ei(X&ei(g&ei(t&ei!Z&ei&^&eia&ei&c&ei~O!V2VO~O!Y!^a!Z!^a~P#C|Oo!nO!P!oO!X2]O([!mO!Y'QX!Z'QX~P@UO!Y-QO!Z(`a~O!Y'WX!Z'WX~P!7lO!Y-TO!Z(na~O!Z2dO~P'_O`%kO#[2mO'r%kO~O`%kO!d#uO#[2mO'r%kO~O`%kO!d#uO!o2qO#[2mO'r%kO(h'kO~O`%kO'r%kO~P!8dO!Y$aOr$ma~O!V'Pi!Y'Pi~P!8dO!Y(PO!V(_i~O!Y(WO!V(li~O!V(mi!Y(mi~P!8dO!Y(ji!j(ji`(ji'r(ji~P!8dO#[2sO!Y(ji!j(ji`(ji'r(ji~O!Y(dO!j(ii~O!P%eO![%fO!{]O#e2xO#f2wO'{%dO~O!P%eO![%fO#f2wO'{%dO~Oj3PO!['ZO%c3OO~Og%VOj3PO!['ZO%c3OO~O#g%ZaP%ZaZ%Za`%Zan%Za}%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za'r%Za(X%Za(h%Za!j%Za!V%Za'p%Zar%Za![%Za%c%Za!d%Za~P#L^O#g%]aP%]aZ%]a`%]an%]a}%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a'r%]a(X%]a(h%]a!j%]a!V%]a'p%]ar%]a![%]a%c%]a!d%]a~P#MPO#g%ZaP%ZaZ%Za`%Zan%Za}%Za!Y%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za'r%Za(X%Za(h%Za!j%Za!V%Za'p%Za#[%Zar%Za![%Za%c%Za!d%Za~P#-]O#g%]aP%]aZ%]a`%]an%]a}%]a!Y%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a'r%]a(X%]a(h%]a!j%]a!V%]a'p%]a#[%]ar%]a![%]a%c%]a!d%]a~P#-]O#gyaPyaZya`yanya!hya!iya!kya!oya#jya#kya#lya#mya#nya#oya#pya#qya#rya#tya#vya#xya#yya'rya(Xya(hya!jya!Vya'pyarya![ya%cya!dya~P$$jO#g$naP$naZ$na`$nan$na}$na!h$na!i$na!k$na!o$na#j$na#k$na#l$na#m$na#n$na#o$na#p$na#q$na#r$na#t$na#v$na#x$na#y$na'r$na(X$na(h$na!j$na!V$na'p$nar$na![$na%c$na!d$na~P$%`O#g$paP$paZ$pa`$pan$pa}$pa!h$pa!i$pa!k$pa!o$pa#j$pa#k$pa#l$pa#m$pa#n$pa#o$pa#p$pa#q$pa#r$pa#t$pa#v$pa#x$pa#y$pa'r$pa(X$pa(h$pa!j$pa!V$pa'p$par$pa![$pa%c$pa!d$pa~P$&RO#g%OaP%OaZ%Oa`%Oan%Oa}%Oa!Y%Oa!h%Oa!i%Oa!k%Oa!o%Oa#j%Oa#k%Oa#l%Oa#m%Oa#n%Oa#o%Oa#p%Oa#q%Oa#r%Oa#t%Oa#v%Oa#x%Oa#y%Oa'r%Oa(X%Oa(h%Oa!j%Oa!V%Oa'p%Oa#[%Oar%Oa![%Oa%c%Oa!d%Oa~P#-]O`#_q!Y#_q'r#_q'p#_q!V#_q!j#_qr#_q![#_q%c#_q!d#_q~P!8dOf'RX!Y'RX~P!(SO!Y.iOf(ba~O!X3ZO!Y'SX!j'SX~P%[O!Y.lO!j(ca~O!Y.lO!j(ca~P!8dO!V3^O~O#|!ma!Z!ma~PKOO#|!ea!Y!ea!Z!ea~P#C|O#|!qa!Z!qa~P!:}O#|!sa!Z!sa~P!=hORfO![3pO$a3qO~O!Z3uO~Or3vO~P#-]O`$jq!Y$jq'r$jq'p$jq!V$jq!j$jqr$jq![$jq%c$jq!d$jq~P!8dO!V3wO~P#-]O|)zO!P){O(p%POj'ba(o'ba!Y'ba#['ba~Of'ba#|'ba~P%)eO|)zO!P){Oj'da(o'da(p'da!Y'da#['da~Of'da#|'da~P%*WO(h$ZO~P#-]O!X3zO'{%dO!Y'^X!j'^X~O!Y/cO!j(ua~O!Y/cO!d#uO!j(ua~O!Y/cO!d#uO(h'kO!j(ua~Of$wi!Y$wi#[$wi#|$wi~P!0}O!X4SO'{*]O!V'`X!Y'`X~P!1lO!Y/kO!V(va~O!Y/kO!V(va~P#-]O!d#uO#r4[O~On4_O!d#uO(h'kO~O(o$}Oj%Zi|%Zi!P%Zi(p%Zi!Y%Zi#[%Zi~Of%Zi#|%Zi~P%-jO(p%POj%]i|%]i!P%]i(o%]i!Y%]i#[%]i~Of%]i#|%]i~P%.]Of(Vi!Y(Vi~P!0}O#[4fOf(Vi!Y(Vi~P!0}O!j4iO~O`$kq!Y$kq'r$kq'p$kq!V$kq!j$kqr$kq![$kq%c$kq!d$kq~P!8dO!V4mO~O!Y4nO![(wX~P#-]O!i#wO~P4XO`$uX![$uX%W[X'r$uX!Y$uX~P!/tO%W4pO`kXjkX|kX!PkX![kX'rkX(okX(pkX!YkX~O%W4pO~Oa4vO%d4wO'{+hO'}TO(QUO!Y'mX!Z'mX~O!Y0rO!Z)Oa~OZ4{O~O_4|O~O`%kO'r%kO~P#-]O![$|O~P#-]O!Y5UO#[5WO!Z({X~O!Z5XO~Oo!nO!P5YO!_!xO!`!uO!a!uO!{:dO#P!pO#Q!pO#R!pO#S!pO#T!pO#W5_O#X!yO'|!lO'}TO(QUO([!mO(g!sO~O!Z5^O~P%3nOj5dO![1[O%c5cO~Og%VOj5dO![1[O%c5cO~Oa5kO'{#mO'}TO(QUO!Y'lX!Z'lX~O!Y1gO!Z(|a~O'}TO(QUO([5mO~O_5qO~O#r5tO&T5uO~PMnO!j5vO~P%[O`5xO~O`5xO~P%[Oa1}O!Z5}O&c1|O~P`O!d6PO~O!d6ROg(ai!Y(ai!Z(ai!d(ai!k(ai~O!Y#di!Z#di~P#C|O#[6SO!Y#di!Z#di~O!Y!^i!Z!^i~P#C|O`%kO#[6]O'r%kO~O`%kO!d#uO#[6]O'r%kO~O!Y(jq!j(jq`(jq'r(jq~P!8dO!Y(dO!j(iq~O!P%eO![%fO#f6dO'{%dO~O!['ZO%c6gO~Oj6jO!['ZO%c6gO~O#g'baP'baZ'ba`'ban'ba}'ba!h'ba!i'ba!k'ba!o'ba#j'ba#k'ba#l'ba#m'ba#n'ba#o'ba#p'ba#q'ba#r'ba#t'ba#v'ba#x'ba#y'ba'r'ba(X'ba(h'ba!j'ba!V'ba'p'bar'ba!['ba%c'ba!d'ba~P%)eO#g'daP'daZ'da`'dan'da}'da!h'da!i'da!k'da!o'da#j'da#k'da#l'da#m'da#n'da#o'da#p'da#q'da#r'da#t'da#v'da#x'da#y'da'r'da(X'da(h'da!j'da!V'da'p'dar'da!['da%c'da!d'da~P%*WO#g$wiP$wiZ$wi`$win$wi}$wi!Y$wi!h$wi!i$wi!k$wi!o$wi#j$wi#k$wi#l$wi#m$wi#n$wi#o$wi#p$wi#q$wi#r$wi#t$wi#v$wi#x$wi#y$wi'r$wi(X$wi(h$wi!j$wi!V$wi'p$wi#[$wir$wi![$wi%c$wi!d$wi~P#-]O#g%ZiP%ZiZ%Zi`%Zin%Zi}%Zi!h%Zi!i%Zi!k%Zi!o%Zi#j%Zi#k%Zi#l%Zi#m%Zi#n%Zi#o%Zi#p%Zi#q%Zi#r%Zi#t%Zi#v%Zi#x%Zi#y%Zi'r%Zi(X%Zi(h%Zi!j%Zi!V%Zi'p%Zir%Zi![%Zi%c%Zi!d%Zi~P%-jO#g%]iP%]iZ%]i`%]in%]i}%]i!h%]i!i%]i!k%]i!o%]i#j%]i#k%]i#l%]i#m%]i#n%]i#o%]i#p%]i#q%]i#r%]i#t%]i#v%]i#x%]i#y%]i'r%]i(X%]i(h%]i!j%]i!V%]i'p%]ir%]i![%]i%c%]i!d%]i~P%.]Of'Ra!Y'Ra~P!0}O!Y'Sa!j'Sa~P!8dO!Y.lO!j(ci~O#|#_i!Y#_i!Z#_i~P#C|OP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O(XVOZ#iin#ii!h#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~O#j#ii~P%FnO#j:lO~P%FnOP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO(XVOZ#ii!h#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~On#ii~P%HyOn:nO~P%HyOP$]On:nO|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO(XVO#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~OZ#ii!h#ii#o#ii#p#ii#q#ii#r#ii~P%KUOZ:zO!h:pO#o:pO#p:pO#q:yO#r:pO~P%KUOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO(XVO(p#}O#x#ii#y#ii#|#ii(h#ii(o#ii!Y#ii!Z#ii~O#v:sO~P%MpO#v#ii~P%MpOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO(XVO#x#ii#y#ii#|#ii(h#ii!Y#ii!Z#ii~O#v#ii(o#ii(p#ii~P& {O#v:sO(o#|O(p#}O~P& {OP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO#v:sO#x:uO(XVO(o#|O(p#}O~O#y#ii#|#ii(h#ii!Y#ii!Z#ii~P&$^O`#zy!Y#zy'r#zy'p#zy!V#zy!j#zyr#zy![#zy%c#zy!d#zy~P!8dOj<gO|)zO!P){O(o$}O(p%PO~OP#iiZ#iin#ii}#ii!h#ii!i#ii!k#ii!o#ii#j#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(X#ii(h#ii!Y#ii!Z#ii~P&'UO!i#wOP(WXZ(WXj(WXn(WX|(WX}(WX!P(WX!h(WX!k(WX!o(WX#j(WX#k(WX#l(WX#m(WX#n(WX#o(WX#p(WX#q(WX#r(WX#t(WX#v(WX#x(WX#y(WX#|(WX(X(WX(h(WX(o(WX(p(WX!Y(WX!Z(WX~O#|#}i!Y#}i!Z#}i~P#C|O#|!qi!Z!qi~P$'pO!Z6|O~O!Y']a!Z']a~P#C|O!d#uO(h'kO!Y'^a!j'^a~O!Y/cO!j(ui~O!Y/cO!d#uO!j(ui~Of$wq!Y$wq#[$wq#|$wq~P!0}O!V'`a!Y'`a~P#-]O!d7TO~O!Y/kO!V(vi~P#-]O!Y/kO!V(vi~O!V7XO~O!d#uO#r7^O~On7_O!d#uO(h'kO~O|)zO!P){O(p%POj'ca(o'ca!Y'ca#['ca~Of'ca#|'ca~P&.fO|)zO!P){Oj'ea(o'ea(p'ea!Y'ea#['ea~Of'ea#|'ea~P&/XO!V7aO~Of$yq!Y$yq#[$yq#|$yq~P!0}O`$ky!Y$ky'r$ky'p$ky!V$ky!j$kyr$ky![$ky%c$ky!d$ky~P!8dO!d6RO~O!Y4nO![(wa~O`#_y!Y#_y'r#_y'p#_y!V#_y!j#_yr#_y![#_y%c#_y!d#_y~P!8dOZ7fO~Oa7hO'{+hO'}TO(QUO~O!Y0rO!Z)Oi~O_7lO~O([(xO!Y'iX!Z'iX~O!Y5UO!Z({a~OlkO'{7sO~P.iO!Z7vO~P%3nOo!nO!P7wO'}TO(QUO([!mO(g!sO~O![1[O~O![1[O%c7yO~Oj7|O![1[O%c7yO~OZ8RO!Y'la!Z'la~O!Y1gO!Z(|i~O!j8VO~O!j8WO~O!j8ZO~O!j8ZO~P%[O`8]O~O!d8^O~O!j8_O~O!Y(mi!Z(mi~P#C|O`%kO#[8gO'r%kO~O!Y(jy!j(jy`(jy'r(jy~P!8dO!Y(dO!j(iy~O!['ZO%c8jO~O#g$wqP$wqZ$wq`$wqn$wq}$wq!Y$wq!h$wq!i$wq!k$wq!o$wq#j$wq#k$wq#l$wq#m$wq#n$wq#o$wq#p$wq#q$wq#r$wq#t$wq#v$wq#x$wq#y$wq'r$wq(X$wq(h$wq!j$wq!V$wq'p$wq#[$wqr$wq![$wq%c$wq!d$wq~P#-]O#g'caP'caZ'ca`'can'ca}'ca!h'ca!i'ca!k'ca!o'ca#j'ca#k'ca#l'ca#m'ca#n'ca#o'ca#p'ca#q'ca#r'ca#t'ca#v'ca#x'ca#y'ca'r'ca(X'ca(h'ca!j'ca!V'ca'p'car'ca!['ca%c'ca!d'ca~P&.fO#g'eaP'eaZ'ea`'ean'ea}'ea!h'ea!i'ea!k'ea!o'ea#j'ea#k'ea#l'ea#m'ea#n'ea#o'ea#p'ea#q'ea#r'ea#t'ea#v'ea#x'ea#y'ea'r'ea(X'ea(h'ea!j'ea!V'ea'p'ear'ea!['ea%c'ea!d'ea~P&/XO#g$yqP$yqZ$yq`$yqn$yq}$yq!Y$yq!h$yq!i$yq!k$yq!o$yq#j$yq#k$yq#l$yq#m$yq#n$yq#o$yq#p$yq#q$yq#r$yq#t$yq#v$yq#x$yq#y$yq'r$yq(X$yq(h$yq!j$yq!V$yq'p$yq#[$yqr$yq![$yq%c$yq!d$yq~P#-]O!Y'Si!j'Si~P!8dO#|#_q!Y#_q!Z#_q~P#C|O(o$}OP%ZaZ%Zan%Za}%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za#|%Za(X%Za(h%Za!Y%Za!Z%Za~Oj%Za|%Za!P%Za(p%Za~P&@nO(p%POP%]aZ%]an%]a}%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a#|%]a(X%]a(h%]a!Y%]a!Z%]a~Oj%]a|%]a!P%]a(o%]a~P&BuOj<gO|)zO!P){O(p%PO~P&@nOj<gO|)zO!P){O(o$}O~P&BuO|0ZO}0ZO!P0[OPyaZyajyanya!hya!iya!kya!oya#jya#kya#lya#mya#nya#oya#pya#qya#rya#tya#vya#xya#yya#|ya(Xya(hya(oya(pya!Yya!Zya~O|)zO!P){OP$naZ$naj$nan$na}$na!h$na!i$na!k$na!o$na#j$na#k$na#l$na#m$na#n$na#o$na#p$na#q$na#r$na#t$na#v$na#x$na#y$na#|$na(X$na(h$na(o$na(p$na!Y$na!Z$na~O|)zO!P){OP$paZ$paj$pan$pa}$pa!h$pa!i$pa!k$pa!o$pa#j$pa#k$pa#l$pa#m$pa#n$pa#o$pa#p$pa#q$pa#r$pa#t$pa#v$pa#x$pa#y$pa#|$pa(X$pa(h$pa(o$pa(p$pa!Y$pa!Z$pa~OP%OaZ%Oan%Oa}%Oa!h%Oa!i%Oa!k%Oa!o%Oa#j%Oa#k%Oa#l%Oa#m%Oa#n%Oa#o%Oa#p%Oa#q%Oa#r%Oa#t%Oa#v%Oa#x%Oa#y%Oa#|%Oa(X%Oa(h%Oa!Y%Oa!Z%Oa~P&'UO#|$jq!Y$jq!Z$jq~P#C|O#|$kq!Y$kq!Z$kq~P#C|O!Z8vO~O#|8wO~P!0}O!d#uO!Y'^i!j'^i~O!d#uO(h'kO!Y'^i!j'^i~O!Y/cO!j(uq~O!V'`i!Y'`i~P#-]O!Y/kO!V(vq~O!V8}O~P#-]O!V8}O~Of(Vy!Y(Vy~P!0}O!Y'ga!['ga~P#-]O`%Vq![%Vq'r%Vq!Y%Vq~P#-]OZ9SO~O!Y0rO!Z)Oq~O#[9WO!Y'ia!Z'ia~O!Y5UO!Z({i~P#C|OP[XZ[Xn[X|[X}[X!P[X!V[X!Y[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X~O!d%TX#r%TX~P'#`O![1[O%c9[O~O'}TO(QUO([9aO~O!Y1gO!Z(|q~O!j9dO~O!j9eO~O!j9fO~O!j9fO~P%[O#[9iO!Y#dy!Z#dy~O!Y#dy!Z#dy~P#C|O!['ZO%c9nO~O#|#zy!Y#zy!Z#zy~P#C|OP$wiZ$win$wi}$wi!h$wi!i$wi!k$wi!o$wi#j$wi#k$wi#l$wi#m$wi#n$wi#o$wi#p$wi#q$wi#r$wi#t$wi#v$wi#x$wi#y$wi#|$wi(X$wi(h$wi!Y$wi!Z$wi~P&'UO|)zO!P){O(p%POP'baZ'baj'ban'ba}'ba!h'ba!i'ba!k'ba!o'ba#j'ba#k'ba#l'ba#m'ba#n'ba#o'ba#p'ba#q'ba#r'ba#t'ba#v'ba#x'ba#y'ba#|'ba(X'ba(h'ba(o'ba!Y'ba!Z'ba~O|)zO!P){OP'daZ'daj'dan'da}'da!h'da!i'da!k'da!o'da#j'da#k'da#l'da#m'da#n'da#o'da#p'da#q'da#r'da#t'da#v'da#x'da#y'da#|'da(X'da(h'da(o'da(p'da!Y'da!Z'da~O(o$}OP%ZiZ%Zij%Zin%Zi|%Zi}%Zi!P%Zi!h%Zi!i%Zi!k%Zi!o%Zi#j%Zi#k%Zi#l%Zi#m%Zi#n%Zi#o%Zi#p%Zi#q%Zi#r%Zi#t%Zi#v%Zi#x%Zi#y%Zi#|%Zi(X%Zi(h%Zi(p%Zi!Y%Zi!Z%Zi~O(p%POP%]iZ%]ij%]in%]i|%]i}%]i!P%]i!h%]i!i%]i!k%]i!o%]i#j%]i#k%]i#l%]i#m%]i#n%]i#o%]i#p%]i#q%]i#r%]i#t%]i#v%]i#x%]i#y%]i#|%]i(X%]i(h%]i(o%]i!Y%]i!Z%]i~O#|$ky!Y$ky!Z$ky~P#C|O#|#_y!Y#_y!Z#_y~P#C|O!d#uO!Y'^q!j'^q~O!Y/cO!j(uy~O!V'`q!Y'`q~P#-]O!V9wO~P#-]O!Y0rO!Z)Oy~O!Y5UO!Z({q~O![1[O%c:OO~O!j:RO~O!['ZO%c:WO~OP$wqZ$wqn$wq}$wq!h$wq!i$wq!k$wq!o$wq#j$wq#k$wq#l$wq#m$wq#n$wq#o$wq#p$wq#q$wq#r$wq#t$wq#v$wq#x$wq#y$wq#|$wq(X$wq(h$wq!Y$wq!Z$wq~P&'UO|)zO!P){O(p%POP'caZ'caj'can'ca}'ca!h'ca!i'ca!k'ca!o'ca#j'ca#k'ca#l'ca#m'ca#n'ca#o'ca#p'ca#q'ca#r'ca#t'ca#v'ca#x'ca#y'ca#|'ca(X'ca(h'ca(o'ca!Y'ca!Z'ca~O|)zO!P){OP'eaZ'eaj'ean'ea}'ea!h'ea!i'ea!k'ea!o'ea#j'ea#k'ea#l'ea#m'ea#n'ea#o'ea#p'ea#q'ea#r'ea#t'ea#v'ea#x'ea#y'ea#|'ea(X'ea(h'ea(o'ea(p'ea!Y'ea!Z'ea~OP$yqZ$yqn$yq}$yq!h$yq!i$yq!k$yq!o$yq#j$yq#k$yq#l$yq#m$yq#n$yq#o$yq#p$yq#q$yq#r$yq#t$yq#v$yq#x$yq#y$yq#|$yq(X$yq(h$yq!Y$yq!Z$yq~P&'UOf%_!Z!Y%_!Z#[%_!Z#|%_!Z~P!0}O!Y'iq!Z'iq~P#C|O!Y#d!Z!Z#d!Z~P#C|O#g%_!ZP%_!ZZ%_!Z`%_!Zn%_!Z}%_!Z!Y%_!Z!h%_!Z!i%_!Z!k%_!Z!o%_!Z#j%_!Z#k%_!Z#l%_!Z#m%_!Z#n%_!Z#o%_!Z#p%_!Z#q%_!Z#r%_!Z#t%_!Z#v%_!Z#x%_!Z#y%_!Z'r%_!Z(X%_!Z(h%_!Z!j%_!Z!V%_!Z'p%_!Z#[%_!Zr%_!Z![%_!Z%c%_!Z!d%_!Z~P#-]OP%_!ZZ%_!Zn%_!Z}%_!Z!h%_!Z!i%_!Z!k%_!Z!o%_!Z#j%_!Z#k%_!Z#l%_!Z#m%_!Z#n%_!Z#o%_!Z#p%_!Z#q%_!Z#r%_!Z#t%_!Z#v%_!Z#x%_!Z#y%_!Z#|%_!Z(X%_!Z(h%_!Z!Y%_!Z!Z%_!Z~P&'UOr(]X~P1qO'|!lO~P!*fO!VeX!YeX#[eX~P'#`OP[XZ[Xn[X|[X}[X!P[X!Y[X!YeX!h[X!i[X!k[X!o[X#[[X#[eX#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X~O!deX!j[X!jeX(heX~P'ASOP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![XO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'{)YO'}TO(QUO(XVO(g[O(t<YO~O!Y:wO!Z$ma~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;RO!P${O![$|O!f<aO!k$xO#f;XO$T%^O$o;TO$q;VO$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~O#s)aO~P'ExO!Z[X!ZeX~P'ASO#g:kO~O!d#uO#g:kO~O#[:{O~O#r:pO~O#[;ZO!Y(mX!Z(mX~O#[:{O!Y(kX!Z(kX~O#g;[O~Of;^O~P!0}O#g;cO~O#g;dO~O!d#uO#g;eO~O!d#uO#g;[O~O#|;fO~P#C|O#g;gO~O#g;hO~O#g;mO~O#g;nO~O#g;oO~O#g;pO~O#|;qO~P!0}O#|;rO~P!0}O!i#P#Q#S#T#W#e#f#q(t$o$q$t%W%b%c%d%k%m%p%q%s%u~'vS#k!U't'|#lo#j#mn|'u$Y'u'{$[([~",goto:"$2p)SPPPPP)TPP)WP)iP*x.|PPPP5pPP6WPP<S?gP?zP?zPPP?zPAxP?zP?zP?zPA|PPBRPBlPGdPPPGhPPPPGhJiPPPJoKjPGhPMxPPPP!!WGhPPPGhPGhP!$fGhP!'z!(|!)VP!)y!)}!)yPPPPP!-Y!(|PP!-v!.pP!1dGhGh!1i!4s!9Y!9Y!=OPPP!=VGhPPPPPPPPPPP!@dP!AqPPGh!CSPGhPGhGhGhGhPGh!DfP!GnP!JrP!Jv!KQ!KU!KUP!GkP!KY!KYP!N^P!NbGhGh!Nh##k?zP?zP?z?zP#$v?z?z#'O?z#)k?z#+m?z?z#,[#.f#.f#.j#.r#.f#.zP#.fP?z#/d?z#3R?z?z5pPPP#6vPPP#7a#7aP#7aP#7w#7aPP#7}P#7tP#7t#8b#7t#8|#9S5m)W#9V)WP#9^#9^#9^P)WP)WP)WP)WPP)WP#9d#9gP#9g)WP#9kP#9nP)WP)WP)WP)WP)WP)W)WPP#9t#9z#:V#:]#:c#:i#:o#:}#;T#;Z#;e#;k#;u#<U#<[#<|#=`#=f#=l#=z#>a#@O#@^#@d#Ax#BW#Cr#DQ#DW#D^#Dd#Dn#Dt#Dz#EU#Eh#EnPPPPPPPPPP#EtPPPPPPP#Fi#Ip#KP#KW#K`PPPP$!d$%Z$+r$+u$+x$,q$,t$,w$-O$-WPP$-^$-b$.Y$/X$/]$/qPP$/u$/{$0PP$0S$0W$0Z$1P$1h$2P$2T$2W$2Z$2a$2d$2h$2lR!{RoqOXst!Z#c%j&m&o&p&r,h,m1w1zY!uQ'Z-Y1[5]Q%pvQ%xyQ&P|Q&e!VS'R!e-QQ'a!iS'g!r!xS*c$|*hQ+f%yQ+s&RQ,X&_Q-W'YQ-b'bQ-j'hQ/|*jQ1f,YR;Y:g%OdOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S,e,h,m-^-f-t-z.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3Z5Y5d5t5u5x6]7w7|8]8gS#p]:d!r)[$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q*u%ZQ+k%{Q,Z&bQ,b&jQ.c;QQ0h+^Q0l+`Q0w+lQ1n,`Q2{.[Q4v0rQ5k1gQ6i3PQ6u;RQ7h4wR8m6j&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]t!nQ!r!u!x!y'R'Y'Z'g'h'i-Q-W-Y-j1[5]5_$v$si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gQ&S|Q'P!eS'V%f-TQ+k%{Q,Z&bQ0]*yQ0w+lQ0|+rQ1m,_Q1n,`Q4v0rQ5P1OQ5k1gQ5n1iQ5o1lQ7h4wQ7k4|Q8U5qQ9V7lR9b8RrnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zR,]&f&v^OPXYstuvwz!Z!`!g!j!o#R#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O']'m(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<[<][#[WZ#V#Y'S'}!S%gm#g#h#k%b%e(W(b(c(d+Q+R+T,d,z-x.O.P.Q.S2P2w2x6R6dQ%sxQ%wyS%||&RQ&Y!TQ'^!hQ'`!iQ(k#rS*V$x*ZS+e%x%yQ+i%{Q,S&]Q,W&_S-a'a'bQ.^(lQ/g*WQ0p+fQ0v+lQ0x+mQ0{+qQ1a,TS1e,X,YQ2i-bQ3y/cQ4u0rQ4y0uQ5O0}Q5j1fQ7Q3zQ7g4wQ7j4{Q9R7fR9y9S!O$zi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c!S%uy!i!t%w%x%y'Q'`'a'b'f'p*b+e+f,}-a-b-i/t0p2b2i2p4^Q+_%sQ+x&VQ+{&WQ,V&_Q.](kQ1`,SU1d,W,X,YQ3Q.^Q5e1aS5i1e1fQ8Q5j#W<^#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<go<_:y:z:};P;T;V;X;`;b;d;h;j;l;n;rW%Ti%V*r<YS&V!Q&dQ&W!RQ&X!SR+v&T$w%Si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gT)v$u)wV*v%Z;Q;RU'V!e%f-TS(y#y#zQ+p&OS.V(g(hQ1V+|Q4g0ZR7p5U&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]$i$`c#X#d%n%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.t.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PT#SV#T&}kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q'T!eR2^-Qv!nQ!e!r!u!x!y'R'Y'Z'g'h'i-Q-W-Y-j1[5]5_S*b$|*hS/t*c*jQ/}*kQ1X,OQ4^/|R4a0PnqOXst!Z#c%j&m&o&p&r,h,m1w1zQ&t!^Q'q!wS(m#t:kQ+c%vQ,Q&YQ,R&[Q-_'_Q-l'jS.g(r;[S0`+O;eQ0n+dQ1Z,PQ2O,oQ2Q,pQ2Y,{Q2g-`Q2j-dS4l0a;oQ4q0oS4t0q;pQ6T2[Q6X2hQ6^2oQ7e4rQ8b6VQ8c6YQ8f6_R9h8_$d$_c#X#d%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PS(j#o'dU*o%R(q3mS+Y%n.tQ2|0hQ6f2{Q8l6iR9o8m$d$^c#X#d%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PS(i#o'dS({#z$_S+X%n.tS.W(h(jQ.w)]Q0e+YR2y.X&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]S#p]:dQ&o!XQ&p!YQ&r![Q&s!]R1v,kQ'[!hQ+[%sQ-]'^S.Y(k+_Q2e-[W2}.].^0g0iQ6W2fU6e2z2|3QS8i6f6hS9m8k8lS:U9l9oQ:^:VR:a:_U!vQ'Z-YT5Z1[5]!Q_OXZ`st!V!Z#c#g%b%j&d&f&m&o&p&r(d,h,m.P1w1z]!pQ!r'Z-Y1[5]T#p]:d%Y{OPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gS(y#y#zS.V(g(h!s;v$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Y!tQ'Z-Y1[5]Q'f!rS'p!u!xS'r!y5_S-i'g'hQ-k'iR2p-jQ'o!tS(`#f1qS-h'f'rQ/f*VQ/r*bQ2q-kQ4O/gS4X/s/}Q7P3yS7[4_4aQ8y7QR9Q7_Q#vbQ'n!tS(_#f1qS(a#l*}Q+P%cQ+a%tQ+g%zU-g'f'o'rQ-{(`Q/e*VQ/q*bQ/w*eQ0m+bQ1b,US2n-h-kQ2v.TS3}/f/gS4W/r/}Q4Z/vQ4]/xQ5g1cQ6`2qQ7O3yQ7S4OS7W4X4aQ7]4`Q8O5hS8x7P7QQ8|7XQ9O7[Q9_8PQ9u8yQ9v8}Q9x9QQ:Q9`Q:Y9wQ;y;tQ<U;}R<V<OV!vQ'Z-Y%YaOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gS#vz!j!r;s$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]R;y<[%YbOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gQ%cj!S%ty!i!t%w%x%y'Q'`'a'b'f'p*b+e+f,}-a-b-i/t0p2b2i2p4^S%zz!jQ+b%uQ,U&_W1c,V,W,X,YU5h1d1e1fS8P5i5jQ9`8Q!r;t$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q;}<ZR<O<[$|eOPXYstuvw!Z!`!g!o#R#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gY#aWZ#V#Y'}!S%gm#g#h#k%b%e(W(b(c(d+Q+R+T,d,z-x.O.P.Q.S2P2w2x6R6dQ,c&j!p;u$[$m)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]R;x'SS'W!e%fR2`-T%OdOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S,e,h,m-^-f-t-z.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3Z5Y5d5t5u5x6]7w7|8]8g!r)[$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q,b&jQ0h+^Q2{.[Q6i3PR8m6j!b$Uc#X%n'|(S(n(u)W)X)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:e!P:r)Z)l-O.t2W2Z3_3i3j3n3t6U6p6y6z7r8a8n8t8u9{:S<P!f$Wc#X%n'|(S(n(u)T)U)W)X)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:e!T:t)Z)l-O.t2W2Z3_3f3g3i3j3n3t6U6p6y6z7r8a8n8t8u9{:S<P!^$[c#X%n'|(S(n(u)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:eQ3x/az<])Z)l-O.t2W2Z3_3n3t6U6p6y6z7r8a8n8t8u9{:S<PQ<b<dR<c<e&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]S$nh$oR3q.z'TgOPWXYZhstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m$o%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.z.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]T$jf$pQ$hfS)e$k)iR)q$pT$if$pT)g$k)i'ThOPWXYZhstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m$o%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.z.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]T$nh$oQ$qhR)p$o%YjOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8g!s<Z$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]#clOPXZst!Z!`!o#R#c#n#{$m%j&f&i&j&m&o&p&r&v'O'](z)n+S+^,e,h,m-^.[.{0[1_1o1p1r1t1w1z1|3P3p5Y5d5t5u5x6j7w7|8]!O%Ri#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c#W(q#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gQ*z%_Q/W)zo3m:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!O$yi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cQ*[$zS*e$|*hQ*{%`Q/x*f#W;{#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn;|:y:z:};P;T;V;X;`;b;d;h;j;l;n;rQ<Q<^Q<R<_Q<S<`R<T<a!O%Ri#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c#W(q#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<go3m:y:z:};P;T;V;X;`;b;d;h;j;l;n;rnoOXst!Z#c%j&m&o&p&r,h,m1w1zQ*_${Q,v&yQ,w&{R4R/k$v%Si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gQ+y&WQ1T+{Q5S1SR7o5TT*g$|*hS*g$|*hT5[1[5]S/v*d5YT4`0O7wQ+a%tQ/w*eQ0m+bQ1b,UQ5g1cQ8O5hQ9_8PR:Q9`!O%Oi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cr)}$v(s*O*n*|/i0U0V3W4P4j6}7`9t;z<W<XS0Q*m0R#W:|#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn:}:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!^;_(o)`*U*^._.b.f/S/X/a/n0f1Q1S3T4Q4U5R5T6k6n7U7Y7b7d8{9P:X<d<e`;`3l6q6t6x8o9p9s:bS;i.a3UT;j6s8r!O%Qi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cv*P$v(s*Q*m*|/]/i0U0V3W4P4b4j6}7`9t;z<W<XS0S*n0T#W;O#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn;P:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!b;a(o)`*U*^.`.a.f/S/X/a/n0f1Q1S3R3T4Q4U5R5T6k6l6n7U7Y7b7d8{9P:X<d<ed;b3l6r6s6x8o8p9p9q9s:bS;k.b3VT;l6t8srnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zQ&a!UR,e&jrnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zR&a!UQ+}&XR1P+vsnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zQ1],SS5b1`1aU7x5`5a5eS9Z7z7{S9|9Y9]Q:Z9}R:`:[Q&h!VR,^&dR5n1iS%||&RR0x+mQ&m!WR,h&nR,n&sT1x,m1zR,r&tQ,q&tR2R,rQ't!zR-n'tSsOtQ#cXT%ms#cQ!}TR'v!}Q#QUR'x#QQ)w$uR/T)wQ#TVR'z#TQ#WWU(Q#W(R-uQ(R#XR-u(SQ-R'TR2_-RQ.j(sR3X.jQ.m(uS3[.m3]R3].nQ-Y'ZR2c-YY!rQ'Z-Y1[5]R'e!rS#^W%eU(X#^(Y-vQ(Y#_R-v(TQ-U'WR2a-Ut`OXst!V!Z#c%j&d&f&m&o&p&r,h,m1w1zS#gZ%bU#q`#g.PR.P(dQ(e#iQ-|(aW.U(e-|2t6bQ2t-}R6b2uQ)i$kR.|)iQ$ohR)o$oQ$bcU)_$b-q:xQ-q:eR:x)lQ/d*VW3{/d3|7R8zU3|/e/f/gS7R3}4OR8z7S$X)|$v(o(s)`*U*^*m*n*w*x*|.a.b.d.e.f/S/X/]/_/a/i/n0U0V0f1Q1S3R3S3T3W3l4P4Q4U4b4d4j5R5T6k6l6m6n6s6t6v6w6x6}7U7Y7`7b7d8o8p8q8{9P9p9q9r9s9t:X:b;z<W<X<d<eQ/l*^U4T/l4V7VQ4V/nR7V4UQ*h$|R/z*hr*O$v(s*m*n*|/i0U0V3W4P4j6}7`9t;z<W<X!^._(o)`*U*^.a.b.f/S/X/a/n0f1Q1S3T4Q4U5R5T6k6n7U7Y7b7d8{9P:X<d<eU/^*O._6qa6q3l6s6t6x8o9p9s:bQ0R*mQ3U.aU4c0R3U8rR8r6sv*Q$v(s*m*n*|/]/i0U0V3W4P4b4j6}7`9t;z<W<X!b.`(o)`*U*^.a.b.f/S/X/a/n0f1Q1S3R3T4Q4U5R5T6k6l6n7U7Y7b7d8{9P:X<d<eU/`*Q.`6re6r3l6s6t6x8o8p9p9q9s:bQ0T*nQ3V.bU4e0T3V8sR8s6tQ*s%UR0X*sQ4o0fR7c4oQ+U%hR0d+UQ5V1VS7q5V9XR9X7rQ,P&YR1Y,PQ5]1[R7u5]Q1h,ZS5l1h8SR8S5nQ0s+iW4x0s4z7i9TQ4z0vQ7i4yR9T7jQ+n%|R0y+nQ1z,mR5|1zYrOXst#cQ&q!ZQ+W%jQ,g&mQ,i&oQ,j&pQ,l&rQ1u,hS1x,m1zR5{1wQ%lpQ&u!_Q&x!aQ&z!bQ&|!cQ'l!tQ+V%iQ+c%vQ+u&SQ,]&hQ,t&wW-e'f'n'o'rQ-l'jQ/y*gQ0n+dS1k,^,aQ2S,sQ2T,vQ2U,wQ2j-dW2l-g-h-k-mQ4q0oQ4}0|Q5Q1QQ5f1bQ5p1mQ5z1vU6Z2k2n2qQ6^2oQ7e4rQ7m5PQ7n5RQ7t5[Q7}5gQ8T5oS8d6[6`Q8f6_Q9U7kQ9^8OQ9c8UQ9j8eQ9z9VQ:P9_Q:T9kR:]:QQ%vyQ'_!iQ'j!tU+d%w%x%yQ,{'QU-`'`'a'bS-d'f'pQ/p*bS0o+e+fQ2[,}S2h-a-bQ2o-iQ4Y/tQ4r0pQ6V2bQ6Y2iQ6_2pR7Z4^S$wi<YR*t%VU%Ui%V<YR0W*rQ$viS(o#u+`Q(s#wS)`$c$dQ*U$xQ*^${Q*m%OQ*n%QQ*w%[Q*x%]Q*|%aQ.a:|Q.b;OQ.d;SQ.e;UQ.f;WQ/S)uS/X){/ZQ/])}Q/_*PQ/a*RQ/i*YQ/n*`Q0U*pQ0V*qh0f+].Z1^3O5c6g7y8j9[9n:O:WQ1Q+wQ1S+zQ3R;_Q3S;aQ3T;cQ3W.iS3l:y:zQ4P/jQ4Q/kQ4U/mQ4b0QQ4d0SQ4j0^Q5R1RQ5T1UQ6k;gQ6l;iQ6m;kQ6n;mQ6s:}Q6t;PQ6v;TQ6w;VQ6x;XQ6}3xQ7U4SQ7Y4[Q7`4fQ7b4nQ7d4pQ8o;dQ8p;`Q8q;bQ8{7TQ9P7^Q9p;hQ9q;jQ9r;lQ9s;nQ9t8wQ:X;qQ:b;rQ;z<YQ<W<bQ<X<cQ<d<fR<e<gnpOXst!Z#c%j&m&o&p&r,h,m1w1zQ!fPS#eZ#nQ&w!`U'c!o5Y7wQ'y#RQ(|#{Q)m$mS,a&f&iQ,f&jQ,s&vQ,x'OQ-[']Q.p(zQ/Q)nQ0b+SQ0i+^Q1s,eQ2f-^Q2|.[Q3s.{Q4h0[Q5a1_Q5r1oQ5s1pQ5w1rQ5y1tQ6O1|Q6f3PQ6{3pQ7{5dQ8X5tQ8Y5uQ8[5xQ8l6jQ9]7|R9g8]#WcOPXZst!Z!`!o#c#n#{%j&f&i&j&m&o&p&r&v'O'](z+S+^,e,h,m-^.[0[1_1o1p1r1t1w1z1|3P5Y5d5t5u5x6j7w7|8]Q#XWQ#dYQ%nuQ%ovS%qw!gS'|#V(PQ(S#YQ(n#tQ(u#xQ(}$OQ)O$PQ)P$QQ)Q$RQ)R$SQ)S$TQ)T$UQ)U$VQ)V$WQ)W$XQ)X$YQ)Z$[Q)^$aQ)b$eW)l$m)n.{3pQ+Z%pQ+o%}S-O'S2]Q-m'mS-r'}-tQ-w(VQ-y(^Q.h(rQ.n(vQ.r:cQ.t:fQ.u:gQ.v:jQ/V)yQ0_+OQ2W,yQ2Z,|Q2k-fQ2r-zQ3Y.lQ3_:kQ3`:lQ3a:mQ3b:nQ3c:oQ3d:pQ3e:qQ3f:rQ3g:sQ3h:tQ3i:uQ3j:vQ3k.sQ3n:{Q3o;YQ3t:wQ4k0aQ4s0qQ6U;ZQ6[2mQ6a2sQ6o3ZQ6p;[Q6y;^Q6z;eQ7r5WQ8a6SQ8e6]Q8n;fQ8t;oQ8u;pQ9k8gQ9{9WQ:S9iQ:e#RR<P<]R#ZWR'U!eY!tQ'Z-Y1[5]S'Q!e-QQ'f!rS'p!u!xS'r!y5_S,}'R'YS-i'g'hQ-k'iQ2b-WR2p-jR(t#wR(w#xQ!fQT-X'Z-Y]!qQ!r'Z-Y1[5]Q#o]R'd:dT#jZ%bS#iZ%bS%hm,dU(a#g#h#kS-}(b(cQ.R(dQ0c+TQ2u.OU2v.P.Q.SS6c2w2xR8h6d`#]W#V#Y%e'}(W+Q-xr#fZm#g#h#k%b(b(c(d+T.O.P.Q.S2w2x6dQ1q,dQ2X,zQ6Q2PQ8`6RT;w'S+RT#`W%eS#_W%eS(O#V(WS(T#Y+QS-P'S+RT-s'}-xT'X!e%fQ$kfR)s$pT)h$k)iR3r.zT*X$x*ZR*a${Q0g+]Q2z.ZQ5`1^Q6h3OQ7z5cQ8k6gQ9Y7yQ9l8jQ9}9[Q:V9nQ:[:OR:_:WnqOXst!Z#c%j&m&o&p&r,h,m1w1zQ&g!VR,]&dtmOXst!U!V!Z#c%j&d&m&o&p&r,h,m1w1zR,d&jT%im,dR1W+|R,[&bQ&Q|R+t&RR+j%{T&k!W&nT&l!W&nT1y,m1z",nodeNames:"⚠ ArithOp ArithOp JSXStartTag LineComment BlockComment Script Hashbang ExportDeclaration export Star as VariableName String Escape from ; default FunctionDeclaration async function VariableDefinition > < TypeParamList TypeDefinition extends ThisType this LiteralType ArithOp Number BooleanLiteral TemplateType InterpolationEnd Interpolation InterpolationStart NullType null VoidType void TypeofType typeof MemberExpression . ?. PropertyName [ TemplateString Escape Interpolation super RegExp ] ArrayExpression Spread , } { ObjectExpression Property async get set PropertyDefinition Block : NewExpression new TypeArgList CompareOp < ) ( ArgList UnaryExpression delete LogicOp BitOp YieldExpression yield AwaitExpression await ParenthesizedExpression ClassExpression class ClassBody MethodDeclaration Decorator @ MemberExpression PrivatePropertyName CallExpression declare Privacy static abstract override PrivatePropertyDefinition PropertyDeclaration readonly accessor Optional TypeAnnotation Equals StaticBlock FunctionExpression ArrowFunction ParamList ParamList ArrayPattern ObjectPattern PatternProperty Privacy readonly Arrow MemberExpression BinaryExpression ArithOp ArithOp ArithOp ArithOp BitOp CompareOp instanceof satisfies in const CompareOp BitOp BitOp BitOp LogicOp LogicOp ConditionalExpression LogicOp LogicOp AssignmentExpression UpdateOp PostfixExpression CallExpression TaggedTemplateExpression DynamicImport import ImportMeta JSXElement JSXSelfCloseEndTag JSXSelfClosingTag JSXIdentifier JSXBuiltin JSXIdentifier JSXNamespacedName JSXMemberExpression JSXSpreadAttribute JSXAttribute JSXAttributeValue JSXEscape JSXEndTag JSXOpenTag JSXFragmentTag JSXText JSXEscape JSXStartCloseTag JSXCloseTag PrefixCast ArrowFunction TypeParamList SequenceExpression KeyofType keyof UniqueType unique ImportType InferredType infer TypeName ParenthesizedType FunctionSignature ParamList NewSignature IndexedType TupleType Label ArrayType ReadonlyType ObjectType MethodType PropertyType IndexSignature PropertyDefinition CallSignature TypePredicate is NewSignature new UnionType LogicOp IntersectionType LogicOp ConditionalType ParameterizedType ClassDeclaration abstract implements type VariableDeclaration let var using TypeAliasDeclaration InterfaceDeclaration interface EnumDeclaration enum EnumBody NamespaceDeclaration namespace module AmbientDeclaration declare GlobalDeclaration global ClassDeclaration ClassBody AmbientFunctionDeclaration ExportGroup VariableName VariableName ImportDeclaration ImportGroup ForStatement for ForSpec ForInSpec ForOfSpec of WhileStatement while WithStatement with DoStatement do IfStatement if else SwitchStatement switch SwitchBody CaseLabel case DefaultLabel TryStatement try CatchClause catch FinallyClause finally ReturnStatement return ThrowStatement throw BreakStatement break ContinueStatement continue DebuggerStatement debugger LabeledStatement ExpressionStatement SingleExpression SingleClassItem",maxTerm:371,context:sO,nodeProps:[["isolate",-8,4,5,13,33,35,48,50,52,""],["group",-26,8,16,18,65,201,205,209,210,212,215,218,228,230,236,238,240,242,245,251,257,259,261,263,265,267,268,"Statement",-32,12,13,28,31,32,38,48,51,52,54,59,67,75,79,81,83,84,106,107,116,117,134,137,139,140,141,142,144,145,164,165,167,"Expression",-23,27,29,33,37,39,41,168,170,172,173,175,176,177,179,180,181,183,184,185,195,197,199,200,"Type",-3,87,99,105,"ClassItem"],["openedBy",22,"<",34,"InterpolationStart",53,"[",57,"{",72,"(",157,"JSXStartCloseTag"],["closedBy",23,">",36,"InterpolationEnd",47,"]",58,"}",73,")",162,"JSXEndTag"]],propSources:[cO],skippedNodes:[0,4,5,271],repeatNodeCount:37,tokenData:"$Fj(CSR!bOX%ZXY+gYZ-yZ[+g[]%Z]^.c^p%Zpq+gqr/mrs3cst:_tuEruvJSvwLkwx! Yxy!'iyz!(sz{!)}{|!,q|}!.O}!O!,q!O!P!/Y!P!Q!9j!Q!R#8g!R![#:v![!]#Gv!]!^#IS!^!_#J^!_!`#Ns!`!a$#_!a!b$(l!b!c$,k!c!}Er!}#O$-u#O#P$/P#P#Q$4h#Q#R$5r#R#SEr#S#T$7P#T#o$8Z#o#p$<k#p#q$=a#q#r$>q#r#s$?}#s$f%Z$f$g+g$g#BYEr#BY#BZ$AX#BZ$ISEr$IS$I_$AX$I_$I|Er$I|$I}$Dd$I}$JO$Dd$JO$JTEr$JT$JU$AX$JU$KVEr$KV$KW$AX$KW&FUEr&FU&FV$AX&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$AX?HUOEr(n%d_$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&j&hT$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c&j&zP;=`<%l&c'|'U]$f&j(R!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!b(SU(R!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!b(iP;=`<%l'}'|(oP;=`<%l&}'[(y]$f&j(OpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rp)wU(OpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)rp*^P;=`<%l)r'[*dP;=`<%l(r#S*nX(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g#S+^P;=`<%l*g(n+dP;=`<%l%Z(CS+rq$f&j(Op(R!b't(;dOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p$f%Z$f$g+g$g#BY%Z#BY#BZ+g#BZ$IS%Z$IS$I_+g$I_$JT%Z$JT$JU+g$JU$KV%Z$KV$KW+g$KW&FU%Z&FU&FV+g&FV;'S%Z;'S;=`+a<%l?HT%Z?HT?HU+g?HUO%Z(CS.ST(P#S$f&j'u(;dO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c(CS.n_$f&j(Op(R!b'u(;dOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#`/x`$f&j!o$Ip(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S1V`#t$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`2X!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S2d_#t$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/|3l_'}$(n$f&j(R!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k(^4r_$f&j(R!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k&z5vX$f&jOr5qrs6cs!^5q!^!_6y!_#o5q#o#p6y#p;'S5q;'S;=`7h<%lO5q&z6jT$a`$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c`6|TOr6yrs7]s;'S6y;'S;=`7b<%lO6y`7bO$a``7eP;=`<%l6y&z7kP;=`<%l5q(^7w]$a`$f&j(R!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!r8uZ(R!bOY8pYZ6yZr8prs9hsw8pwx6yx#O8p#O#P6y#P;'S8p;'S;=`:R<%lO8p!r9oU$a`(R!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!r:UP;=`<%l8p(^:[P;=`<%l4k#%|:hh$f&j(Op(R!bOY%ZYZ&cZq%Zqr<Srs&}st%ZtuCruw%Zwx(rx!^%Z!^!_*g!_!c%Z!c!}Cr!}#O%Z#O#P&c#P#R%Z#R#SCr#S#T%Z#T#oCr#o#p*g#p$g%Z$g;'SCr;'S;=`El<%lOCr(r<__VS$f&j(Op(R!bOY<SYZ&cZr<Srs=^sw<Swx@nx!^<S!^!_Bm!_#O<S#O#P>`#P#o<S#o#pBm#p;'S<S;'S;=`Cl<%lO<S(Q=g]VS$f&j(R!bOY=^YZ&cZw=^wx>`x!^=^!^!_?q!_#O=^#O#P>`#P#o=^#o#p?q#p;'S=^;'S;=`@h<%lO=^&n>gXVS$f&jOY>`YZ&cZ!^>`!^!_?S!_#o>`#o#p?S#p;'S>`;'S;=`?k<%lO>`S?XSVSOY?SZ;'S?S;'S;=`?e<%lO?SS?hP;=`<%l?S&n?nP;=`<%l>`!f?xWVS(R!bOY?qZw?qwx?Sx#O?q#O#P?S#P;'S?q;'S;=`@b<%lO?q!f@eP;=`<%l?q(Q@kP;=`<%l=^'`@w]VS$f&j(OpOY@nYZ&cZr@nrs>`s!^@n!^!_Ap!_#O@n#O#P>`#P#o@n#o#pAp#p;'S@n;'S;=`Bg<%lO@ntAwWVS(OpOYApZrAprs?Ss#OAp#O#P?S#P;'SAp;'S;=`Ba<%lOAptBdP;=`<%lAp'`BjP;=`<%l@n#WBvYVS(Op(R!bOYBmZrBmrs?qswBmwxApx#OBm#O#P?S#P;'SBm;'S;=`Cf<%lOBm#WCiP;=`<%lBm(rCoP;=`<%l<S#%|C}i$f&j(g!L^(Op(R!bOY%ZYZ&cZr%Zrs&}st%ZtuCruw%Zwx(rx!Q%Z!Q![Cr![!^%Z!^!_*g!_!c%Z!c!}Cr!}#O%Z#O#P&c#P#R%Z#R#SCr#S#T%Z#T#oCr#o#p*g#p$g%Z$g;'SCr;'S;=`El<%lOCr#%|EoP;=`<%lCr(CSFRk$f&j(Op(R!b$Y#t'{&;d([!LYOY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr+dHRk$f&j(Op(R!b$Y#tOY%ZYZ&cZr%Zrs&}st%ZtuGvuw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Gv![!^%Z!^!_*g!_!c%Z!c!}Gv!}#O%Z#O#P&c#P#R%Z#R#SGv#S#T%Z#T#oGv#o#p*g#p$g%Z$g;'SGv;'S;=`Iv<%lOGv+dIyP;=`<%lGv(CSJPP;=`<%lEr%#SJ_`$f&j(Op(R!b#l$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#SKl_$f&j$O$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&COLva(p&;`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sv%ZvwM{wx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#SNW`$f&j#x$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/|! c_(Q$)`$f&j(OpOY!!bYZ!#hZr!!brs!#hsw!!bwx!$xx!^!!b!^!_!%z!_#O!!b#O#P!#h#P#o!!b#o#p!%z#p;'S!!b;'S;=`!'c<%lO!!b'l!!i_$f&j(OpOY!!bYZ!#hZr!!brs!#hsw!!bwx!$xx!^!!b!^!_!%z!_#O!!b#O#P!#h#P#o!!b#o#p!%z#p;'S!!b;'S;=`!'c<%lO!!b&z!#mX$f&jOw!#hwx6cx!^!#h!^!_!$Y!_#o!#h#o#p!$Y#p;'S!#h;'S;=`!$r<%lO!#h`!$]TOw!$Ywx7]x;'S!$Y;'S;=`!$l<%lO!$Y`!$oP;=`<%l!$Y&z!$uP;=`<%l!#h'l!%R]$a`$f&j(OpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(r!Q!&PZ(OpOY!%zYZ!$YZr!%zrs!$Ysw!%zwx!&rx#O!%z#O#P!$Y#P;'S!%z;'S;=`!']<%lO!%z!Q!&yU$a`(OpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)r!Q!'`P;=`<%l!%z'l!'fP;=`<%l!!b(*Q!'t_!k(!b$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'l!)O_!jM|$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+h!*[b$f&j(Op(R!b'|#)d#m$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rxz%Zz{!+d{!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S!+o`$f&j(Op(R!b#j$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&-O!,|`$f&j(Op(R!bn&%`OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&C[!.Z_!Y&;l$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS!/ec$f&j(Op(R!b|'<nOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!0p!P!Q%Z!Q![!3Y![!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'d!0ya$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!2O!P!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'d!2Z_!XMt$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!3eg$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!3Y![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S!3Y#S#X%Z#X#Y!4|#Y#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!5Vg$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx{%Z{|!6n|}%Z}!O!6n!O!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!6wc$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!8_c$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS!9uf$f&j(Op(R!b#k$IdOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpxz!;Zz{#,f{!P!;Z!P!Q#-{!Q!^!;Z!^!_#'Z!_!`#5k!`!a#7Q!a!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(r!;fb$f&j(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(Q!<w`$f&j(R!b!USOY!<nYZ&cZw!<nwx!=yx!P!<n!P!Q!Eb!Q!^!<n!^!_!GY!_!}!<n!}#O!Ja#O#P!Dj#P#o!<n#o#p!GY#p;'S!<n;'S;=`!Kj<%lO!<n&n!>Q^$f&j!USOY!=yYZ&cZ!P!=y!P!Q!>|!Q!^!=y!^!_!@Y!_!}!=y!}#O!Bw#O#P!Dj#P#o!=y#o#p!@Y#p;'S!=y;'S;=`!E[<%lO!=y&n!?Ta$f&j!USO!^&c!_#Z&c#Z#[!>|#[#]&c#]#^!>|#^#a&c#a#b!>|#b#g&c#g#h!>|#h#i&c#i#j!>|#j#m&c#m#n!>|#n#o&c#p;'S&c;'S;=`&w<%lO&cS!@_X!USOY!@YZ!P!@Y!P!Q!@z!Q!}!@Y!}#O!Ac#O#P!Bb#P;'S!@Y;'S;=`!Bq<%lO!@YS!APU!US#Z#[!@z#]#^!@z#a#b!@z#g#h!@z#i#j!@z#m#n!@zS!AfVOY!AcZ#O!Ac#O#P!A{#P#Q!@Y#Q;'S!Ac;'S;=`!B[<%lO!AcS!BOSOY!AcZ;'S!Ac;'S;=`!B[<%lO!AcS!B_P;=`<%l!AcS!BeSOY!@YZ;'S!@Y;'S;=`!Bq<%lO!@YS!BtP;=`<%l!@Y&n!B|[$f&jOY!BwYZ&cZ!^!Bw!^!_!Ac!_#O!Bw#O#P!Cr#P#Q!=y#Q#o!Bw#o#p!Ac#p;'S!Bw;'S;=`!Dd<%lO!Bw&n!CwX$f&jOY!BwYZ&cZ!^!Bw!^!_!Ac!_#o!Bw#o#p!Ac#p;'S!Bw;'S;=`!Dd<%lO!Bw&n!DgP;=`<%l!Bw&n!DoX$f&jOY!=yYZ&cZ!^!=y!^!_!@Y!_#o!=y#o#p!@Y#p;'S!=y;'S;=`!E[<%lO!=y&n!E_P;=`<%l!=y(Q!Eki$f&j(R!b!USOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#Z&}#Z#[!Eb#[#]&}#]#^!Eb#^#a&}#a#b!Eb#b#g&}#g#h!Eb#h#i&}#i#j!Eb#j#m&}#m#n!Eb#n#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!f!GaZ(R!b!USOY!GYZw!GYwx!@Yx!P!GY!P!Q!HS!Q!}!GY!}#O!Ic#O#P!Bb#P;'S!GY;'S;=`!JZ<%lO!GY!f!HZb(R!b!USOY'}Zw'}x#O'}#P#Z'}#Z#[!HS#[#]'}#]#^!HS#^#a'}#a#b!HS#b#g'}#g#h!HS#h#i'}#i#j!HS#j#m'}#m#n!HS#n;'S'};'S;=`(f<%lO'}!f!IhX(R!bOY!IcZw!Icwx!Acx#O!Ic#O#P!A{#P#Q!GY#Q;'S!Ic;'S;=`!JT<%lO!Ic!f!JWP;=`<%l!Ic!f!J^P;=`<%l!GY(Q!Jh^$f&j(R!bOY!JaYZ&cZw!Jawx!Bwx!^!Ja!^!_!Ic!_#O!Ja#O#P!Cr#P#Q!<n#Q#o!Ja#o#p!Ic#p;'S!Ja;'S;=`!Kd<%lO!Ja(Q!KgP;=`<%l!Ja(Q!KmP;=`<%l!<n'`!Ky`$f&j(Op!USOY!KpYZ&cZr!Kprs!=ys!P!Kp!P!Q!L{!Q!^!Kp!^!_!Ns!_!}!Kp!}#O##z#O#P!Dj#P#o!Kp#o#p!Ns#p;'S!Kp;'S;=`#%T<%lO!Kp'`!MUi$f&j(Op!USOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#Z(r#Z#[!L{#[#](r#]#^!L{#^#a(r#a#b!L{#b#g(r#g#h!L{#h#i(r#i#j!L{#j#m(r#m#n!L{#n#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rt!NzZ(Op!USOY!NsZr!Nsrs!@Ys!P!Ns!P!Q# m!Q!}!Ns!}#O#!|#O#P!Bb#P;'S!Ns;'S;=`##t<%lO!Nst# tb(Op!USOY)rZr)rs#O)r#P#Z)r#Z#[# m#[#])r#]#^# m#^#a)r#a#b# m#b#g)r#g#h# m#h#i)r#i#j# m#j#m)r#m#n# m#n;'S)r;'S;=`*Z<%lO)rt##RX(OpOY#!|Zr#!|rs!Acs#O#!|#O#P!A{#P#Q!Ns#Q;'S#!|;'S;=`##n<%lO#!|t##qP;=`<%l#!|t##wP;=`<%l!Ns'`#$R^$f&j(OpOY##zYZ&cZr##zrs!Bws!^##z!^!_#!|!_#O##z#O#P!Cr#P#Q!Kp#Q#o##z#o#p#!|#p;'S##z;'S;=`#$}<%lO##z'`#%QP;=`<%l##z'`#%WP;=`<%l!Kp(r#%fk$f&j(Op(R!b!USOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#Z%Z#Z#[#%Z#[#]%Z#]#^#%Z#^#a%Z#a#b#%Z#b#g%Z#g#h#%Z#h#i%Z#i#j#%Z#j#m%Z#m#n#%Z#n#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z#W#'d](Op(R!b!USOY#'ZZr#'Zrs!GYsw#'Zwx!Nsx!P#'Z!P!Q#(]!Q!}#'Z!}#O#)w#O#P!Bb#P;'S#'Z;'S;=`#*w<%lO#'Z#W#(fe(Op(R!b!USOY*gZr*grs'}sw*gwx)rx#O*g#P#Z*g#Z#[#(]#[#]*g#]#^#(]#^#a*g#a#b#(]#b#g*g#g#h#(]#h#i*g#i#j#(]#j#m*g#m#n#(]#n;'S*g;'S;=`+Z<%lO*g#W#*OZ(Op(R!bOY#)wZr#)wrs!Icsw#)wwx#!|x#O#)w#O#P!A{#P#Q#'Z#Q;'S#)w;'S;=`#*q<%lO#)w#W#*tP;=`<%l#)w#W#*zP;=`<%l#'Z(r#+W`$f&j(Op(R!bOY#*}YZ&cZr#*}rs!Jasw#*}wx##zx!^#*}!^!_#)w!_#O#*}#O#P!Cr#P#Q!;Z#Q#o#*}#o#p#)w#p;'S#*};'S;=`#,Y<%lO#*}(r#,]P;=`<%l#*}(r#,cP;=`<%l!;Z(CS#,sb$f&j(Op(R!b'v(;d!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(CS#.W_$f&j(Op(R!bS(;dOY#-{YZ&cZr#-{rs#/Vsw#-{wx#2gx!^#-{!^!_#4f!_#O#-{#O#P#0X#P#o#-{#o#p#4f#p;'S#-{;'S;=`#5e<%lO#-{(Bb#/`]$f&j(R!bS(;dOY#/VYZ&cZw#/Vwx#0Xx!^#/V!^!_#1j!_#O#/V#O#P#0X#P#o#/V#o#p#1j#p;'S#/V;'S;=`#2a<%lO#/V(AO#0`X$f&jS(;dOY#0XYZ&cZ!^#0X!^!_#0{!_#o#0X#o#p#0{#p;'S#0X;'S;=`#1d<%lO#0X(;d#1QSS(;dOY#0{Z;'S#0{;'S;=`#1^<%lO#0{(;d#1aP;=`<%l#0{(AO#1gP;=`<%l#0X(<v#1qW(R!bS(;dOY#1jZw#1jwx#0{x#O#1j#O#P#0{#P;'S#1j;'S;=`#2Z<%lO#1j(<v#2^P;=`<%l#1j(Bb#2dP;=`<%l#/V(Ap#2p]$f&j(OpS(;dOY#2gYZ&cZr#2grs#0Xs!^#2g!^!_#3i!_#O#2g#O#P#0X#P#o#2g#o#p#3i#p;'S#2g;'S;=`#4`<%lO#2g(<U#3pW(OpS(;dOY#3iZr#3irs#0{s#O#3i#O#P#0{#P;'S#3i;'S;=`#4Y<%lO#3i(<U#4]P;=`<%l#3i(Ap#4cP;=`<%l#2g(=h#4oY(Op(R!bS(;dOY#4fZr#4frs#1jsw#4fwx#3ix#O#4f#O#P#0{#P;'S#4f;'S;=`#5_<%lO#4f(=h#5bP;=`<%l#4f(CS#5hP;=`<%l#-{%#W#5xb$f&j$O$Id(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z+h#7_b$W#t$f&j(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z$/l#8rp$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!3Y!P!Q%Z!Q![#:v![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S#:v#S#U%Z#U#V#>Q#V#X%Z#X#Y!4|#Y#b%Z#b#c#<v#c#d#AY#d#l%Z#l#m#D[#m#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#;Rk$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!3Y!P!Q%Z!Q![#:v![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S#:v#S#X%Z#X#Y!4|#Y#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#=R_$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#>Zd$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#?i!R!S#?i!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#?i#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#?tf$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#?i!R!S#?i!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#?i#S#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Acc$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#Bn!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#Bn#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Bye$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#Bn!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#Bn#S#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Deg$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#E|![!^%Z!^!_*g!_!c%Z!c!i#E|!i#O%Z#O#P&c#P#R%Z#R#S#E|#S#T%Z#T#Z#E|#Z#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#FXi$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#E|![!^%Z!^!_*g!_!c%Z!c!i#E|!i#O%Z#O#P&c#P#R%Z#R#S#E|#S#T%Z#T#Z#E|#Z#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%Gh#HT_!d$b$f&j#|%<f(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)[#I__`l$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(@^#Jk^g!*v!h'.r(Op(R!b(tSOY*gZr*grs'}sw*gwx)rx!P*g!P!Q#Kg!Q!^*g!^!_#L]!_!`#M}!`#O*g#P;'S*g;'S;=`+Z<%lO*g(n#KpX$h&j(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#LfZ#n$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx!_*g!_!`#MX!`#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#MbX$O$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#NWX#o$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g%Gh$ Oa#[%?x$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`!a$!T!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#W$!`_#g$Ih$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%Gh$#nafBf#o$Id$c#|$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`$$s!`!a$%}!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$%O_#o$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$&Ya#n$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`!a$'_!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$'j`#n$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+h$(wc(h$Ip$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P$*S!P!^%Z!^!_*g!_!a%Z!a!b$+^!b#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+`$*__}'#p$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$+i`$f&j#y$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z#&^$,v_!{!Ln$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(@^$.Q_!P(8n$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(n$/UZ$f&jO!^$/w!^!_$0_!_#i$/w#i#j$0d#j#l$/w#l#m$2V#m#o$/w#o#p$0_#p;'S$/w;'S;=`$4b<%lO$/w(n$0OT^#S$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c#S$0dO^#S(n$0i[$f&jO!Q&c!Q![$1_![!^&c!_!c&c!c!i$1_!i#T&c#T#Z$1_#Z#o&c#o#p$3u#p;'S&c;'S;=`&w<%lO&c(n$1dZ$f&jO!Q&c!Q![$2V![!^&c!_!c&c!c!i$2V!i#T&c#T#Z$2V#Z#o&c#p;'S&c;'S;=`&w<%lO&c(n$2[Z$f&jO!Q&c!Q![$2}![!^&c!_!c&c!c!i$2}!i#T&c#T#Z$2}#Z#o&c#p;'S&c;'S;=`&w<%lO&c(n$3SZ$f&jO!Q&c!Q![$/w![!^&c!_!c&c!c!i$/w!i#T&c#T#Z$/w#Z#o&c#p;'S&c;'S;=`&w<%lO&c#S$3xR!Q![$4R!c!i$4R#T#Z$4R#S$4US!Q![$4R!c!i$4R#T#Z$4R#q#r$0_(n$4eP;=`<%l$/w!2r$4s_!V!+S$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$5}`#v$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&,v$7[_$f&j(Op(R!b(X&%WOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS$8jk$f&j(Op(R!b'{&;d$[#t([!LYOY%ZYZ&cZr%Zrs&}st%Ztu$8Zuw%Zwx(rx}%Z}!O$:_!O!Q%Z!Q![$8Z![!^%Z!^!_*g!_!c%Z!c!}$8Z!}#O%Z#O#P&c#P#R%Z#R#S$8Z#S#T%Z#T#o$8Z#o#p*g#p$g%Z$g;'S$8Z;'S;=`$<e<%lO$8Z+d$:jk$f&j(Op(R!b$[#tOY%ZYZ&cZr%Zrs&}st%Ztu$:_uw%Zwx(rx}%Z}!O$:_!O!Q%Z!Q![$:_![!^%Z!^!_*g!_!c%Z!c!}$:_!}#O%Z#O#P&c#P#R%Z#R#S$:_#S#T%Z#T#o$:_#o#p*g#p$g%Z$g;'S$:_;'S;=`$<_<%lO$:_+d$<bP;=`<%l$:_(CS$<hP;=`<%l$8Z!5p$<tX![!3l(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g&CO$=la(o&;`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p#q$+^#q;'S%Z;'S;=`+a<%lO%Z%#`$?O_!Z$I`r`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(r$@Y_!pS$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS$Aj|$f&j(Op(R!b't(;d$Y#t'{&;d([!LYOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$f%Z$f$g+g$g#BYEr#BY#BZ$AX#BZ$ISEr$IS$I_$AX$I_$JTEr$JT$JU$AX$JU$KVEr$KV$KW$AX$KW&FUEr&FU&FV$AX&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$AX?HUOEr(CS$Duk$f&j(Op(R!b'u(;d$Y#t'{&;d([!LYOY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr",tokenizers:[oO,aO,hO,2,3,4,5,6,7,8,9,10,11,12,13,rO,new qp("$S~RRtu[#O#Pg#S#T#|~_P#o#pb~gOt~~jVO#i!P#i#j!U#j#l!P#l#m!q#m;'S!P;'S;=`#v<%lO!P~!UO!R~~!XS!Q![!e!c!i!e#T#Z!e#o#p#Z~!hR!Q![!q!c!i!q#T#Z!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![!P!c!i!P#T#Z!P~#^R!Q![#g!c!i#g#T#Z#g~#jS!Q![#g!c!i#g#T#Z#g#q#r!P~#yP;=`<%l!P~$RO(Z~~",141,332),new qp("j~RQYZXz{^~^O'x~~aP!P!Qd~iO'y~~",25,315)],topRules:{Script:[0,6],SingleExpression:[1,269],SingleClassItem:[2,270]},dialects:{jsx:0,ts:14614},dynamicPrecedences:{69:1,79:1,81:1,165:1,193:1},specialized:[{term:319,get:t=>fO[t]||-1},{term:334,get:t=>uO[t]||-1},{term:70,get:t=>dO[t]||-1}],tokenPrec:14638}),OO=[Ed("function ${name}(${params}) {\n\t${}\n}",{label:"function",detail:"definition",type:"keyword"}),Ed("for (let ${index} = 0; ${index} < ${bound}; ${index}++) {\n\t${}\n}",{label:"for",detail:"loop",type:"keyword"}),Ed("for (let ${name} of ${collection}) {\n\t${}\n}",{label:"for",detail:"of loop",type:"keyword"}),Ed("do {\n\t${}\n} while (${})",{label:"do",detail:"loop",type:"keyword"}),Ed("while (${}) {\n\t${}\n}",{label:"while",detail:"loop",type:"keyword"}),Ed("try {\n\t${}\n} catch (${error}) {\n\t${}\n}",{label:"try",detail:"/ catch block",type:"keyword"}),Ed("if (${}) {\n\t${}\n}",{label:"if",detail:"block",type:"keyword"}),Ed("if (${}) {\n\t${}\n} else {\n\t${}\n}",{label:"if",detail:"/ else block",type:"keyword"}),Ed("class ${name} {\n\tconstructor(${params}) {\n\t\t${}\n\t}\n}",{label:"class",detail:"definition",type:"keyword"}),Ed('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),Ed('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],gO=OO.concat([Ed("interface ${name} {\n\t${}\n}",{label:"interface",detail:"definition",type:"keyword"}),Ed("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),Ed("enum ${name} {\n\t${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),mO=new ka,wO=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function vO(t){return(e,i)=>{let n=e.node.getChild("VariableDefinition");return n&&i(n,t),!0}}const bO=["FunctionDeclaration"],yO={FunctionDeclaration:vO("function"),ClassDeclaration:vO("class"),ClassExpression:()=>!0,EnumDeclaration:vO("constant"),TypeAliasDeclaration:vO("type"),NamespaceDeclaration:vO("namespace"),VariableDefinition(t,e){t.matchContext(bO)||e(t,"variable")},TypeDefinition(t,e){e(t,"type")},__proto__:null};function SO(t,e){let i=mO.get(e);if(i)return i;let n=[],s=!0;function r(e,i){let s=t.sliceString(e.from,e.to);n.push({label:s,type:i})}return e.cursor(ra.IncludeAnonymous).iterate((e=>{if(s)s=!1;else if(e.name){let t=yO[e.name];if(t&&t(e,r)||wO.has(e.name))return!1}else if(e.to-e.from>8192){for(let i of SO(t,e.node))n.push(i);return!1}})),mO.set(e,n),n}const xO=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,kO=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName",".","?."];function QO(t){let e=cl(t.state).resolveInner(t.pos,-1);if(kO.indexOf(e.name)>-1)return null;let i="VariableName"==e.name||e.to-e.from<20&&xO.test(t.state.sliceDoc(e.from,e.to));if(!i&&!t.explicit)return null;let n=[];for(let i=e;i;i=i.parent)wO.has(i.name)&&(n=n.concat(SO(t.state.doc,i)));return{options:n,from:i?e.from:t.pos,validFor:xO}}function $O(t,e,i){var n;let s=[];for(;;){let r,o=e.firstChild;if("VariableName"==(null==o?void 0:o.name))return s.push(t(o)),{path:s.reverse(),name:i};if("MemberExpression"!=(null==o?void 0:o.name)||"PropertyName"!=(null===(n=r=o.lastChild)||void 0===n?void 0:n.name))return null;s.push(t(r)),e=o}}function PO(t){let e=e=>t.state.doc.sliceString(e.from,e.to),i=cl(t.state).resolveInner(t.pos,-1);return"PropertyName"==i.name?$O(e,i.parent,e(i)):"."!=i.name&&"?."!=i.name||"MemberExpression"!=i.parent.name?kO.indexOf(i.name)>-1?null:"VariableName"==i.name||i.to-i.from<20&&xO.test(e(i))?{path:[],name:e(i)}:"MemberExpression"==i.name?$O(e,i,""):t.explicit?{path:[],name:""}:null:$O(e,i.parent,"")}const ZO=hl.define({name:"javascript",parser:pO.configure({props:[Cl.add({IfStatement:Dl({except:/^\s*({|else\b)/}),TryStatement:Dl({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:jl,SwitchBody:t=>{let e=t.textAfter,i=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return t.baseIndent+(i?0:n?1:2)*t.unit},Block:Wl({closing:"}"}),ArrowFunction:t=>t.baseIndent+t.unit,"TemplateString BlockComment":()=>null,"Statement Property":Dl({except:/^{/}),JSXElement(t){let e=/^\s*<\//.test(t.textAfter);return t.lineIndent(t.node.from)+(e?0:t.unit)},JSXEscape(t){let e=/\s*\}/.test(t.textAfter);return t.lineIndent(t.node.from)+(e?0:t.unit)},"JSXOpenTag JSXSelfClosingTag":t=>t.column(t.node.from)+t.unit}),_l.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Vl,BlockComment:t=>({from:t.from+2,to:t.to-2})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),CO={test:t=>/^JSX/.test(t.name),facet:rl({commentTokens:{block:{open:"{/*",close:"*/}"}}})},TO=ZO.configure({dialect:"ts"},"typescript"),AO=ZO.configure({dialect:"jsx",props:[ol.add((t=>t.isTop?[CO]:void 0))]}),RO=ZO.configure({dialect:"jsx ts",props:[ol.add((t=>t.isTop?[CO]:void 0))]},"typescript");let XO=t=>({label:t,type:"keyword"});const YO="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(XO),WO=YO.concat(["declare","implements","private","protected","public"].map(XO));function MO(t,e,i=t.length){for(let n=null==e?void 0:e.firstChild;n;n=n.nextSibling)if("JSXIdentifier"==n.name||"JSXBuiltin"==n.name||"JSXNamespacedName"==n.name||"JSXMemberExpression"==n.name)return t.sliceString(n.from,Math.min(n.to,i));return""}const jO="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),DO=Gs.inputHandler.of(((t,e,i,n,s)=>{if((jO?t.composing:t.compositionStarted)||t.state.readOnly||e!=i||">"!=n&&"/"!=n||!ZO.isActiveAt(t.state,e,-1))return!1;let r=s(),{state:o}=r,a=o.changeByRange((t=>{var e;let i,{head:s}=t,r=cl(o).resolveInner(s-1,-1);if("JSXStartTag"==r.name&&(r=r.parent),o.doc.sliceString(s-1,s)!=n||"JSXAttributeValue"==r.name&&r.to>s);else{if(">"==n&&"JSXFragmentTag"==r.name)return{range:t,changes:{from:s,insert:"</>"}};if("/"==n&&"JSXStartCloseTag"==r.name){let t=r.parent,n=t.parent;if(n&&t.from==s-2&&((i=MO(o.doc,n.firstChild,s))||"JSXFragmentTag"==(null===(e=n.firstChild)||void 0===e?void 0:e.name))){let t=`${i}>`;return{range:Y.cursor(s+t.length,-1),changes:{from:s,insert:t}}}}else if(">"==n){let e=function(t){for(;;){if("JSXOpenTag"==t.name||"JSXSelfClosingTag"==t.name||"JSXFragmentTag"==t.name)return t;if("JSXEscape"==t.name||!t.parent)return null;t=t.parent}}(r);if(e&&!/^\/?>|^<\//.test(o.doc.sliceString(s,s+2))&&(i=MO(o.doc,e,s)))return{range:t,changes:{from:s,insert:`</${i}>`}}}}return{range:t}}));return!a.changes.empty&&(t.dispatch([r,o.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)}));function EO(t,e,i,n){return i.line(t+n.line).from+e+(1==t?n.col-1:-1)}function qO(t,e,i){let n=EO(t.line,t.column,e,i),s={from:n,to:null!=t.endLine&&1!=t.endColumn?EO(t.endLine,t.endColumn,e,i):n,message:t.message,source:t.ruleId?"eslint:"+t.ruleId:"eslint",severity:1==t.severity?"warning":"error"};if(t.fix){let{range:e,text:r}=t.fix,o=e[0]+i.pos-n,a=e[1]+i.pos-n;s.actions=[{name:"fix",apply(t,e){t.dispatch({changes:{from:e+o,to:e+a,insert:r},scrollIntoView:!0})}}]}return s}var _O=Object.freeze({__proto__:null,autoCloseTags:DO,completionPath:PO,esLint:function(t,e){return e||(e={parserOptions:{ecmaVersion:2019,sourceType:"module"},env:{browser:!0,node:!0,es6:!0,es2015:!0,es2017:!0,es2020:!0},rules:{}},t.getRules().forEach(((t,i)=>{t.meta.docs.recommended&&(e.rules[i]=2)}))),i=>{let{state:n}=i,s=[];for(let{from:i,to:r}of ZO.findRegions(n)){let o=n.doc.lineAt(i),a={line:o.number-1,col:i-o.from,pos:i};for(let o of t.verify(n.sliceDoc(i,r),e))s.push(qO(o,n.doc,a))}return s}},javascript:function(t={}){let e=t.jsx?t.typescript?RO:AO:t.typescript?TO:ZO,i=t.typescript?gO.concat(WO):OO.concat(YO);return new yl(e,[ZO.data.of({autocomplete:(n=kO,s=zu(i),t=>{for(let e=cl(t.state).resolveInner(t.pos,-1);e;e=e.parent){if(n.indexOf(e.name)>-1)return null;if(e.type.isTop)break}return s(t)})}),ZO.data.of({autocomplete:QO}),t.jsx?DO:[]]);var n,s},javascriptLanguage:ZO,jsxLanguage:AO,localCompletionSource:QO,scopeCompletionSource:function(t){let e=new Map;return i=>{let n=PO(i);if(!n)return null;let s=t;for(let t of n.path)if(s=s[t],!s)return null;let r=e.get(s);return r||e.set(s,r=function(t,e){let i=[],n=new Set;for(let s=0;;s++){for(let r of(Object.getOwnPropertyNames||Object.keys)(t)){if(!/^[a-zA-Z_$\xaa-\uffdc][\w$\xaa-\uffdc]*$/.test(r)||n.has(r))continue;let o;n.add(r);try{o=t[r]}catch(t){continue}i.push({label:r,type:"function"==typeof o?/^[A-Z]/.test(r)?"class":e?"function":"method":e?"variable":"property",boost:-s})}let r=Object.getPrototypeOf(t);if(!r)return i;t=r}}(s,!n.path.length)),{from:i.pos-n.name.length,options:r,validFor:xO}}},snippets:OO,tsxLanguage:RO,typescriptLanguage:TO,typescriptSnippets:gO});return t.codemirror=Tp,t.codemirrorLangJavascript=_O,t.codemirrorLanguage=cc,t.codemirrorState=Bt,t.codemirrorView=No,t.lezerHighlight=nl,t}({}); diff --git a/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs b/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs new file mode 100644 index 0000000000..d49620c2cd --- /dev/null +++ b/devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs @@ -0,0 +1 @@ +class t{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,n){[t,e]=h(this,t,e);let s=[];return this.decompose(0,t,s,2),n.length&&n.decompose(0,n.length,s,3),this.decompose(e,this.length,s,1),i.from(s,this.length-(e-t)+n.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=h(this,t,e);let n=[];return this.decompose(t,e,n,0),i.from(n,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new r(this),s=new r(t);for(let t=e,r=e;;){if(n.next(t),s.next(t),t=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(t=1){return new r(this,t)}iterRange(t,e=this.length){return new o(this,t,e)}iterLines(t,e){let i;if(null==t)i=this.iter();else{null==e&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new a(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(n){if(0==n.length)throw new RangeError("A document must have at least one line");return 1!=n.length||n[0]?n.length<=32?new e(n):i.from(e.split(n,[])):t.empty}}class e extends t{constructor(t,e=function(t){let e=-1;for(let i of t)e+=i.length+1;return e}(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((e?i:o)>=t)return new l(n,o,i,r);n=o+1,i++}}decompose(t,i,r,o){let a=t<=0&&i>=this.length?this:new e(s(this.text,t,i),Math.min(i,this.length)-Math.max(0,t));if(1&o){let t=r.pop(),i=n(a.text,t.text.slice(),0,a.length);if(i.length<=32)r.push(new e(i,t.length+a.length));else{let t=i.length>>1;r.push(new e(i.slice(0,t)),new e(i.slice(t)))}}else r.push(a)}replace(t,r,o){if(!(o instanceof e))return super.replace(t,r,o);[t,r]=h(this,t,r);let a=n(this.text,n(o.text,s(this.text,0,t)),r),l=this.length+o.length-(r-t);return a.length<=32?new e(a,l):i.from(e.split(a,[]),l)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;s<=e&&r<this.text.length;r++){let o=this.text[r],a=s+o.length;s>t&&r&&(n+=i),t<a&&e>s&&(n+=o.slice(Math.max(0,t-s),e-s)),s=a+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,i){let n=[],s=-1;for(let r of t)n.push(r),s+=r.length+1,32==n.length&&(i.push(new e(n,s)),n=[],s=-1);return s>-1&&i.push(new e(n,s)),i}}class i extends t{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let e of t)this.lines+=e.lines}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,a=i+r.lines-1;if((e?a:o)>=t)return r.lineInner(t,e,i,n);n=o+1,i=a+1}}decompose(t,e,i,n){for(let s=0,r=0;r<=e&&s<this.children.length;s++){let o=this.children[s],a=r+o.length;if(t<=a&&e>=r){let s=n&((r<=t?1:0)|(a>=e?2:0));r>=t&&a<=e&&!s?i.push(o):o.decompose(t-r,e-r,i,s)}r=a+1}}replace(t,e,n){if([t,e]=h(this,t,e),n.lines<this.lines)for(let s=0,r=0;s<this.children.length;s++){let o=this.children[s],a=r+o.length;if(t>=r&&e<=a){let l=o.replace(t-r,e-r,n),h=this.lines-o.lines+l.lines;if(l.lines<h>>4&&l.lines>h>>6){let r=this.children.slice();return r[s]=l,new i(r,this.length-(e-t)+n.length)}return super.replace(r,a,l)}r=a+1}return super.replace(t,e,n)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;s<this.children.length&&r<=e;s++){let o=this.children[s],a=r+o.length;r>t&&s&&(n+=i),t<a&&e>r&&(n+=o.sliceString(t-r,e-r,i)),r=a+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof i))return 0;let n=0,[s,r,o,a]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==a)return n;let i=this.children[s],l=t.children[r];if(i!=l)return n+i.scanIdentical(l,e);n+=i.length+1}}static from(t,n=t.reduce(((t,e)=>t+e.length+1),-1)){let s=0;for(let e of t)s+=e.lines;if(s<32){let i=[];for(let e of t)e.flatten(i);return new e(i,n)}let r=Math.max(32,s>>5),o=r<<1,a=r>>1,l=[],h=0,c=-1,f=[];function u(t){let n;if(t.lines>o&&t instanceof i)for(let e of t.children)u(e);else t.lines>a&&(h>a||!h)?(d(),l.push(t)):t instanceof e&&h&&(n=f[f.length-1])instanceof e&&t.lines+n.lines<=32?(h+=t.lines,c+=t.length+1,f[f.length-1]=new e(n.text.concat(t.text),n.length+1+t.length)):(h+t.lines>r&&d(),h+=t.lines,c+=t.length+1,f.push(t))}function d(){0!=h&&(l.push(1==f.length?f[0]:i.from(f,c)),c=-1,h=f.length=0)}for(let e of t)u(e);return d(),1==l.length?l[0]:new i(l,n)}}function n(t,e,i=0,n=1e9){for(let s=0,r=0,o=!0;r<t.length&&s<=n;r++){let a=t[r],l=s+a.length;l>=i&&(l>n&&(a=a.slice(0,n-s)),s<i&&(a=a.slice(i-s)),o?(e[e.length-1]+=a,o=!1):e.push(a)),s=l+1}return e}function s(t,e,i){return n(t,[""],e,i)}t.empty=new e([""],0);class r{constructor(t,i=1){this.dir=i,this.done=!1,this.lineBreak=!1,this.value="",this.nodes=[t],this.offsets=[i>0?1:(t instanceof e?t.text.length:t.children.length)<<1]}nextInner(t,i){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,a=s instanceof e?s.text.length:s.children.length;if(o==(i>0?a:0)){if(0==n)return this.done=!0,this.value="",this;i>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(i>0?0:1)){if(this.offsets[n]+=i,0==t)return this.lineBreak=!0,this.value="\n",this;t--}else if(s instanceof e){let e=s.text[o+(i<0?-1:0)];if(this.offsets[n]+=i,e.length>Math.max(0,t))return this.value=0==t?e:i>0?e.slice(t):e.slice(0,e.length-t),this;t-=e.length}else{let r=s.children[o+(i<0?-1:0)];t>r.length?(t-=r.length,this.offsets[n]+=i):(i<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(i>0?1:(r instanceof e?r.text.length:r.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}}class o{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new r(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class a{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(t.prototype[Symbol.iterator]=function(){return this.iter()},r.prototype[Symbol.iterator]=o.prototype[Symbol.iterator]=a.prototype[Symbol.iterator]=function(){return this});class l{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}}function h(t,e,i){return[e=Math.max(0,Math.min(t.length,e)),Math.max(e,Math.min(t.length,i))]}let c="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((t=>t?parseInt(t,36):1));for(let t=1;t<c.length;t++)c[t]+=c[t-1];function f(t){for(let e=1;e<c.length;e+=2)if(c[e]>t)return c[e-1]<=t;return!1}function u(t){return t>=127462&&t<=127487}const d=8205;function p(t,e,i=!0,n=!0){return(i?O:g)(t,e,n)}function O(t,e,i){if(e==t.length)return e;e&&m(t.charCodeAt(e))&&w(t.charCodeAt(e-1))&&e--;let n=v(t,e);for(e+=y(n);e<t.length;){let s=v(t,e);if(n==d||s==d||i&&f(s))e+=y(s),n=s;else{if(!u(s))break;{let i=0,n=e-2;for(;n>=0&&u(v(t,n));)i++,n-=2;if(i%2==0)break;e+=2}}}return e}function g(t,e,i){for(;e>0;){let n=O(t,e-2,i);if(n<e)return n;e--}return 0}function m(t){return t>=56320&&t<57344}function w(t){return t>=55296&&t<56320}function v(t,e){let i=t.charCodeAt(e);if(!w(i)||e+1==t.length)return i;let n=t.charCodeAt(e+1);return m(n)?n-56320+(i-55296<<10)+65536:i}function b(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t)))}function y(t){return t<65536?1:2}const S=/\r\n?|\n/;var x=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(x||(x={}));class k{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;e<this.sections.length;e+=2)t+=this.sections[e];return t}get newLength(){let t=0;for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e+1];t+=i<0?this.sections[e]:i}return t}get empty(){return 0==this.sections.length||2==this.sections.length&&this.sections[1]<0}iterGaps(t){for(let e=0,i=0,n=0;e<this.sections.length;){let s=this.sections[e++],r=this.sections[e++];r<0?(t(i,n,s),n+=s):n+=r,i+=s}}iterChangedRanges(t,e=!1){Z(this,t,e)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let i=this.sections[e++],n=this.sections[e++];n<0?t.push(i,n):t.push(n,i)}return new k(t)}composeDesc(t){return this.empty?t:t.empty?this:T(this,t)}mapDesc(t,e=!1){return t.empty?this:C(this,t,e)}mapPos(t,e=-1,i=x.Simple){let n=0,s=0;for(let r=0;r<this.sections.length;){let o=this.sections[r++],a=this.sections[r++],l=n+o;if(a<0){if(l>t)return s+(t-n);s+=o}else{if(i!=x.Simple&&l>=t&&(i==x.TrackDel&&n<t&&l>t||i==x.TrackBefore&&n<t||i==x.TrackAfter&&l>t))return null;if(l>t||l==t&&e<0&&!o)return t==n||e<0?s:s+a;s+=a}n=l}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return s}touchesRange(t,e=t){for(let i=0,n=0;i<this.sections.length&&n<=e;){let s=n+this.sections[i++];if(this.sections[i++]>=0&&n<=e&&s>=t)return!(n<t&&s>e)||"cover";n=s}return!1}toString(){let t="";for(let e=0;e<this.sections.length;){let i=this.sections[e++],n=this.sections[e++];t+=(t?" ":"")+i+(n>=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some((t=>"number"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new k(t)}static create(t){return new k(t)}}class Q extends k{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return Z(this,((e,i,n,s,r)=>t=t.replace(n,n+(i-e),r)),!1),t}mapDesc(t,e=!1){return C(this,t,e,!0)}invert(e){let i=this.sections.slice(),n=[];for(let s=0,r=0;s<i.length;s+=2){let o=i[s],a=i[s+1];if(a>=0){i[s]=a,i[s+1]=o;let l=s>>1;for(;n.length<l;)n.push(t.empty);n.push(o?e.slice(r,r+o):t.empty)}r+=o}return new Q(i,n)}compose(t){return this.empty?t:t.empty?this:T(this,t,!0)}map(t,e=!1){return t.empty?this:C(this,t,e,!0)}iterChanges(t,e=!1){Z(this,t,e)}get desc(){return k.create(this.sections)}filter(t){let e=[],i=[],n=[],s=new A(this);t:for(let r=0,o=0;;){let a=r==t.length?1e9:t[r++];for(;o<a||o==a&&0==s.len;){if(s.done)break t;let t=Math.min(s.len,a-o);$(n,t,-1);let r=-1==s.ins?-1:0==s.off?s.ins:0;$(e,t,r),r>0&&P(i,e,s.text),s.forward(t),o+=t}let l=t[r++];for(;o<l;){if(s.done)break t;let t=Math.min(s.len,l-o);$(e,t,-1),$(n,t,-1==s.ins?-1:0==s.off?s.ins:0),s.forward(t),o+=t}}return{changes:new Q(e,i),filtered:k.create(n)}}toJSON(){let t=[];for(let e=0;e<this.sections.length;e+=2){let i=this.sections[e],n=this.sections[e+1];n<0?t.push(i):0==n?t.push([i]):t.push([i].concat(this.inserted[e>>1].toJSON()))}return t}static of(e,i,n){let s=[],r=[],o=0,a=null;function l(t=!1){if(!t&&!s.length)return;o<i&&$(s,i-o,-1);let e=new Q(s,r);a=a?a.compose(e.map(a)):e,s=[],r=[],o=0}return function e(h){if(Array.isArray(h))for(let t of h)e(t);else if(h instanceof Q){if(h.length!=i)throw new RangeError(`Mismatched change set length (got ${h.length}, expected ${i})`);l(),a=a?a.compose(h.map(a)):h}else{let{from:e,to:a=e,insert:c}=h;if(e>a||e<0||a>i)throw new RangeError(`Invalid change range ${e} to ${a} (in doc of length ${i})`);let f=c?"string"==typeof c?t.of(c.split(n||S)):c:t.empty,u=f.length;if(e==a&&0==u)return;e<o&&l(),e>o&&$(s,e-o,-1),$(s,a-e,u),P(r,s,f),o=a}}(e),l(!a),a}static empty(t){return new Q(t?[t,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;s<e.length;s++){let r=e[s];if("number"==typeof r)i.push(r,-1);else{if(!Array.isArray(r)||"number"!=typeof r[0]||r.some(((t,e)=>e&&"string"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length<s;)n.push(t.empty);n[s]=t.of(r.slice(1)),i.push(r[0],n[s].length)}}}return new Q(i,n)}static createSet(t,e){return new Q(t,e)}}function $(t,e,i,n=!1){if(0==e&&i<=0)return;let s=t.length-2;s>=0&&i<=0&&i==t[s+1]?t[s]+=e:0==e&&0==t[s]?t[s+1]+=i:n?(t[s]+=e,t[s+1]+=i):t.push(e,i)}function P(e,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s<e.length)e[e.length-1]=e[e.length-1].append(n);else{for(;e.length<s;)e.push(t.empty);e.push(n)}}function Z(e,i,n){let s=e.inserted;for(let r=0,o=0,a=0;a<e.sections.length;){let l=e.sections[a++],h=e.sections[a++];if(h<0)r+=l,o+=l;else{let c=r,f=o,u=t.empty;for(;c+=l,f+=h,h&&s&&(u=u.append(s[a-2>>1])),!(n||a==e.sections.length||e.sections[a+1]<0);)l=e.sections[a++],h=e.sections[a++];i(r,c,o,f,u),r=c,o=f}}}function C(t,e,i,n=!1){let s=[],r=n?[]:null,o=new A(t),a=new A(e);for(let t=-1;;)if(-1==o.ins&&-1==a.ins){let t=Math.min(o.len,a.len);$(s,t,-1),o.forward(t),a.forward(t)}else if(a.ins>=0&&(o.ins<0||t==o.i||0==o.off&&(a.len<o.len||a.len==o.len&&!i))){let e=a.len;for($(s,a.ins,-1);e;){let i=Math.min(o.len,e);o.ins>=0&&t<o.i&&o.len<=i&&($(s,0,o.ins),r&&P(r,s,o.text),t=o.i),o.forward(i),e-=i}a.next()}else{if(!(o.ins>=0)){if(o.done&&a.done)return r?Q.createSet(s,r):k.create(s);throw new Error("Mismatched change set lengths")}{let e=0,i=o.len;for(;i;)if(-1==a.ins){let t=Math.min(i,a.len);e+=t,i-=t,a.forward(t)}else{if(!(0==a.ins&&a.len<i))break;i-=a.len,a.next()}$(s,e,t<o.i?o.ins:0),r&&t<o.i&&P(r,s,o.text),t=o.i,o.forward(o.len-i)}}}function T(t,e,i=!1){let n=[],s=i?[]:null,r=new A(t),o=new A(e);for(let t=!1;;){if(r.done&&o.done)return s?Q.createSet(n,s):k.create(n);if(0==r.ins)$(n,r.len,0,t),r.next();else if(0!=o.len||o.done){if(r.done||o.done)throw new Error("Mismatched change set lengths");{let e=Math.min(r.len2,o.len),i=n.length;if(-1==r.ins){let i=-1==o.ins?-1:o.off?0:o.ins;$(n,e,i,t),s&&i&&P(s,n,o.text)}else-1==o.ins?($(n,r.off?0:r.len,e,t),s&&P(s,n,r.textBit(e))):($(n,r.off?0:r.len,o.off?0:o.ins,t),s&&!o.off&&P(s,n,o.text));t=(r.ins>e||o.ins>=0&&o.len>e)&&(t||n.length>i),r.forward2(e),o.forward(e)}}else $(n,0,o.ins,t),s&&P(s,n,o.text),o.next()}}class A{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i<t.length?(this.len=t[this.i++],this.ins=t[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return-2==this.ins}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length?t.empty:e[i]}textBit(e){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!e?t.empty:i[n].slice(this.off,null==e?void 0:this.off+e)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){-1==this.ins?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}}class R{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let t=7&this.flags;return 7==t?null:t}get goalColumn(){let t=this.flags>>6;return 16777215==t?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new R(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return X.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return X.range(this.anchor,i)}eq(t,e=!1){return!(this.anchor!=t.anchor||this.head!=t.head||e&&this.empty&&this.assoc!=t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||"number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid JSON representation for SelectionRange");return X.range(t.anchor,t.head)}static create(t,e,i){return new R(t,e,i)}}class X{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:X.create(this.ranges.map((i=>i.map(t,e))),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;i<this.ranges.length;i++)if(!this.ranges[i].eq(t.ranges[i],e))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return 1==this.ranges.length?this:new X([this.main],0)}addRange(t,e=!0){return X.create([t].concat(this.ranges),e?0:this.mainIndex+1)}replaceRange(t,e=this.mainIndex){let i=this.ranges.slice();return i[e]=t,X.create(i,this.mainIndex)}toJSON(){return{ranges:this.ranges.map((t=>t.toJSON())),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||"number"!=typeof t.main||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new X(t.ranges.map((t=>R.fromJSON(t))),t.main)}static single(t,e=t){return new X([X.range(t,e)],0)}static create(t,e=0){if(0==t.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;n<t.length;n++){let s=t[n];if(s.empty?s.from<=i:s.from<i)return X.normalized(t.slice(),e);i=s.to}return new X(t,e)}static cursor(t,e=0,i,n){return R.create(t,t,(0==e?0:e<0?8:16)|(null==i?7:Math.min(6,i))|(null!=n?n:16777215)<<6)}static range(t,e,i,n){let s=(null!=i?i:16777215)<<6|(null==n?7:Math.min(6,n));return e<t?R.create(e,t,48|s):R.create(t,e,(e>t?8:0)|s)}static normalized(t,e=0){let i=t[e];t.sort(((t,e)=>t.from-e.from)),e=t.indexOf(i);for(let i=1;i<t.length;i++){let n=t[i],s=t[i-1];if(n.empty?n.from<=s.to:n.from<s.to){let r=s.from,o=Math.max(n.to,s.to);i<=e&&e--,t.splice(--i,2,n.anchor>n.head?X.range(o,r):X.range(r,o))}}return new X(t,e)}}function Y(t,e){for(let i of t.ranges)if(i.to>e)throw new RangeError("Selection points outside of document")}let W=0;class M{constructor(t,e,i,n,s){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=W++,this.default=t([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(t={}){return new M(t.combine||(t=>t),t.compareInput||((t,e)=>t===e),t.compare||(t.combine?(t,e)=>t===e:j),!!t.static,t.enables)}of(t){return new D([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new D(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new D(t,this,2,e)}from(t,e){return e||(e=t=>t),this.compute([t],(i=>e(i.field(t))))}}function j(t,e){return t==e||t.length==e.length&&t.every(((t,i)=>t===e[i]))}class D{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=W++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,s=this.id,r=t[s]>>1,o=2==this.type,a=!1,l=!1,h=[];for(let i of this.dependencies)"doc"==i?a=!0:"selection"==i?l=!0:0==(1&(null!==(e=t[i.id])&&void 0!==e?e:1))&&h.push(t[i.id]);return{create:t=>(t.values[r]=i(t),1),update(t,e){if(a&&e.docChanged||l&&(e.docChanged||e.selection)||q(t,h)){let e=i(t);if(o?!E(e,t.values[r],n):!n(e,t.values[r]))return t.values[r]=e,1}return 0},reconfigure:(t,e)=>{let a,l=e.config.address[s];if(null!=l){let s=et(e,l);if(this.dependencies.every((i=>i instanceof M?e.facet(i)===t.facet(i):!(i instanceof I)||e.field(i,!1)==t.field(i,!1)))||(o?E(a=i(t),s,n):n(a=i(t),s)))return t.values[r]=s,0}else a=i(t);return t.values[r]=a,1}}}}function E(t,e,i){if(t.length!=e.length)return!1;for(let n=0;n<t.length;n++)if(!i(t[n],e[n]))return!1;return!0}function q(t,e){let i=!1;for(let n of e)1&tt(t,n)&&(i=!0);return i}function _(t,e,i){let n=i.map((e=>t[e.id])),s=i.map((t=>t.type)),r=n.filter((t=>!(1&t))),o=t[e.id]>>1;function a(t){let i=[];for(let e=0;e<n.length;e++){let r=et(t,n[e]);if(2==s[e])for(let t of r)i.push(t);else i.push(r)}return e.combine(i)}return{create(t){for(let e of n)tt(t,e);return t.values[o]=a(t),1},update(t,i){if(!q(t,r))return 0;let n=a(t);return e.compare(n,t.values[o])?0:(t.values[o]=n,1)},reconfigure(t,s){let r=q(t,n),l=s.config.facets[e.id],h=s.facet(e);if(l&&!r&&j(i,l))return t.values[o]=h,0;let c=a(t);return e.compare(c,h)?(t.values[o]=h,0):(t.values[o]=c,1)}}}const V=M.define({static:!0});class I{constructor(t,e,i,n,s){this.id=t,this.createF=e,this.updateF=i,this.compareF=n,this.spec=s,this.provides=void 0}static define(t){let e=new I(W++,t.create,t.update,t.compare||((t,e)=>t===e),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(V).find((t=>t.field==this));return((null==e?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:t=>(t.values[e]=this.create(t),1),update:(t,i)=>{let n=t.values[e],s=this.updateF(n,i);return this.compareF(n,s)?0:(t.values[e]=s,1)},reconfigure:(t,i)=>null!=i.config.address[this.id]?(t.values[e]=i.field(this),0):(t.values[e]=this.create(t),1)}}init(t){return[this,V.of({field:this,create:t})]}get extension(){return this}}const z=4,B=3,G=2,L=1;function N(t){return e=>new H(e,t)}const U={highest:N(0),high:N(L),default:N(G),low:N(B),lowest:N(z)};class H{constructor(t,e){this.inner=t,this.prec=e}}class F{of(t){return new J(this,t)}reconfigure(t){return F.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}}class J{constructor(t,e){this.compartment=t,this.inner=e}}class K{constructor(t,e,i,n,s,r){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length<i.length;)this.statusTemplate.push(0)}staticFacet(t){let e=this.address[t.id];return null==e?t.default:this.staticValues[e>>1]}static resolve(t,e,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(t,e,i){let n=[[],[],[],[],[]],s=new Map;function r(t,o){let a=s.get(t);if(null!=a){if(a<=o)return;let e=n[a].indexOf(t);e>-1&&n[a].splice(e,1),t instanceof J&&i.delete(t.compartment)}if(s.set(t,o),Array.isArray(t))for(let e of t)r(e,o);else if(t instanceof J){if(i.has(t.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=e.get(t.compartment)||t.inner;i.set(t.compartment,n),r(n,o)}else if(t instanceof H)r(t.inner,t.prec);else if(t instanceof I)n[o].push(t),t.provides&&r(t.provides,o);else if(t instanceof D)n[o].push(t),t.facet.extensions&&r(t.facet.extensions,G);else{let e=t.extension;if(!e)throw new Error(`Unrecognized extension value in extension set (${t}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(e,o)}}return r(t,G),n.reduce(((t,e)=>t.concat(e)))}(t,e,r))i instanceof I?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),a=[],l=[];for(let t of n)o[t.id]=l.length<<1,l.push((e=>t.slot(e)));let h=null==i?void 0:i.config.facets;for(let t in s){let e=s[t],n=e[0].facet,r=h&&h[t]||[];if(e.every((t=>0==t.type)))if(o[n.id]=a.length<<1|1,j(r,e))a.push(i.facet(n));else{let t=n.combine(e.map((t=>t.value)));a.push(i&&n.compare(t,i.facet(n))?i.facet(n):t)}else{for(let t of e)0==t.type?(o[t.id]=a.length<<1|1,a.push(t.value)):(o[t.id]=l.length<<1,l.push((e=>t.dynamicSlot(e))));o[n.id]=l.length<<1,l.push((t=>_(t,n,e)))}}let c=l.map((t=>t(o)));return new K(t,r,c,o,a,s)}}function tt(t,e){if(1&e)return 2;let i=e>>1,n=t.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;t.status[i]=4;let s=t.computeSlot(t,t.config.dynamicSlots[i]);return t.status[i]=2|s}function et(t,e){return 1&e?t.config.staticValues[e>>1]:t.values[e>>1]}const it=M.define(),nt=M.define({combine:t=>t.some((t=>t)),static:!0}),st=M.define({combine:t=>t.length?t[0]:void 0,static:!0}),rt=M.define(),ot=M.define(),at=M.define(),lt=M.define({combine:t=>!!t.length&&t[0]});class ht{constructor(t,e){this.type=t,this.value=e}static define(){return new ct}}class ct{of(t){return new ht(this,t)}}class ft{constructor(t){this.map=t}of(t){return new ut(this,t)}}class ut{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return void 0===e?void 0:e==this.value?this:new ut(this.type,e)}is(t){return this.type==t}static define(t={}){return new ft(t.map||(t=>t))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let t=n.map(e);t&&i.push(t)}return i}}ut.reconfigure=ut.define(),ut.appendConfig=ut.define();class dt{constructor(t,e,i,n,s,r){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&Y(i,e.newLength),s.some((t=>t.type==dt.time))||(this.annotations=s.concat(dt.time.of(Date.now())))}static create(t,e,i,n,s,r){return new dt(t,e,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(dt.userEvent);return!(!e||!(e==t||e.length>t.length&&e.slice(0,t.length)==t&&"."==e[t.length]))}}function pt(t,e){let i=[];for(let n=0,s=0;;){let r,o;if(n<t.length&&(s==e.length||e[s]>=t[n]))r=t[n++],o=t[n++];else{if(!(s<e.length))return i;r=e[s++],o=e[s++]}!i.length||i[i.length-1]<r?i.push(r,o):i[i.length-1]<o&&(i[i.length-1]=o)}}function Ot(t,e,i){var n;let s,r,o;return i?(s=e.changes,r=Q.empty(e.changes.length),o=t.changes.compose(e.changes)):(s=e.changes.map(t.changes),r=t.changes.mapDesc(e.changes,!0),o=t.changes.compose(s)),{changes:o,selection:e.selection?e.selection.map(r):null===(n=t.selection)||void 0===n?void 0:n.map(s),effects:ut.mapEffects(t.effects,s).concat(ut.mapEffects(e.effects,r)),annotations:t.annotations.length?t.annotations.concat(e.annotations):e.annotations,scrollIntoView:t.scrollIntoView||e.scrollIntoView}}function gt(t,e,i){let n=e.selection,s=vt(e.annotations);return e.userEvent&&(s=s.concat(dt.userEvent.of(e.userEvent))),{changes:e.changes instanceof Q?e.changes:Q.of(e.changes||[],i,t.facet(st)),selection:n&&(n instanceof X?n:X.single(n.anchor,n.head)),effects:vt(e.effects),annotations:s,scrollIntoView:!!e.scrollIntoView}}function mt(t,e,i){let n=gt(t,e.length?e[0]:{},t.doc.length);e.length&&!1===e[0].filter&&(i=!1);for(let s=1;s<e.length;s++){!1===e[s].filter&&(i=!1);let r=!!e[s].sequential;n=Ot(n,gt(t,e[s],r?n.changes.newLength:t.doc.length),r)}let s=dt.create(t,n.changes,n.selection,n.effects,n.annotations,n.scrollIntoView);return function(t){let e=t.startState,i=e.facet(at),n=t;for(let s=i.length-1;s>=0;s--){let r=i[s](t);r&&Object.keys(r).length&&(n=Ot(n,gt(e,r,t.changes.newLength),!0))}return n==t?t:dt.create(e,t.changes,t.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(t){let e=t.startState,i=!0;for(let n of e.facet(rt)){let e=n(t);if(!1===e){i=!1;break}Array.isArray(e)&&(i=!0===i?e:pt(i,e))}if(!0!==i){let n,s;if(!1===i)s=t.changes.invertedDesc,n=Q.empty(e.doc.length);else{let e=t.changes.filter(i);n=e.changes,s=e.filtered.mapDesc(e.changes).invertedDesc}t=dt.create(e,n,t.selection&&t.selection.map(s),ut.mapEffects(t.effects,s),t.annotations,t.scrollIntoView)}let n=e.facet(ot);for(let i=n.length-1;i>=0;i--){let s=n[i](t);t=s instanceof dt?s:Array.isArray(s)&&1==s.length&&s[0]instanceof dt?s[0]:mt(e,vt(s),!1)}return t}(s):s)}dt.time=ht.define(),dt.userEvent=ht.define(),dt.addToHistory=ht.define(),dt.remote=ht.define();const wt=[];function vt(t){return null==t?wt:Array.isArray(t)?t:[t]}var bt=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(bt||(bt={}));const yt=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let St;try{St=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function xt(t){return e=>{if(!/\S/.test(e))return bt.Space;if(function(t){if(St)return St.test(t);for(let e=0;e<t.length;e++){let i=t[e];if(/\w/.test(i)||i>""&&(i.toUpperCase()!=i.toLowerCase()||yt.test(i)))return!0}return!1}(e))return bt.Word;for(let i=0;i<t.length;i++)if(e.indexOf(t[i])>-1)return bt.Word;return bt.Other}}class kt{constructor(t,e,i,n,s,r){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let t=0;t<this.config.dynamicSlots.length;t++)tt(this,t<<1);this.computeSlot=null}field(t,e=!0){let i=this.config.address[t.id];if(null!=i)return tt(this,i),et(this,i);if(e)throw new RangeError("Field is not present in this state")}update(...t){return mt(this,t,!0)}applyTransaction(t){let e,i=this.config,{base:n,compartments:s}=i;for(let e of t.effects)e.is(F.reconfigure)?(i&&(s=new Map,i.compartments.forEach(((t,e)=>s.set(e,t))),i=null),s.set(e.value.compartment,e.value.extension)):e.is(ut.reconfigure)?(i=null,n=e.value):e.is(ut.appendConfig)&&(i=null,n=vt(n).concat(e.value));if(i)e=t.startState.values.slice();else{i=K.resolve(n,s,this),e=new kt(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((t,e)=>e.reconfigure(t,this)),null).values}let r=t.startState.facet(nt)?t.newSelection:t.newSelection.asSingle();new kt(i,t.newDoc,r,e,((e,i)=>i.update(e,t)),t)}replaceSelection(t){return"string"==typeof t&&(t=this.toText(t)),this.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t},range:X.cursor(e.from+t.length)})))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),s=[i.range],r=vt(i.effects);for(let i=1;i<e.ranges.length;i++){let o=t(e.ranges[i]),a=this.changes(o.changes),l=a.map(n);for(let t=0;t<i;t++)s[t]=s[t].map(l);let h=n.mapDesc(a,!0);s.push(o.range.map(h)),n=n.compose(l),r=ut.mapEffects(r,l).concat(ut.mapEffects(vt(o.effects),h))}return{changes:n,selection:X.create(s,e.mainIndex),effects:r}}changes(t=[]){return t instanceof Q?t:Q.of(t,this.doc.length,this.facet(kt.lineSeparator))}toText(e){return t.of(e.split(this.facet(kt.lineSeparator)||S))}sliceDoc(t=0,e=this.doc.length){return this.doc.sliceString(t,e,this.lineBreak)}facet(t){let e=this.config.address[t.id];return null==e?t.default:(tt(this,e),et(this,e))}toJSON(t){let e={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(t)for(let i in t){let n=t[i];n instanceof I&&null!=this.config.address[n.id]&&(e[i]=n.spec.toJSON(this.field(t[i]),this))}return e}static fromJSON(t,e={},i){if(!t||"string"!=typeof t.doc)throw new RangeError("Invalid JSON representation for EditorState");let n=[];if(i)for(let e in i)if(Object.prototype.hasOwnProperty.call(t,e)){let s=i[e],r=t[e];n.push(s.init((t=>s.spec.fromJSON(r,t))))}return kt.create({doc:t.doc,selection:X.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(e={}){let i=K.resolve(e.extensions||[],new Map),n=e.doc instanceof t?e.doc:t.of((e.doc||"").split(i.staticFacet(kt.lineSeparator)||S)),s=e.selection?e.selection instanceof X?e.selection:X.single(e.selection.anchor,e.selection.head):X.single(0);return Y(s,n.length),i.staticFacet(nt)||(s=s.asSingle()),new kt(i,n,s,i.dynamicSlots.map((()=>null)),((t,e)=>e.create(t)),null)}get tabSize(){return this.facet(kt.tabSize)}get lineBreak(){return this.facet(kt.lineSeparator)||"\n"}get readOnly(){return this.facet(lt)}phrase(t,...e){for(let e of this.facet(kt.phrases))if(Object.prototype.hasOwnProperty.call(e,t)){t=e[t];break}return e.length&&(t=t.replace(/\$(\$|\d*)/g,((t,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>e.length?t:e[n-1]}))),t}languageDataAt(t,e,i=-1){let n=[];for(let s of this.facet(it))for(let r of s(this,e,i))Object.prototype.hasOwnProperty.call(r,t)&&n.push(r[t]);return n}charCategorizer(t){return xt(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),s=this.charCategorizer(t),r=t-i,o=t-i;for(;r>0;){let t=p(e,r,!1);if(s(e.slice(t,r))!=bt.Word)break;r=t}for(;o<n;){let t=p(e,o);if(s(e.slice(o,t))!=bt.Word)break;o=t}return r==o?null:X.range(r+i,o+i)}}function Qt(t,e,i={}){let n={};for(let e of t)for(let t of Object.keys(e)){let s=e[t],r=n[t];if(void 0===r)n[t]=s;else if(r===s||void 0===s);else{if(!Object.hasOwnProperty.call(i,t))throw new Error("Config merge conflict for field "+t);n[t]=i[t](r,s)}}for(let t in e)void 0===n[t]&&(n[t]=e[t]);return n}kt.allowMultipleSelections=nt,kt.tabSize=M.define({combine:t=>t.length?t[0]:4}),kt.lineSeparator=st,kt.readOnly=lt,kt.phrases=M.define({compare(t,e){let i=Object.keys(t),n=Object.keys(e);return i.length==n.length&&i.every((i=>t[i]==e[i]))}}),kt.languageData=it,kt.changeFilter=rt,kt.transactionFilter=ot,kt.transactionExtender=at,F.reconfigure=ut.define();class $t{eq(t){return this==t}range(t,e=t){return Pt.create(t,e,this)}}$t.prototype.startSide=$t.prototype.endSide=0,$t.prototype.point=!1,$t.prototype.mapMode=x.TrackDel;let Pt=class t{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(e,i,n){return new t(e,i,n)}};function Zt(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}class Ct{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,a=s[n]-t||(i?this.value[n].endSide:this.value[n].startSide)-e;if(n==r)return a>=0?r:o;a>=0?o=n:r=n+1}}between(t,e,i,n){for(let s=this.findIndex(e,-1e9,!0),r=this.findIndex(i,1e9,!1,s);s<r;s++)if(!1===n(this.from[s]+t,this.to[s]+t,this.value[s]))return!1}map(t,e){let i=[],n=[],s=[],r=-1,o=-1;for(let a=0;a<this.value.length;a++){let l,h,c=this.value[a],f=this.from[a]+t,u=this.to[a]+t;if(f==u){let t=e.mapPos(f,c.startSide,c.mapMode);if(null==t)continue;if(l=h=t,c.startSide!=c.endSide&&(h=e.mapPos(f,c.endSide),h<l))continue}else if(l=e.mapPos(f,c.startSide),h=e.mapPos(u,c.endSide),l>h||l==h&&c.startSide>0&&c.endSide<=0)continue;(h-l||c.endSide-c.startSide)<0||(r<0&&(r=l),c.point&&(o=Math.max(o,h-l)),i.push(c),n.push(l-r),s.push(h-r))}return{mapped:i.length?new Ct(n,s,i,o):null,pos:r}}}class Tt{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new Tt(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=t,r=t.filter;if(0==e.length&&!r)return this;if(i&&(e=e.slice().sort(Zt)),this.isEmpty)return e.length?Tt.of(e):this;let o=new Xt(this,null,-1).goto(0),a=0,l=[],h=new At;for(;o.value||a<e.length;)if(a<e.length&&(o.from-e[a].from||o.startSide-e[a].value.startSide)>=0){let t=e[a++];h.addInner(t.from,t.to,t.value)||l.push(t)}else 1==o.rangeIndex&&o.chunkIndex<this.chunk.length&&(a==e.length||this.chunkEnd(o.chunkIndex)<e[a].from)&&(!r||n>this.chunkEnd(o.chunkIndex)||s<this.chunkPos[o.chunkIndex])&&h.addChunk(this.chunkPos[o.chunkIndex],this.chunk[o.chunkIndex])?o.nextChunk():((!r||n>o.to||s<o.from||r(o.from,o.to,o.value))&&(h.addInner(o.from,o.to,o.value)||l.push(Pt.create(o.from,o.to,o.value))),o.next());return h.finishInner(this.nextLayer.isEmpty&&!l.length?Tt.empty:this.nextLayer.update({add:l,filter:r,filterFrom:n,filterTo:s}))}map(t){if(t.empty||this.isEmpty)return this;let e=[],i=[],n=-1;for(let s=0;s<this.chunk.length;s++){let r=this.chunkPos[s],o=this.chunk[s],a=t.touchesRange(r,r+o.length);if(!1===a)n=Math.max(n,o.maxPoint),e.push(o),i.push(t.mapPos(r));else if(!0===a){let{mapped:s,pos:a}=o.map(r,t);s&&(n=Math.max(n,s.maxPoint),e.push(s),i.push(a))}}let s=this.nextLayer.map(t);return 0==e.length?s:new Tt(i,e,s||Tt.empty,n)}between(t,e,i){if(!this.isEmpty){for(let n=0;n<this.chunk.length;n++){let s=this.chunkPos[n],r=this.chunk[n];if(e>=s&&t<=s+r.length&&!1===r.between(s,t-s,e-s,i))return}this.nextLayer.between(t,e,i)}}iter(t=0){return Yt.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Yt.from(t).goto(e)}static compare(t,e,i,n,s=-1){let r=t.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),o=e.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),a=Rt(r,o,i),l=new Mt(r,a,s),h=new Mt(o,a,s);i.iterGaps(((t,e,i)=>jt(l,t,h,e,i,n))),i.empty&&0==i.length&&jt(l,0,h,0,0,n)}static eq(t,e,i=0,n){null==n&&(n=999999999);let s=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0)),r=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Rt(s,r),a=new Mt(s,o,0).goto(i),l=new Mt(r,o,0).goto(i);for(;;){if(a.to!=l.to||!Dt(a.active,l.active)||a.point&&(!l.point||!a.point.eq(l.point)))return!1;if(a.to>n)return!0;a.next(),l.next()}}static spans(t,e,i,n,s=-1){let r=new Mt(t,null,s).goto(e),o=e,a=r.openStart;for(;;){let t=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFrom<e?i.length+1:Math.min(i.length,a);n.point(o,t,r.point,i,s,r.pointRank),a=Math.min(r.openEnd(t),i.length)}else t>o&&(n.span(o,t,r.active,a),a=r.openEnd(t));if(r.to>i)return a+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(t,e=!1){let i=new At;for(let n of t instanceof Pt?[t]:e?function(t){if(t.length>1)for(let e=t[0],i=1;i<t.length;i++){let n=t[i];if(Zt(e,n)>0)return t.slice().sort(Zt);e=n}return t}(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return Tt.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=Tt.empty;n=n.nextLayer)e=new Tt(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}}Tt.empty=new Tt([],[],null,-1),Tt.empty.nextLayer=Tt.empty;class At{finishChunk(t){this.chunks.push(new Ct(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new At)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0)&&(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(Tt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return t;let e=Tt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}}function Rt(t,e,i){let n=new Map;for(let e of t)for(let t=0;t<e.chunk.length;t++)e.chunk[t].maxPoint<=0&&n.set(e.chunk[t],e.chunkPos[t]);let s=new Set;for(let t of e)for(let e=0;e<t.chunk.length;e++){let r=n.get(t.chunk[e]);null==r||(i?i.mapPos(r):r)!=t.chunkPos[e]||(null==i?void 0:i.touchesRange(r,r+t.chunk[e].length))||s.add(t.chunk[e])}return s}class Xt{constructor(t,e,i,n=0){this.layer=t,this.skip=e,this.minPoint=i,this.rank=n}get startSide(){return this.value?this.value.startSide:0}get endSide(){return this.value?this.value.endSide:0}goto(t,e=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(t,e,!1),this}gotoInner(t,e,i){for(;this.chunkIndex<this.layer.chunk.length;){let e=this.layer.chunk[this.chunkIndex];if(!(this.skip&&this.skip.has(e)||this.layer.chunkEnd(this.chunkIndex)<t||e.maxPoint<this.minPoint))break;this.chunkIndex++,i=!1}if(this.chunkIndex<this.layer.chunk.length){let n=this.layer.chunk[this.chunkIndex].findIndex(t-this.layer.chunkPos[this.chunkIndex],e,!0);(!i||this.rangeIndex<n)&&this.setRangeIndex(n)}this.next()}forward(t,e){(this.to-t||this.endSide-e)<0&&this.gotoInner(t,e,!0)}next(){for(;;){if(this.chunkIndex==this.layer.chunk.length){this.from=this.to=1e9,this.value=null;break}{let t=this.layer.chunkPos[this.chunkIndex],e=this.layer.chunk[this.chunkIndex],i=t+e.from[this.rangeIndex];if(this.from=i,this.to=t+e.to[this.rangeIndex],this.value=e.value[this.rangeIndex],this.setRangeIndex(this.rangeIndex+1),this.minPoint<0||this.value.point&&this.to-this.from>=this.minPoint)break}}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex<this.layer.chunk.length&&this.skip.has(this.layer.chunk[this.chunkIndex]);)this.chunkIndex++;this.rangeIndex=0}else this.rangeIndex=t}nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}compare(t){return this.from-t.from||this.startSide-t.startSide||this.rank-t.rank||this.to-t.to||this.endSide-t.endSide}}class Yt{constructor(t){this.heap=t}static from(t,e=null,i=-1){let n=[];for(let s=0;s<t.length;s++)for(let r=t[s];!r.isEmpty;r=r.nextLayer)r.maxPoint>=i&&n.push(new Xt(r,e,i,s));return 1==n.length?n[0]:new Yt(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let t=this.heap.length>>1;t>=0;t--)Wt(this.heap,t);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let t=this.heap.length>>1;t>=0;t--)Wt(this.heap,t);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Wt(this.heap,0)}}}function Wt(t,e){for(let i=t[e];;){let n=1+(e<<1);if(n>=t.length)break;let s=t[n];if(n+1<t.length&&s.compare(t[n+1])>=0&&(s=t[n+1],n++),i.compare(s)<0)break;t[n]=i,t[e]=s,e=n}}class Mt{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Yt.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Et(this.active,t),Et(this.activeTo,t),Et(this.activeRank,t),this.minActive=_t(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:s}=this.cursor;for(;e<this.activeRank.length&&(s-this.activeRank[e]||n-this.activeTo[e])>0;)e++;qt(this.active,e,i),qt(this.activeTo,e,n),qt(this.activeRank,e,s),t&&qt(t,e,this.cursor.from),this.minActive=_t(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Et(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let t=this.cursor.value;if(t.point){if(!(e&&this.cursor.to==this.to&&this.cursor.from<this.cursor.to)){this.point=t,this.pointFrom=this.cursor.from,this.pointRank=this.cursor.rank,this.to=this.cursor.to,this.endSide=t.endSide,this.cursor.next(),this.forward(this.to,this.endSide);break}this.cursor.next()}else this.addActive(i),this.cursor.next()}}}if(i){this.openStart=0;for(let e=i.length-1;e>=0&&i[e]<t;e--)this.openStart++}}activeForPoint(t){if(!this.active.length)return this.active;let e=[];for(let i=this.active.length-1;i>=0&&!(this.activeRank[i]<this.pointRank);i--)(this.activeTo[i]>t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}}function jt(t,e,i,n,s,r){t.goto(e),i.goto(n);let o=n+s,a=n,l=n-e;for(;;){let e=t.to+l-i.to||t.endSide-i.endSide,n=e<0?t.to+l:i.to,s=Math.min(n,o);if(t.point||i.point?t.point&&i.point&&(t.point==i.point||t.point.eq(i.point))&&Dt(t.activeForPoint(t.to),i.activeForPoint(i.to))||r.comparePoint(a,s,t.point,i.point):s>a&&!Dt(t.active,i.active)&&r.compareRange(a,s,t.active,i.active),n>o)break;a=n,e<=0&&t.next(),e>=0&&i.next()}}function Dt(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!=e[i]&&!t[i].eq(e[i]))return!1;return!0}function Et(t,e){for(let i=e,n=t.length-1;i<n;i++)t[i]=t[i+1];t.pop()}function qt(t,e,i){for(let i=t.length-1;i>=e;i--)t[i+1]=t[i];t[e]=i}function _t(t,e){let i=-1,n=1e9;for(let s=0;s<e.length;s++)(e[s]-n||t[s].endSide-t[i].endSide)<0&&(i=s,n=e[s]);return i}function Vt(t,e,i=t.length){let n=0;for(let s=0;s<i;)9==t.charCodeAt(s)?(n+=e-n%e,s++):(n++,s=p(t,s));return n}function It(t,e,i,n){for(let n=0,s=0;;){if(s>=e)return n;if(n==t.length)break;s+=9==t.charCodeAt(n)?i-s%i:1,n=p(t,n)}return!0===n?-1:t.length}var zt=Object.freeze({__proto__:null,Annotation:ht,AnnotationType:ct,ChangeDesc:k,ChangeSet:Q,get CharCategory(){return bt},Compartment:F,EditorSelection:X,EditorState:kt,Facet:M,Line:l,get MapMode(){return x},Prec:U,Range:Pt,RangeSet:Tt,RangeSetBuilder:At,RangeValue:$t,SelectionRange:R,StateEffect:ut,StateEffectType:ft,StateField:I,Text:t,Transaction:dt,codePointAt:v,codePointSize:y,combineConfig:Qt,countColumn:Vt,findClusterBreak:p,findColumn:It,fromCodePoint:b});const Bt="undefined"==typeof Symbol?"__ͼ":Symbol.for("ͼ"),Gt="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Lt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class Nt{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(t){return/^@/.test(t)?[t]:t.split(/,\s*/)}function s(t,e,r,o){let a=[],l=/^@(\w+)\b/.exec(t[0]),h=l&&"keyframes"==l[1];if(l&&null==e)return r.push(t[0]+";");for(let i in e){let o=e[i];if(/&/.test(i))s(i.split(/,\s*/).map((e=>t.map((t=>e.replace(/&/,t))))).reduce(((t,e)=>t.concat(e))),o,r);else if(o&&"object"==typeof o){if(!l)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,a,h)}else null!=o&&a.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(t=>"-"+t.toLowerCase()))+": "+o+";")}(a.length||h)&&r.push((!i||l||o?t:t.map(i)).join(", ")+" {"+a.join(" ")+"}")}for(let e in t)s(n(e),t[e],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let t=Lt[Bt]||1;return Lt[Bt]=t+1,"ͼ"+t.toString(36)}static mount(t,e,i){let n=t[Gt],s=i&&i.nonce;n?s&&n.setNonce(s):n=new Ht(t,s),n.mount(Array.isArray(e)?e:[e])}}let Ut=new Map;class Ht{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let e=Ut.get(i);if(e)return t.adoptedStyleSheets=[e.sheet,...t.adoptedStyleSheets],t[Gt]=e;this.sheet=new n.CSSStyleSheet,t.adoptedStyleSheets=[this.sheet,...t.adoptedStyleSheets],Ut.set(i,this)}else{this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);let n=t.head||t;n.insertBefore(this.styleTag,n.firstChild)}this.modules=[],t[Gt]=this}mount(t){let e=this.sheet,i=0,n=0;for(let s=0;s<t.length;s++){let r=t[s],o=this.modules.indexOf(r);if(o<n&&o>-1&&(this.modules.splice(o,1),n--,o=-1),-1==o){if(this.modules.splice(n++,0,r),e)for(let t=0;t<r.rules.length;t++)e.insertRule(r.rules[t],i++)}else{for(;n<o;)i+=this.modules[n++].rules.length;i+=r.rules.length,n++}}if(!e){let t="";for(let e=0;e<this.modules.length;e++)t+=this.modules[e].getRules()+"\n";this.styleTag.textContent=t}}setNonce(t){this.styleTag&&this.styleTag.getAttribute("nonce")!=t&&this.styleTag.setAttribute("nonce",t)}}for(var Ft={8:"Backspace",9:"Tab",10:"Enter",12:"NumLock",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",44:"PrintScreen",45:"Insert",46:"Delete",59:";",61:"=",91:"Meta",92:"Meta",106:"*",107:"+",108:",",109:"-",110:".",111:"/",144:"NumLock",145:"ScrollLock",160:"Shift",161:"Shift",162:"Control",163:"Control",164:"Alt",165:"Alt",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},Jt={48:")",49:"!",50:"@",51:"#",52:"$",53:"%",54:"^",55:"&",56:"*",57:"(",59:":",61:"+",173:"_",186:":",187:"+",188:"<",189:"_",190:">",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Kt="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),te="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),ee=0;ee<10;ee++)Ft[48+ee]=Ft[96+ee]=String(ee);for(ee=1;ee<=24;ee++)Ft[ee+111]="F"+ee;for(ee=65;ee<=90;ee++)Ft[ee]=String.fromCharCode(ee+32),Jt[ee]=String.fromCharCode(ee);for(var ie in Ft)Jt.hasOwnProperty(ie)||(Jt[ie]=Ft[ie]);function ne(t){let e;return e=11==t.nodeType?t.getSelection?t:t.ownerDocument:t,e.getSelection()}function se(t,e){return!!e&&(t==e||t.contains(1!=e.nodeType?e.parentNode:e))}function re(t,e){if(!e.anchorNode)return!1;try{return se(t,e.anchorNode)}catch(t){return!1}}function oe(t){return 3==t.nodeType?we(t,0,t.nodeValue.length).getClientRects():1==t.nodeType?t.getClientRects():[]}function ae(t,e,i,n){return!!i&&(he(t,e,i,n,-1)||he(t,e,i,n,1))}function le(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e}function he(t,e,i,n,s){for(;;){if(t==i&&e==n)return!0;if(e==(s<0?0:ce(t))){if("DIV"==t.nodeName)return!1;let i=t.parentNode;if(!i||1!=i.nodeType)return!1;e=le(t)+(s<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if(1==(t=t.childNodes[e+(s<0?-1:0)]).nodeType&&"false"==t.contentEditable)return!1;e=s<0?ce(t):0}}}function ce(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function fe(t,e){let i=e?t.left:t.right;return{left:i,right:i,top:t.top,bottom:t.bottom}}function ue(t){return{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function de(t,e){let i=e.width/t.offsetWidth,n=e.height/t.offsetHeight;return(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.width-t.offsetWidth)<1)&&(i=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-t.offsetHeight)<1)&&(n=1),{scaleX:i,scaleY:n}}class pe{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ce(e):0),i,Math.min(t.focusOffset,i?ce(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}}let Oe,ge=null;function me(t){if(t.setActive)return t.setActive();if(ge)return t.focus(ge);let e=[];for(let i=t;i&&(e.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(t.focus(null==ge?{get preventScroll(){return ge={preventScroll:!0},!0}}:void 0),!ge){ge=!1;for(let t=0;t<e.length;){let i=e[t++],n=e[t++],s=e[t++];i.scrollTop!=n&&(i.scrollTop=n),i.scrollLeft!=s&&(i.scrollLeft=s)}}}function we(t,e,i=e){let n=Oe||(Oe=document.createRange());return n.setEnd(t,i),n.setStart(t,e),n}function ve(t,e,i){let n={key:e,code:e,keyCode:i,which:i,cancelable:!0},s=new KeyboardEvent("keydown",n);s.synthetic=!0,t.dispatchEvent(s);let r=new KeyboardEvent("keyup",n);return r.synthetic=!0,t.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function be(t){for(;t.attributes.length;)t.removeAttributeNode(t.attributes[0])}function ye(t){return t.scrollTop>Math.max(1,t.scrollHeight-t.clientHeight-4)}class Se{constructor(t,e,i=!0){this.node=t,this.offset=e,this.precise=i}static before(t,e){return new Se(t.parentNode,le(t),e)}static after(t,e){return new Se(t.parentNode,le(t)+1,e)}}const xe=[];class ke{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(t){let e=this.posAtStart;for(let i of this.children){if(i==t)return e;e+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(t){return this.posBefore(t)+t.length}sync(t,e){if(2&this.flags){let i,n=this.dom,s=null;for(let r of this.children){if(7&r.flags){if(!r.dom&&(i=s?s.nextSibling:n.firstChild)){let t=ke.get(i);(!t||!t.parent&&t.canReuseDOM(r))&&r.reuseDOM(i)}r.sync(t,e),r.flags&=-8}if(i=s?s.nextSibling:n.firstChild,e&&!e.written&&e.node==n&&i!=r.dom&&(e.written=!0),r.dom.parentNode==n)for(;i&&i!=r.dom;)i=Qe(i);else n.insertBefore(r.dom,i);s=r.dom}for(i=s?s.nextSibling:n.firstChild,i&&e&&e.node==n&&(e.written=!0);i;)i=Qe(i)}else if(1&this.flags)for(let i of this.children)7&i.flags&&(i.sync(t,e),i.flags&=-8)}reuseDOM(t){}localPosFromDOM(t,e){let i;if(t==this.dom)i=this.dom.childNodes[e];else{let n=0==ce(t)?0:0==e?-1:1;for(;;){let e=t.parentNode;if(e==this.dom)break;0==n&&e.firstChild!=e.lastChild&&(n=t==e.firstChild?-1:1),t=e}i=n<0?t:t.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!ke.get(i);)i=i.nextSibling;if(!i)return this.length;for(let t=0,e=0;;t++){let n=this.children[t];if(n.dom==i)return e;e+=n.length+n.breakAfter}}domBoundsAround(t,e,i=0){let n=-1,s=-1,r=-1,o=-1;for(let a=0,l=i,h=i;a<this.children.length;a++){let i=this.children[a],c=l+i.length;if(l<t&&c>e)return i.domBoundsAround(t,e,l);if(c>=t&&-1==n&&(n=a,s=l),l>e&&i.dom.parentNode==this.dom){r=a,o=h;break}h=c,l=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r<this.children.length&&r>=0?this.children[r].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),1&e.flags)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,7&this.flags&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=xe){this.markDirty();for(let n=t;n<e;n++){let t=this.children[n];t.parent==this&&i.indexOf(t)<0&&t.destroy()}this.children.splice(t,e-t,...i);for(let t=0;t<i.length;t++)i[t].setParent(this)}ignoreMutation(t){return!1}ignoreEvent(t){return!1}childCursor(t=this.length){return new $e(this.children,t,this.children.length)}childPos(t,e=1){return this.childCursor().findPos(t,e)}toString(){let t=this.constructor.name.replace("View","");return t+(this.children.length?"("+this.children.join()+")":this.length?"["+("Text"==t?this.text:this.length)+"]":"")+(this.breakAfter?"#":"")}static get(t){return t.cmView}get isEditable(){return!0}get isWidget(){return!1}get isHidden(){return!1}merge(t,e,i,n,s,r){return!1}become(t){return!1}canReuseDOM(t){return t.constructor==this.constructor&&!(8&(this.flags|t.flags))}getSide(){return 0}destroy(){for(let t of this.children)t.parent==this&&t.destroy();this.parent=null}}function Qe(t){let e=t.nextSibling;return t.parentNode.removeChild(t),e}ke.prototype.breakAfter=0;class $e{constructor(t,e,i){this.children=t,this.pos=e,this.i=i,this.off=0}findPos(t,e=1){for(;;){if(t>this.pos||t==this.pos&&(e>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function Pe(t,e,i,n,s,r,o,a,l){let{children:h}=t,c=h.length?h[e]:null,f=r.length?r[r.length-1]:null,u=f?f.breakAfter:o;if(!(e==n&&c&&!o&&!u&&r.length<2&&c.merge(i,s,r.length?f:null,0==i,a,l))){if(n<h.length){let t=h[n];t&&(s<t.length||t.breakAfter&&(null==f?void 0:f.breakAfter))?(e==n&&(t=t.split(s),s=0),!u&&f&&t.merge(0,s,f,!0,0,l)?r[r.length-1]=t:((s||t.children.length&&!t.children[0].length)&&t.merge(0,s,null,!1,0,l),r.push(t))):(null==t?void 0:t.breakAfter)&&(f?f.breakAfter=1:o=1),n++}for(c&&(c.breakAfter=o,i>0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,a,0)?c.breakAfter=r.shift().breakAfter:(i<c.length||c.children.length&&0==c.children[c.children.length-1].length)&&c.merge(i,c.length,null,!1,a,0),e++));e<n&&r.length;)if(h[n-1].become(r[r.length-1]))n--,r.pop(),l=r.length?0:a;else{if(!h[e].become(r[0]))break;e++,r.shift(),a=r.length?0:l}!r.length&&e&&n<h.length&&!h[e-1].breakAfter&&h[n].merge(0,0,h[e-1],!1,a,l)&&e--,(e<n||r.length)&&t.replaceChildren(e,n,r)}}function Ze(t,e,i,n,s,r){let o=t.childCursor(),{i:a,off:l}=o.findPos(i,1),{i:h,off:c}=o.findPos(e,-1),f=e-i;for(let t of n)f+=t.length;t.length+=f,Pe(t,h,c,a,l,n,0,s,r)}let Ce="undefined"!=typeof navigator?navigator:{userAgent:"",vendor:"",platform:""},Te="undefined"!=typeof document?document:{documentElement:{style:{}}};const Ae=/Edge\/(\d+)/.exec(Ce.userAgent),Re=/MSIE \d/.test(Ce.userAgent),Xe=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(Ce.userAgent),Ye=!!(Re||Xe||Ae),We=!Ye&&/gecko\/(\d+)/i.test(Ce.userAgent),Me=!Ye&&/Chrome\/(\d+)/.exec(Ce.userAgent),je="webkitFontSmoothing"in Te.documentElement.style,De=!Ye&&/Apple Computer/.test(Ce.vendor),Ee=De&&(/Mobile\/\w+/.test(Ce.userAgent)||Ce.maxTouchPoints>2);var qe={mac:Ee||/Mac/.test(Ce.platform),windows:/Win/.test(Ce.platform),linux:/Linux|X11/.test(Ce.platform),ie:Ye,ie_version:Re?Te.documentMode||6:Xe?+Xe[1]:Ae?+Ae[1]:0,gecko:We,gecko_version:We?+(/Firefox\/(\d+)/.exec(Ce.userAgent)||[0,0])[1]:0,chrome:!!Me,chrome_version:Me?+Me[1]:0,ios:Ee,android:/Android\b/.test(Ce.userAgent),webkit:je,safari:De,webkit_version:je?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:null!=Te.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class _e extends ke{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){3==t.nodeType&&this.createDOM(t)}merge(t,e,i){return!(8&this.flags||i&&(!(i instanceof _e)||this.length-(e-t)+i.length>256||8&i.flags))&&(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new _e(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=8&this.flags,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Se(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return function(t,e,i){let n=t.nodeValue.length;e>n&&(e=n);let s=e,r=e,o=0;0==e&&i<0||e==n&&i>=0?qe.chrome||qe.gecko||(e?(s--,o=1):r<n&&(r++,o=-1)):i<0?s--:r<n&&r++;let a=we(t,s,r).getClientRects();if(!a.length)return null;let l=a[(o?o<0:i>=0)?0:a.length-1];qe.safari&&!o&&0==l.width&&(l=Array.prototype.find.call(a,(t=>t.width))||l);return o?fe(l,o<0):l||null}(this.dom,t,e)}}class Ve extends ke{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let t of e)t.setParent(this)}setAttrs(t){if(be(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!(8&(this.flags|t.flags))}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,s,r){return(!i||!(!(i instanceof Ve&&i.mark.eq(this.mark))||t&&s<=0||e<this.length&&r<=0))&&(Ze(this,t,e,i?i.children.slice():[],s-1,r-1),this.markDirty(),!0)}split(t){let e=[],i=0,n=-1,s=0;for(let r of this.children){let o=i+r.length;o>t&&e.push(i<t?r.split(t-i):r),n<0&&i>=t&&(n=s),i=o,s++}let r=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new Ve(this.mark,e,r)}domAtPos(t){return Be(this,t)}coordsAt(t,e){return Le(this,t,e)}}class Ie extends ke{static create(t,e,i){return new Ie(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=Ie.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof Ie&&this.widget.compare(i.widget))||t>0&&s<=0||e<this.length&&r<=0))&&(this.length=t+(i?i.length:0)+(this.length-e),!0)}become(t){return t instanceof Ie&&t.side==this.side&&this.widget.constructor==t.widget.constructor&&(this.widget.compare(t.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,!0)}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get overrideDOMText(){if(0==this.length)return t.empty;let e=this;for(;e.parent;)e=e.parent;let{view:i}=e,n=i&&i.state.doc,s=this.posAtStart;return n?n.slice(s,s+this.length):t.empty}domAtPos(t){return(this.length?0==t:this.side>0)?Se.before(this.dom):Se.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:t>0;for(let e=r?n.length-1:0;s=n[e],!(t>0?0==e:e==n.length-1||s.top<s.bottom);e+=r?-1:1);return fe(s,!r)}get isEditable(){return!1}get isWidget(){return!0}get isHidden(){return this.widget.isHidden}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}}class ze extends ke{constructor(t){super(),this.side=t}get length(){return 0}merge(){return!1}become(t){return t instanceof ze&&t.side==this.side}split(){return new ze(this.side)}sync(){if(!this.dom){let t=document.createElement("img");t.className="cm-widgetBuffer",t.setAttribute("aria-hidden","true"),this.setDOM(t)}}getSide(){return this.side}domAtPos(t){return this.side>0?Se.before(this.dom):Se.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return t.empty}get isHidden(){return!0}}function Be(t,e){let i=t.dom,{children:n}=t,s=0;for(let t=0;s<n.length;s++){let r=n[s],o=t+r.length;if(!(o==t&&r.getSide()<=0)){if(e>t&&e<o&&r.dom.parentNode==i)return r.domAtPos(e-t);if(e<=t)break;t=o}}for(let t=s;t>0;t--){let e=n[t-1];if(e.dom.parentNode==i)return e.domAtPos(e.length)}for(let t=s;t<n.length;t++){let e=n[t];if(e.dom.parentNode==i)return e.domAtPos(0)}return new Se(i,0)}function Ge(t,e,i){let n,{children:s}=t;i>0&&e instanceof Ve&&s.length&&(n=s[s.length-1])instanceof Ve&&n.mark.eq(e.mark)?Ge(n,e.children[0],i-1):(s.push(e),e.setParent(t)),t.length+=e.length}function Le(t,e,i){let n=null,s=-1,r=null,o=-1;!function t(e,a){for(let l=0,h=0;l<e.children.length&&h<=a;l++){let c=e.children[l],f=h+c.length;f>=a&&(c.children.length?t(c,a-h):(!r||r.isHidden&&i>0)&&(f>a||h==f&&c.getSide()>0)?(r=c,o=a-h):(h<a||h==f&&c.getSide()<0&&!c.isHidden)&&(n=c,s=a-h)),h=f}}(t,e);let a=(i<0?n:r)||n||r;return a?a.coordsAt(Math.max(0,a==n?s:o),i):function(t){let e=t.dom.lastChild;if(!e)return t.dom.getBoundingClientRect();let i=oe(e);return i[i.length-1]||null}(t)}function Ne(t,e){for(let i in t)"class"==i&&e.class?e.class+=" "+t.class:"style"==i&&e.style?e.style+=";"+t.style:e[i]=t[i];return e}_e.prototype.children=Ie.prototype.children=ze.prototype.children=xe;const Ue=Object.create(null);function He(t,e,i){if(t==e)return!0;t||(t=Ue),e||(e=Ue);let n=Object.keys(t),s=Object.keys(e);if(n.length-(i&&n.indexOf(i)>-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||t[r]!==e[r]))return!1;return!0}function Fe(t,e,i){let n=!1;if(e)for(let s in e)i&&s in i||(n=!0,"style"==s?t.style.cssText="":t.removeAttribute(s));if(i)for(let s in i)e&&e[s]==i[s]||(n=!0,"style"==s?t.style.cssText=i[s]:t.setAttribute(s,i[s]));return n}function Je(t){let e=Object.create(null);for(let i=0;i<t.attributes.length;i++){let n=t.attributes[i];e[n.name]=n.value}return e}class Ke extends ke{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,s,r){if(i){if(!(i instanceof Ke))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),Ze(this,t,e,i?i.children.slice():[],s,r),!0}split(t){let e=new Ke;if(e.breakAfter=this.breakAfter,0==this.length)return e;let{i:i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let t=i;t<this.children.length;t++)e.append(this.children[t],0);for(;i>0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){He(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){Ge(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ne(e,this.attrs||{})),i&&(this.attrs=Ne({class:i},this.attrs||{}))}domAtPos(t){return Be(this,t)}reuseDOM(t){"DIV"==t.nodeName&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?4&this.flags&&(be(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Fe(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&ke.get(n)instanceof Ve;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=ke.get(n))||void 0===i?void 0:i.isEditable)||qe.ios&&this.children.some((t=>t instanceof _e))))){let t=document.createElement("BR");t.cmIgnore=!0,this.dom.appendChild(t)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let t,e=0;for(let i of this.children){if(!(i instanceof _e)||/[^ -~]/.test(i.text))return null;let n=oe(i.dom);if(1!=n.length)return null;e+=n[0].width,t=n[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:t}:null}coordsAt(t,e){let i=Le(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:t}=this.parent.view.viewState,e=i.bottom-i.top;if(Math.abs(e-t.lineHeight)<2&&t.textHeight<e){let n=(e-t.textHeight)/2;return{top:i.top+n,bottom:i.bottom-n,left:i.left,right:i.left}}}return i}become(t){return!1}covers(){return!0}static find(t,e){for(let i=0,n=0;i<t.children.length;i++){let s=t.children[i],r=n+s.length;if(r>=e){if(s instanceof Ke)return s;if(r>e)break}n=r+s.breakAfter}return null}}class ti extends ke{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof ti&&this.widget.compare(i.widget))||t>0&&s<=0||e<this.length&&r<=0))&&(this.length=t+(i?i.length:0)+(this.length-e),!0)}domAtPos(t){return 0==t?Se.before(this.dom):Se.after(this.dom,t==this.length)}split(t){let e=this.length-t;this.length=t;let i=new ti(this.widget,e,this.deco);return i.breakAfter=this.breakAfter,i}get children(){return xe}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}get overrideDOMText(){return this.parent?this.parent.view.state.doc.slice(this.posAtStart,this.posAtEnd):t.empty}domBoundsAround(){return null}become(t){return t instanceof ti&&t.widget.constructor==this.widget.constructor&&(t.widget.compare(this.widget)||this.markDirty(!0),this.dom&&!this.prevWidget&&(this.prevWidget=this.widget),this.widget=t.widget,this.length=t.length,this.deco=t.deco,this.breakAfter=t.breakAfter,!0)}ignoreMutation(){return!0}ignoreEvent(t){return this.widget.ignoreEvent(t)}get isEditable(){return!1}get isWidget(){return!0}coordsAt(t,e){return this.widget.coordsAt(this.dom,t,e)}destroy(){super.destroy(),this.dom&&this.widget.destroy(this.dom)}covers(t){let{startSide:e,endSide:i}=this.deco;return e!=i&&(t<0?e<0:i>0)}}class ei{eq(t){return!1}updateDOM(t,e){return!1}compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(t){return!0}coordsAt(t,e,i){return null}get isHidden(){return!1}get editable(){return!1}destroy(t){}}var ii=function(t){return t[t.Text=0]="Text",t[t.WidgetBefore=1]="WidgetBefore",t[t.WidgetAfter=2]="WidgetAfter",t[t.WidgetRange=3]="WidgetRange",t}(ii||(ii={}));class ni extends $t{constructor(t,e,i,n){super(),this.startSide=t,this.endSide=e,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(t){return new si(t)}static widget(t){let e=Math.max(-1e4,Math.min(1e4,t.side||0)),i=!!t.block;return e+=i&&!t.inlineOrder?e>0?3e8:-4e8:e>0?1e8:-1e8,new oi(t,e,e,i,t.widget||null,!1)}static replace(t){let e,i,n=!!t.block;if(t.isBlockGap)e=-5e8,i=4e8;else{let{start:s,end:r}=ai(t,n);e=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new oi(t,e,i,n,t.widget||null,!0)}static line(t){return new ri(t)}static set(t,e=!1){return Tt.of(t,e)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}ni.none=Tt.empty;class si extends ni{constructor(t){let{start:e,end:i}=ai(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof si&&this.tagName==t.tagName&&(this.class||(null===(e=this.attrs)||void 0===e?void 0:e.class))==(t.class||(null===(i=t.attrs)||void 0===i?void 0:i.class))&&He(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}}si.prototype.point=!1;class ri extends ni{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof ri&&this.spec.class==t.spec.class&&He(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}}ri.prototype.mapMode=x.TrackBefore,ri.prototype.point=!0;class oi extends ni{constructor(t,e,i,n,s,r){super(e,i,s,t),this.block=n,this.isReplace=r,this.mapMode=n?e<=0?x.TrackBefore:x.TrackAfter:x.TrackDel}get type(){return this.startSide!=this.endSide?ii.WidgetRange:this.startSide<=0?ii.WidgetBefore:ii.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof oi&&(e=this.widget,i=t.widget,e==i||!!(e&&i&&e.compare(i)))&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide;var e,i}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}}function ai(t,e=!1){let{inclusiveStart:i,inclusiveEnd:n}=t;return null==i&&(i=t.inclusive),null==n&&(n=t.inclusive),{start:null!=i?i:e,end:null!=n?n:e}}function li(t,e,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=t?i[s]=Math.max(i[s],e):i.push(t,e)}oi.prototype.point=!0;class hi{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ti&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ke),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ci(new ze(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||t&&this.content.length&&this.content[this.content.length-1]instanceof ti||this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:e,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}this.text=e,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(ci(new _e(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof oi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=e-t;if(i instanceof oi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ti(i.widget||new fi("div"),o,i));else{let r=Ie.create(i.widget||new fi("span"),o,o?0:i.startSide),a=this.atCursorPos&&!r.isEditable&&s<=n.length&&(t<e||i.startSide>0),l=!r.isEditable&&(t<e||s>n.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||a||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),a&&(h.append(ci(new ze(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(ci(r,n),s),this.atCursorPos=l,this.pendingBuffer=l?t<e||s>n.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=s)}static build(t,e,i,n,s){let r=new hi(t,e,i,s);return r.openEnd=Tt.spans(n,e,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function ci(t,e){for(let i of e)t=new Ve(i,[t],t.length);return t}class fi extends ei{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}var ui=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(ui||(ui={}));const di=ui.LTR,pi=ui.RTL;function Oi(t){let e=[];for(let i=0;i<t.length;i++)e.push(1<<+t[i]);return e}const gi=Oi("88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008"),mi=Oi("4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333"),wi=Object.create(null),vi=[];for(let t of["()","[]","{}"]){let e=t.charCodeAt(0),i=t.charCodeAt(1);wi[e]=i,wi[i]=-e}function bi(t){return t<=247?gi[t]:1424<=t&&t<=1524?2:1536<=t&&t<=1785?mi[t-1536]:1774<=t&&t<=2220?4:8192<=t&&t<=8204?256:64336<=t&&t<=65023?4:1}const yi=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/;class Si{get dir(){return this.level%2?pi:di}constructor(t,e,i){this.from=t,this.to=e,this.level=i}side(t,e){return this.dir==e==t?this.to:this.from}forward(t,e){return t==(this.dir==e)}static find(t,e,i,n){let s=-1;for(let r=0;r<t.length;r++){let o=t[r];if(o.from<=e&&o.to>=e){if(o.level==i)return r;(s<0||(0!=n?n<0?o.from<e:o.to>e:t[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function xi(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let n=t[i],s=e[i];if(n.from!=s.from||n.to!=s.to||n.direction!=s.direction||!xi(n.inner,s.inner))return!1}return!0}const ki=[];function Qi(t,e,i,n,s,r,o){let a=n%2?2:1;if(n%2==s%2)for(let l=e,h=0;l<i;){let e=!0,c=!1;if(h==r.length||l<r[h].from){let t=ki[l];t!=a&&(e=!1,c=16==t)}let f=e||1!=a?null:[],u=e?n:n+1,d=l;t:for(;;)if(h<r.length&&d==r[h].from){if(c)break t;let p=r[h];if(!e)for(let t=p.to,e=h+1;;){if(t==i)break t;if(!(e<r.length&&r[e].from==t)){if(ki[t]==a)break t;break}t=r[e++].to}if(h++,f)f.push(p);else{p.from>l&&o.push(new Si(l,p.from,u)),$i(t,p.direction==di!=!(u%2)?n+1:n,s,p.inner,p.from,p.to,o),l=p.to}d=p.to}else{if(d==i||(e?ki[d]!=a:ki[d]==a))break;d++}f?Qi(t,l,d,n+1,s,f,o):l<d&&o.push(new Si(l,d,u)),l=d}else for(let l=i,h=r.length;l>e;){let i=!0,c=!1;if(!h||l>r[h-1].to){let t=ki[l-1];t!=a&&(i=!1,c=16==t)}let f=i||1!=a?null:[],u=i?n:n+1,d=l;t:for(;;)if(h&&d==r[h-1].to){if(c)break t;let p=r[--h];if(!i)for(let t=p.from,i=h;;){if(t==e)break t;if(!i||r[i-1].to!=t){if(ki[t-1]==a)break t;break}t=r[--i].from}if(f)f.push(p);else{p.to<l&&o.push(new Si(p.to,l,u)),$i(t,p.direction==di!=!(u%2)?n+1:n,s,p.inner,p.from,p.to,o),l=p.from}d=p.from}else{if(d==e||(i?ki[d-1]!=a:ki[d-1]==a))break;d--}f?Qi(t,d,l,n+1,s,f,o):d<l&&o.push(new Si(d,l,u)),l=d}}function $i(t,e,i,n,s,r,o){let a=e%2?2:1;!function(t,e,i,n,s){for(let r=0;r<=n.length;r++){let o=r?n[r-1].to:e,a=r<n.length?n[r].from:i,l=r?256:s;for(let e=o,i=l,n=l;e<a;e++){let s=bi(t.charCodeAt(e));512==s?s=i:8==s&&4==n&&(s=16),ki[e]=4==s?2:s,7&s&&(n=s),i=s}for(let t=o,e=l,n=l;t<a;t++){let s=ki[t];if(128==s)t<a-1&&e==ki[t+1]&&24&e?s=ki[t]=e:ki[t]=256;else if(64==s){let s=t+1;for(;s<a&&64==ki[s];)s++;let r=t&&8==e||s<i&&8==ki[s]?1==n?1:8:256;for(let e=t;e<s;e++)ki[e]=r;t=s-1}else 8==s&&1==n&&(ki[t]=1);e=s,7&s&&(n=s)}}}(t,s,r,n,a),function(t,e,i,n,s){let r=1==s?2:1;for(let o=0,a=0,l=0;o<=n.length;o++){let h=o?n[o-1].to:e,c=o<n.length?n[o].from:i;for(let e,i,n,o=h;o<c;o++)if(i=wi[e=t.charCodeAt(o)])if(i<0){for(let t=a-3;t>=0;t-=3)if(vi[t+1]==-i){let e=vi[t+2],i=2&e?s:4&e?1&e?r:s:0;i&&(ki[o]=ki[vi[t]]=i),a=t;break}}else{if(189==vi.length)break;vi[a++]=o,vi[a++]=e,vi[a++]=l}else if(2==(n=ki[o])||1==n){let t=n==s;l=t?0:1;for(let e=a-3;e>=0;e-=3){let i=vi[e+2];if(2&i)break;if(t)vi[e+2]|=2;else{if(4&i)break;vi[e+2]|=4}}}}}(t,s,r,n,a),function(t,e,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:t,a=s<i.length?i[s].from:e;for(let l=o;l<a;){let o=ki[l];if(256==o){let o=l+1;for(;;)if(o==a){if(s==i.length)break;o=i[s++].to,a=s<i.length?i[s].from:e}else{if(256!=ki[o])break;o++}let h=1==r,c=h==(1==(o<e?ki[o]:n))?h?1:2:n;for(let e=o,n=s,r=n?i[n-1].to:t;e>l;)e==r&&(e=i[--n].from,r=n?i[n-1].to:t),ki[--e]=c;l=o}else r=o,l++}}}(s,r,n,a),Qi(t,s,r,e,i,n,o)}function Pi(t,e,i){if(!t)return[new Si(0,0,e==pi?1:0)];if(e==di&&!i.length&&!yi.test(t))return Zi(t.length);if(i.length)for(;t.length>ki.length;)ki[ki.length]=256;let n=[],s=e==di?0:1;return $i(t,s,s,i,0,t.length,n),n}function Zi(t){return[new Si(0,t,0)]}let Ci="";function Ti(t,e,i,n,s){var r;let o=n.head-t.from,a=Si.find(e,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc),l=e[a],h=l.side(s,i);if(o==h){let t=a+=s?1:-1;if(t<0||t>=e.length)return null;l=e[a=t],o=l.side(!s,i),h=l.side(s,i)}let c=p(t.text,o,l.forward(s,i));(c<l.from||c>l.to)&&(c=h),Ci=t.text.slice(Math.min(o,c),Math.max(o,c));let f=a==(s?e.length-1:0)?null:e[a+(s?1:-1)];return f&&c==h&&f.level+(s?0:1)<l.level?X.cursor(f.side(!s,i)+t.from,f.forward(s,i)?1:-1,f.level):X.cursor(c+t.from,l.forward(s,i)?-1:1,l.level)}function Ai(t,e,i){for(let n=e;n<i;n++){let e=bi(t.charCodeAt(n));if(1==e)return di;if(2==e||4==e)return pi}return di}const Ri=M.define(),Xi=M.define(),Yi=M.define(),Wi=M.define(),Mi=M.define(),ji=M.define(),Di=M.define(),Ei=M.define({combine:t=>t.some((t=>t))}),qi=M.define({combine:t=>t.some((t=>t))});class _i{constructor(t,e="nearest",i="nearest",n=5,s=5,r=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=s,this.isSnapshot=r}map(t){return t.empty?this:new _i(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new _i(X.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Vi=ut.define({map:(t,e)=>t.map(e)});function Ii(t,e,i){let n=t.facet(Wi);n.length?n[0](e):window.onerror?window.onerror(String(e),i,void 0,void 0,e):i?console.error(i+":",e):console.error(e)}const zi=M.define({combine:t=>!t.length||t[0]});let Bi=0;const Gi=M.define();class Li{constructor(t,e,i,n,s){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(t,e){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=e||{};return new Li(Bi++,t,i,n,(t=>{let e=[Gi.of(t)];return r&&e.push(Fi.of((e=>{let i=e.plugin(t);return i?r(i):ni.none}))),s&&e.push(s(t)),e}))}static fromClass(t,e){return Li.define((e=>new t(e)),e)}}class Ni{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(e){if(Ii(t.state,e,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(t){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){Ii(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(null===(e=this.value)||void 0===e?void 0:e.destroy)try{this.value.destroy()}catch(e){Ii(t.state,e,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Ui=M.define(),Hi=M.define(),Fi=M.define(),Ji=M.define(),Ki=M.define(),tn=M.define();function en(t,e){let i=t.state.facet(tn);if(!i.length)return i;let n=i.map((e=>e instanceof Function?e(t):e)),s=[];return Tt.spans(n,e.from,e.to,{point(){},span(t,i,n,r){let o=t-e.from,a=i-e.from,l=s;for(let t=n.length-1;t>=0;t--,r--){let i,s=n[t].spec.bidiIsolate;if(null==s&&(s=Ai(e.text,o,a)),r>0&&l.length&&(i=l[l.length-1]).to==o&&i.direction==s)i.to=a,l=i.inner;else{let t={from:o,to:a,direction:s,inner:[]};l.push(t),l=t.inner}}}}),s}const nn=M.define();function sn(t){let e=0,i=0,n=0,s=0;for(let r of t.state.facet(nn)){let o=r(t);o&&(null!=o.left&&(e=Math.max(e,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:e,right:i,top:n,bottom:s}}const rn=M.define();class on{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new on(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toA<i.fromA)break;i=i.join(n),t.splice(e-1,1)}}return t.splice(e,0,i),t}static extendWithRanges(t,e){if(0==e.length)return t;let i=[];for(let n=0,s=0,r=0,o=0;;n++){let a=n==t.length?null:t[n],l=r-o,h=a?a.fromB:1e9;for(;s<e.length&&e[s]<h;){let t=e[s],n=e[s+1],r=Math.max(o,t),a=Math.min(h,n);if(r<=a&&new on(r+l,a+l,r,a).addToSet(i),n>h)break;s+=2}if(!a)return i;new on(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,o=a.toB}}}class an{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=Q.empty(this.startState.doc.length);for(let t of i)this.changes=this.changes.compose(t.changes);let n=[];this.changes.iterChangedRanges(((t,e,i,s)=>n.push(new on(t,e,i,s)))),this.changedRanges=n}static create(t,e,i){return new an(t,e,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((t=>t.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}class ln extends ke{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new Ke],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new on(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every((({fromA:t,toA:e})=>e<this.minWidthFrom||t>this.minWidthTo))?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&((null===(e=this.domChanged)||void 0===e?void 0:e.newSel)?n=this.domChanged.newSel.head:function(t,e){let i=!1;e&&t.iterChangedRanges(((t,n)=>{t<e.to&&n>e.from&&(i=!0)}));return i}(t.changes,this.hasComposition)||t.selectionSet||(n=t.state.selection.main.head));let s=n>-1?function(t,e,i){let n=cn(t,i);if(!n)return null;let{node:s,from:r,to:o}=n,a=s.nodeValue;if(/[\n\r]/.test(a))return null;if(t.state.doc.sliceString(n.from,n.to)!=a)return null;let l=e.invertedDesc,h=new on(l.mapPos(r),l.mapPos(o),r,o),c=[];for(let e=s.parentNode;;e=e.parentNode){let i=ke.get(e);if(i instanceof Ve)c.push({node:e,deco:i.mark});else{if(i instanceof Ke||"DIV"==e.nodeName&&e.parentNode==t.contentDOM)return{range:h,text:s,marks:c,line:e};if(e==t.contentDOM)return null;c.push({node:e,deco:new si({inclusive:!0,attributes:Je(e),tagName:e.tagName.toLowerCase()})})}}}(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:e,to:n}=this.hasComposition;i=new on(e,n,t.changes.mapPos(e,-1),t.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(qe.ie||qe.chrome)&&!s&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let r=function(t,e,i){let n=new un;return Tt.compare(t,e,i,n),n.changes}(this.decorations,this.updateDeco(),t.changes);return i=on.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,t.startState.doc.length,s),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let t=qe.chrome||qe.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,t),this.flags&=-8,t&&(t.written||n.selectionRange.focusNode!=t.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((t=>t.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to<this.view.state.doc.length)for(let t of this.children)t instanceof ti&&t.widget instanceof hn&&s.push(t.dom);n.updateGaps(s)}updateChildren(t,e,i){let n=i?i.range.addToSet(t.slice()):t,s=this.childCursor(e);for(let t=n.length-1;;t--){let e=t>=0?n[t]:null;if(!e)break;let r,o,a,l,{fromA:h,toA:c,fromB:f,toB:u}=e;if(i&&i.range.fromB<u&&i.range.toB>f){let t=hi.build(this.view.state.doc,f,i.range.fromB,this.decorations,this.dynamicDecorationMap),e=hi.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);o=t.breakAtStart,a=t.openStart,l=e.openEnd;let n=this.compositionView(i);e.breakAtStart?n.breakAfter=1:e.content.length&&n.merge(n.length,n.length,e.content[0],!1,e.openStart,0)&&(n.breakAfter=e.content[0].breakAfter,e.content.shift()),t.content.length&&n.merge(0,0,t.content[t.content.length-1],!0,0,t.openEnd)&&t.content.pop(),r=t.content.concat(n).concat(e.content)}else({content:r,breakAtStart:o,openStart:a,openEnd:l}=hi.build(this.view.state.doc,f,u,this.decorations,this.dynamicDecorationMap));let{i:d,off:p}=s.findPos(c,1),{i:O,off:g}=s.findPos(h,-1);Pe(this,O,g,d,p,r,o,a,l)}i&&this.fixCompositionDOM(i)}compositionView(t){let e=new _e(t.text.nodeValue);e.flags|=8;for(let{deco:i}of t.marks)e=new Ve(i,[e],e.length);let i=new Ke;return i.append(e,0),i}fixCompositionDOM(t){let e=(t,e)=>{e.flags|=8|(e.children.some((t=>7&t.flags))?1:0),this.markedForComposition.add(e);let i=ke.get(t);i&&i!=e&&(i.dom=null),e.setDOM(t)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let s=t.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],e(s>=0?t.marks[s].node:t.text,n)}updateSelection(t=!1,e=!1){!t&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&re(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(o.anchor)),l=o.empty?a:this.moveToLine(this.domAtPos(o.head));if(qe.gecko&&o.empty&&!this.hasComposition&&(1==(h=a).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable))){let t=document.createTextNode("");this.view.observer.ignore((()=>a.node.insertBefore(t,a.node.childNodes[a.offset]||null))),a=l=new Se(t,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&(ae(a.node,a.offset,c.anchorNode,c.anchorOffset)&&ae(l.node,l.offset,c.focusNode,c.focusOffset)||this.suppressWidgetCursorChange(c,o))||(this.view.observer.ignore((()=>{qe.android&&qe.chrome&&this.dom.contains(c.focusNode)&&function(t,e){for(let i=t;i&&i!=e;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let t=ne(this.view.root);if(t)if(o.empty){if(qe.gecko){let t=(e=a.node,n=a.offset,1!=e.nodeType?0:(n&&"false"==e.childNodes[n-1].contentEditable?1:0)|(n<e.childNodes.length&&"false"==e.childNodes[n].contentEditable?2:0));if(t&&3!=t){let e=fn(a.node,a.offset,1==t?1:-1);e&&(a=new Se(e.node,e.offset))}}t.collapse(a.node,a.offset),null!=o.bidiLevel&&void 0!==t.caretBidiLevel&&(t.caretBidiLevel=o.bidiLevel)}else if(t.extend){t.collapse(a.node,a.offset);try{t.extend(l.node,l.offset)}catch(t){}}else{let e=document.createRange();o.anchor>o.head&&([a,l]=[l,a]),e.setEnd(l.node,l.offset),e.setStart(a.node,a.offset),t.removeAllRanges(),t.addRange(e)}else;var e,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(a,l)),this.impreciseAnchor=a.precise?null:new Se(c.anchorNode,c.anchorOffset),this.impreciseHead=l.precise?null:new Se(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&ae(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=ne(t.root),{anchorNode:n,anchorOffset:s}=t.observer.selectionRange;if(!(i&&e.empty&&e.assoc&&i.modify))return;let r=Ke.find(this,e.head);if(!r)return;let o=r.posAtStart;if(e.head==o||e.head==o+r.length)return;let a=this.coordsAt(e.head,-1),l=this.coordsAt(e.head,1);if(!a||!l||a.bottom>l.top)return;let h=this.domAtPos(e.head+e.assoc);i.collapse(h.node,h.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,s)}moveToLine(t){let e,i=this.dom;if(t.node!=i)return t;for(let n=t.offset;!e&&n<i.childNodes.length;n++){let t=ke.get(i.childNodes[n]);t instanceof Ke&&(e=t.domAtPos(0))}for(let n=t.offset-1;!e&&n>=0;n--){let t=ke.get(i.childNodes[n]);t instanceof Ke&&(e=t.domAtPos(t.length))}return e?new Se(e.node,e.offset,!0):t}nearest(t){for(let e=t;e;){let t=ke.get(e);if(t&&t.rootView==this)return t;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e<this.children.length-1;){let t=this.children[e];if(i<t.length||t instanceof Ke)break;e++,i=0}return this.children[e].domAtPos(i)}coordsAt(t,e){let i=null,n=0;for(let s=this.length,r=this.children.length-1;r>=0;r--){let o=this.children[r],a=s-o.breakAfter,l=a-o.length;if(a<t)break;l<=t&&(l<t||o.covers(-1))&&(a>t||o.covers(1))&&(!i||o instanceof Ke&&!(i instanceof Ke&&e>=0))&&(i=o,n=l),s=l}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof Ke))return null;for(;n.children.length;){let{i:t,off:e}=n.childPos(i,1);for(;;t++){if(t==n.children.length)return null;if((n=n.children[t]).length)break}i=e}if(!(n instanceof _e))return null;let s=p(n.text,i);if(s==i)return null;let r=we(n.dom,i,s).getClientRects();for(let t=0;t<r.length;t++){let e=r[t];if(t==r.length-1||e.top<e.bottom&&e.left<e.right)return e}return null}measureVisibleLineHeights(t){let e=[],{from:i,to:n}=t,s=this.view.contentDOM.clientWidth,r=s>Math.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,a=this.view.textDirection==ui.LTR;for(let t=0,l=0;l<this.children.length;l++){let h=this.children[l],c=t+h.length;if(c>n)break;if(t>=i){let i=h.dom.getBoundingClientRect();if(e.push(i.height),r){let e=h.dom.lastChild,n=e?oe(e):[];if(n.length){let e=n[n.length-1],r=a?e.right-i.left:i.right-e.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=t,this.minWidthTo=c)}}}t=c+h.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return"rtl"==getComputedStyle(this.children[e].dom).direction?ui.RTL:ui.LTR}measureTextSize(){for(let t of this.children)if(t instanceof Ke){let e=t.measureTextSize();if(e)return e}let t,e,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=oe(n.firstChild)[0];t=n.getBoundingClientRect().height,e=s?s.width/27:7,i=s?s.height:t,n.remove()})),{lineHeight:t,charWidth:e,textHeight:i}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new $e(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let s=n==e.viewports.length?null:e.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(e.lineBlockAt(r).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(ni.replace({widget:new hn(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return ni.set(t)}updateDeco(){let t=this.view.state.facet(Fi).map(((t,e)=>(this.dynamicDecorationMap[e]="function"==typeof t)?t(this.view):t)),e=!1,i=this.view.state.facet(Ji).map(((t,i)=>{let n="function"==typeof t;return n&&(e=!0),n?t(this.view):t}));i.length&&(this.dynamicDecorationMap[t.length]=e,t.push(Tt.join(i)));for(let e=t.length;e<t.length+3;e++)this.dynamicDecorationMap[e]=!1;return this.decorations=[...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco]}scrollIntoView(t){if(t.isSnapshot){let e=this.view.viewState.lineBlockAt(t.range.head);return this.view.scrollDOM.scrollTop=e.top-t.yMargin,void(this.view.scrollDOM.scrollLeft=t.xMargin)}let e,{range:i}=t,n=this.coordsAt(i.head,i.empty?i.assoc:i.head>i.anchor?-1:1);if(!n)return;!i.empty&&(e=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,e.left),top:Math.min(n.top,e.top),right:Math.max(n.right,e.right),bottom:Math.max(n.bottom,e.bottom)});let s=sn(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:a}=this.view.scrollDOM;!function(t,e,i,n,s,r,o,a){let l=t.ownerDocument,h=l.defaultView||window;for(let c=t,f=!1;c&&!f;)if(1==c.nodeType){let t,u=c==l.body,d=1,p=1;if(u)t=ue(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(f=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let e=c.getBoundingClientRect();({scaleX:d,scaleY:p}=de(c,e)),t={left:e.left,right:e.left+c.clientWidth*d,top:e.top,bottom:e.top+c.clientHeight*p}}let O=0,g=0;if("nearest"==s)e.top<t.top?(g=-(t.top-e.top+o),i>0&&e.bottom>t.bottom+g&&(g=e.bottom-t.bottom+g+o)):e.bottom>t.bottom&&(g=e.bottom-t.bottom+o,i<0&&e.top-g<t.top&&(g=-(t.top+g-e.top+o)));else{let n=e.bottom-e.top,r=t.bottom-t.top;g=("center"==s&&n<=r?e.top+n/2-r/2:"start"==s||"center"==s&&i<0?e.top-o:e.bottom-r+o)-t.top}if("nearest"==n?e.left<t.left?(O=-(t.left-e.left+r),i>0&&e.right>t.right+O&&(O=e.right-t.right+O+r)):e.right>t.right&&(O=e.right-t.right+r,i<0&&e.left<t.left+O&&(O=-(t.left+O-e.left+r))):O=("center"==n?e.left+(e.right-e.left)/2-(t.right-t.left)/2:"start"==n==a?e.left-r:e.right-(t.right-t.left)+r)-t.left,O||g)if(u)h.scrollBy(O,g);else{let t=0,i=0;if(g){let t=c.scrollTop;c.scrollTop+=g/p,i=(c.scrollTop-t)*p}if(O){let e=c.scrollLeft;c.scrollLeft+=O/d,t=(c.scrollLeft-e)*d}e={left:e.left-t,top:e.top-i,right:e.right-t,bottom:e.bottom-i},t&&Math.abs(t-O)<1&&(n="nearest"),i&&Math.abs(i-g)<1&&(s="nearest")}if(u)break;c=c.assignedSlot||c.parentNode}else{if(11!=c.nodeType)break;c=c.host}}(this.view.scrollDOM,r,i.head<i.anchor?-1:1,t.x,t.y,Math.max(Math.min(t.xMargin,o),-o),Math.max(Math.min(t.yMargin,a),-a),this.view.textDirection==ui.LTR)}}class hn extends ei{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}}function cn(t,e){let i=t.observer.selectionRange,n=i.focusNode&&fn(i.focusNode,i.focusOffset,0);if(!n)return null;let s=e-n.offset;return{from:s,to:s+n.node.nodeValue.length,node:n.node}}function fn(t,e,i){if(i<=0)for(let i=t,n=e;;){if(3==i.nodeType)return{node:i,offset:n};if(!(1==i.nodeType&&n>0))break;i=i.childNodes[n-1],n=ce(i)}if(i>=0)for(let n=t,s=e;;){if(3==n.nodeType)return{node:n,offset:s};if(!(1==n.nodeType&&s<n.childNodes.length&&i>=0))break;n=n.childNodes[s],s=0}return null}let un=class{constructor(){this.changes=[]}compareRange(t,e){li(t,e,this.changes)}comparePoint(t,e){li(t,e,this.changes)}};function dn(t,e){return e.left>t?e.left-t:Math.max(0,t-e.right)}function pn(t,e){return e.top>t?e.top-t:Math.max(0,t-e.bottom)}function On(t,e){return t.top<e.bottom-1&&t.bottom>e.top+1}function gn(t,e){return e<t.top?{top:e,left:t.left,right:t.right,bottom:t.bottom}:t}function mn(t,e){return e>t.bottom?{top:t.top,left:t.left,right:t.right,bottom:e}:t}function wn(t,e,i){let n,s,r,o,a,l,h,c,f=!1;for(let u=t.firstChild;u;u=u.nextSibling){let t=oe(u);for(let d=0;d<t.length;d++){let p=t[d];s&&On(s,p)&&(p=gn(mn(p,s.bottom),s.top));let O=dn(e,p),g=pn(i,p);if(0==O&&0==g)return 3==u.nodeType?vn(u,e,i):wn(u,e,i);if(!n||o>g||o==g&&r>O){n=u,s=p,r=O,o=g;let a=g?i<p.top?-1:1:O?e<p.left?-1:1:0;f=!a||(a>0?d<t.length-1:d>0)}0==O?i>p.bottom&&(!h||h.bottom<p.bottom)?(a=u,h=p):i<p.top&&(!c||c.top>p.top)&&(l=u,c=p):h&&On(h,p)?h=mn(h,p.bottom):c&&On(c,p)&&(c=gn(c,p.top))}}if(h&&h.bottom>=i?(n=a,s=h):c&&c.top<=i&&(n=l,s=c),!n)return{node:t,offset:0};let u=Math.max(s.left,Math.min(s.right,e));return 3==n.nodeType?vn(n,u,i):f&&"false"!=n.contentEditable?wn(n,u,i):{node:t,offset:Array.prototype.indexOf.call(t.childNodes,n)+(e>=(s.left+s.right)/2?1:0)}}function vn(t,e,i){let n=t.nodeValue.length,s=-1,r=1e9,o=0;for(let a=0;a<n;a++){let n=we(t,a,a+1).getClientRects();for(let l=0;l<n.length;l++){let h=n[l];if(h.top==h.bottom)continue;o||(o=e-h.left);let c=(h.top>i?h.top-i:i-h.bottom)-1;if(h.left-1<=e&&h.right+1>=e&&c<r){let i=e>=(h.left+h.right)/2,n=i;if(qe.chrome||qe.gecko){we(t,a).getBoundingClientRect().left==h.right&&(n=!i)}if(c<=0)return{node:t,offset:a+(n?1:0)};s=a+(n?1:0),r=c}}}return{node:t,offset:s>-1?s:o>0?t.nodeValue.length:0}}function bn(t,e,i,n=-1){var s,r;let o,a=t.contentDOM.getBoundingClientRect(),l=a.top+t.viewState.paddingTop,{docHeight:h}=t.viewState,{x:c,y:f}=e,u=f-l;if(u<0)return 0;if(u>h)return t.state.doc.length;for(let e=t.viewState.heightOracle.textHeight/2,s=!1;o=t.elementAtHeight(u),o.type!=ii.Text;)for(;u=n>0?o.bottom+e:o.top-e,!(u>=0&&u<=h);){if(s)return i?null:0;s=!0,n=-n}f=l+u;let d=o.from;if(d<t.viewport.from)return 0==t.viewport.from?0:i?null:yn(t,a,o,c,f);if(d>t.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:i?null:yn(t,a,o,c,f);let p=t.dom.ownerDocument,O=t.root.elementFromPoint?t.root:p,g=O.elementFromPoint(c,f);g&&!t.contentDOM.contains(g)&&(g=null),g||(c=Math.max(a.left+1,Math.min(a.right-1,c)),g=O.elementFromPoint(c,f),g&&!t.contentDOM.contains(g)&&(g=null));let m,w=-1;if(g&&0!=(null===(s=t.docView.nearest(g))||void 0===s?void 0:s.isEditable))if(p.caretPositionFromPoint){let t=p.caretPositionFromPoint(c,f);t&&({offsetNode:m,offset:w}=t)}else if(p.caretRangeFromPoint){let e=p.caretRangeFromPoint(c,f);e&&(({startContainer:m,startOffset:w}=e),(!t.contentDOM.contains(m)||qe.safari&&function(t,e,i){let n;if(3!=t.nodeType||e!=(n=t.nodeValue.length))return!1;for(let e=t.nextSibling;e;e=e.nextSibling)if(1!=e.nodeType||"BR"!=e.nodeName)return!1;return we(t,n-1,n).getBoundingClientRect().left>i}(m,w,c)||qe.chrome&&function(t,e,i){if(0!=e)return!1;for(let e=t;;){let t=e.parentNode;if(!t||1!=t.nodeType||t.firstChild!=e)return!1;if(t.classList.contains("cm-line"))break;e=t}let n=1==t.nodeType?t.getBoundingClientRect():we(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return i-n.left>5}(m,w,c))&&(m=void 0))}if(!m||!t.docView.dom.contains(m)){let e=Ke.find(t.docView,d);if(!e)return u>o.top+o.height/2?o.to:o.from;({node:m,offset:w}=wn(e.dom,c,f))}let v=t.docView.nearest(m);if(!v)return null;if(v.isWidget&&1==(null===(r=v.dom)||void 0===r?void 0:r.nodeType)){let t=v.dom.getBoundingClientRect();return e.y<t.top||e.y<=t.bottom&&e.x<=(t.left+t.right)/2?v.posAtStart:v.posAtEnd}return v.localPosFromDOM(m,w)+v.posAtStart}function yn(t,e,i,n,s){let r=Math.round((n-e.left)*t.defaultCharacterWidth);if(t.lineWrapping&&i.height>1.5*t.defaultLineHeight){let e=t.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(t.defaultLineHeight-e))/e)*t.viewState.heightOracle.lineLength}let o=t.state.sliceDoc(i.from,i.to);return i.from+It(o,r,t.state.tabSize)}function Sn(t,e){let i=t.lineBlockAt(e);if(Array.isArray(i.type))for(let t of i.type)if(t.to>e||t.to==e&&(t.to==i.to||t.type==ii.Text))return t;return i}function xn(t,e,i,n){let s=t.state.doc.lineAt(e.head),r=t.bidiSpans(s),o=t.textDirectionAt(s.from);for(let a=e,l=null;;){let e=Ti(s,r,o,a,i),h=Ci;if(!e){if(s.number==(i?t.state.doc.lines:1))return a;h="\n",s=t.state.doc.line(s.number+(i?1:-1)),r=t.bidiSpans(s),e=t.visualLineSide(s,!i)}if(l){if(!l(h))return a}else{if(!n)return e;l=n(h)}a=e}}function kn(t,e,i){for(;;){let n=0;for(let s of t)s.between(e-1,e+1,((t,s,r)=>{if(e>t&&e<s){let r=n||i||(e-t<s-e?-1:1);e=r<0?t:s,n=r}}));if(!n)return e}}function Qn(t,e,i){let n=kn(t.state.facet(Ki).map((e=>e(t))),i.from,e.head>i.from?-1:1);return n==i.from?i:X.cursor(n,n<i.from?1:-1)}class $n{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastEscPress=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,qe.safari&&t.contentDOM.addEventListener("input",(()=>null)),qe.gecko&&function(t){Kn.has(t)||(Kn.add(t),t.addEventListener("copy",(()=>{})),t.addEventListener("cut",(()=>{})))}(t.contentDOM.ownerDocument)}handleEvent(t){(function(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let i,n=e.target;n!=t.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=ke.get(n))&&i.ignoreEvent(e))return!1;return!0})(this.view,t)&&!this.ignoreDuringComposition(t)&&("keydown"==t.type&&this.keydown(t)||this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let t of i.observers)t(this.view,e);for(let t of i.handlers){if(e.defaultPrevented)break;if(t(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Zn(t),i=this.handlers,n=this.view.contentDOM;for(let t in e)if("scroll"!=t){let s=!e[t].handlers.length,r=i[t];r&&s!=!r.handlers.length&&(n.removeEventListener(t,this.handleEvent),r=null),r||n.addEventListener(t,this.handleEvent,{passive:s})}for(let t in i)"scroll"==t||e[t]||n.removeEventListener(t,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),9==t.keyCode&&Date.now()<this.lastEscPress+2e3)return!0;if(27!=t.keyCode&&An.indexOf(t.keyCode)<0&&(this.view.inputState.lastEscPress=0),qe.android&&qe.chrome&&!t.synthetic&&(13==t.keyCode||8==t.keyCode))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return!qe.ios||t.synthetic||t.altKey||t.metaKey||!((e=Cn.find((e=>e.keyCode==t.keyCode)))&&!t.ctrlKey||Tn.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(229!=t.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=e||t,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(){let t=this.pendingIOSKey;return!!t&&(this.pendingIOSKey=void 0,ve(this.view.contentDOM,t.key,t.keyCode))}ignoreDuringComposition(t){return!!/^key/.test(t.type)&&(this.composing>0||!!(qe.safari&&!qe.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function Pn(t,e){return(i,n)=>{try{return e.call(t,n,i)}catch(t){Ii(i.state,t)}}}function Zn(t){let e=Object.create(null);function i(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let e of t){let t=e.spec;if(t&&t.domEventHandlers)for(let n in t.domEventHandlers){let s=t.domEventHandlers[n];s&&i(n).handlers.push(Pn(e.value,s))}if(t&&t.domEventObservers)for(let n in t.domEventObservers){let s=t.domEventObservers[n];s&&i(n).observers.push(Pn(e.value,s))}}for(let t in Yn)i(t).handlers.push(Yn[t]);for(let t in Wn)i(t).observers.push(Wn[t]);return e}const Cn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Tn="dthko",An=[16,17,18,20,91,92,224,225];function Rn(t){return.7*Math.max(0,t)+8}class Xn{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParent=function(t){let e=t.ownerDocument;for(let i=t.parentNode;i&&i!=e.body;)if(1==i.nodeType){if(i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)return i;i=i.assignedSlot||i.parentNode}else{if(11!=i.nodeType)break;i=i.host}return null}(t.contentDOM),this.atoms=t.state.facet(Ki).map((e=>e(t)));let s=t.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(kt.allowMultipleSelections)&&function(t,e){let i=t.state.facet(Ri);return i.length?i[0](e):qe.mac?e.metaKey:e.ctrlKey}(t,e),this.dragging=!(!function(t,e){let{main:i}=t.state.selection;if(i.empty)return!1;let n=ne(t.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let t=0;t<s.length;t++){let i=s[t];if(i.left<=e.clientX&&i.right>=e.clientX&&i.top<=e.clientY&&i.bottom>=e.clientY)return!0}return!1}(t,e)||1!=Ln(e))&&null}start(t){!1===this.dragging&&this.select(t)}move(t){var e,i,n;if(0==t.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(i=this.startEvent,n=t,Math.max(Math.abs(i.clientX-n.clientX),Math.abs(i.clientY-n.clientY))<10))return;this.select(this.lastEvent=t);let s=0,r=0,o=(null===(e=this.scrollParent)||void 0===e?void 0:e.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},a=sn(this.view);t.clientX-a.left<=o.left+6?s=-Rn(o.left-t.clientX):t.clientX+a.right>=o.right-6&&(s=Rn(t.clientX-o.right)),t.clientY-a.top<=o.top+6?r=-Rn(o.top-t.clientY):t.clientY+a.bottom>=o.bottom-6&&(r=Rn(t.clientY-o.bottom)),this.setScrollSpeed(s,r)}up(t){null==this.dragging&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;i<t.ranges.length;i++){let n=t.ranges[i],s=null;if(n.empty){let t=kn(this.atoms,n.from,0);t!=n.from&&(s=X.cursor(t,-1))}else{let t=kn(this.atoms,n.from,-1),e=kn(this.atoms,n.to,1);t==n.from&&e==n.to||(s=X.range(n.from==n.anchor?t:e,n.from==n.head?t:e))}s&&(e||(e=t.ranges.slice()),e[i]=s)}return e?X.create(e,t.mainIndex):t}select(t){let{view:e}=this,i=this.skipAtoms(this.style.get(t,this.extend,this.multiple));!this.mustSelect&&i.eq(e.state.selection,!1===this.dragging)||this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(t){this.style.update(t)&&setTimeout((()=>this.select(this.lastEvent)),20)}}const Yn=Object.create(null),Wn=Object.create(null),Mn=qe.ie&&qe.ie_version<15||qe.ios&&qe.webkit_version<604;function jn(t,e){let i,{state:n}=t,s=1,r=n.toText(e),o=r.lines==n.selection.ranges.length;if(null!=Un&&n.selection.ranges.every((t=>t.empty))&&Un==r.toString()){let t=-1;i=n.changeByRange((i=>{let a=n.doc.lineAt(i.from);if(a.from==t)return{range:i};t=a.from;let l=n.toText((o?r.line(s++).text:e)+n.lineBreak);return{changes:{from:a.from,insert:l},range:X.cursor(i.from+l.length)}}))}else i=o?n.changeByRange((t=>{let e=r.line(s++);return{changes:{from:t.from,to:t.to,insert:e.text},range:X.cursor(t.from+e.length)}})):n.replaceSelection(r);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function Dn(t,e,i,n){if(1==n)return X.cursor(e,i);if(2==n)return function(t,e,i=1){let n=t.charCategorizer(e),s=t.doc.lineAt(e),r=e-s.from;if(0==s.length)return X.cursor(e);0==r?i=1:r==s.length&&(i=-1);let o=r,a=r;i<0?o=p(s.text,r,!1):a=p(s.text,r);let l=n(s.text.slice(o,a));for(;o>0;){let t=p(s.text,o,!1);if(n(s.text.slice(t,o))!=l)break;o=t}for(;a<s.length;){let t=p(s.text,a);if(n(s.text.slice(a,t))!=l)break;a=t}return X.range(o+s.from,a+s.from)}(t.state,e,i);{let i=Ke.find(t.docView,e),n=t.state.doc.lineAt(i?i.posAtEnd:e),s=i?i.posAtStart:n.from,r=i?i.posAtEnd:n.to;return r<t.state.doc.length&&r==n.to&&r++,X.range(s,r)}}Wn.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft},Yn.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),27==e.keyCode&&(t.inputState.lastEscPress=Date.now()),!1),Wn.touchstart=(t,e)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")},Wn.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")},Yn.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of t.state.facet(Yi))if(i=n(t,e),i)break;if(i||0!=e.button||(i=function(t,e){let i=Vn(t,e),n=Ln(e),s=t.state.selection;return{update(t){t.docChanged&&(i.pos=t.changes.mapPos(i.pos),s=s.map(t.changes))},get(e,r,o){let a,l=Vn(t,e),h=Dn(t,l.pos,l.bias,n);if(i.pos!=l.pos&&!r){let e=Dn(t,i.pos,i.bias,n),s=Math.min(e.from,h.from),r=Math.max(e.to,h.to);h=s<h.from?X.range(s,r):X.range(r,s)}return r?s.replaceRange(s.main.extend(h.from,h.to)):o&&1==n&&s.ranges.length>1&&(a=function(t,e){for(let i=0;i<t.ranges.length;i++){let{from:n,to:s}=t.ranges[i];if(n<=e&&s>=e)return X.create(t.ranges.slice(0,i).concat(t.ranges.slice(i+1)),t.mainIndex==i?0:t.mainIndex-(t.mainIndex>i?1:0))}return null}(s,l.pos))?a:o?s.addRange(h):X.create([h])}}}(t,e)),i){let n=!t.hasFocus;t.inputState.startMouseSelection(new Xn(t,e,i,n)),n&&t.observer.ignore((()=>me(t.contentDOM)));let s=t.inputState.mouseSelection;if(s)return s.start(e),!1===s.dragging}return!1};let En=(t,e)=>t>=e.top&&t<=e.bottom,qn=(t,e,i)=>En(e,i)&&t>=i.left&&t<=i.right;function _n(t,e,i,n){let s=Ke.find(t.docView,e);if(!s)return 1;let r=e-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&qn(i,n,o))return-1;let a=s.coordsAt(r,1);return a&&qn(i,n,a)?1:o&&En(n,o)?-1:1}function Vn(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:i,bias:_n(t,i,e.clientX,e.clientY)}}const In=qe.ie&&qe.ie_version<=11;let zn=null,Bn=0,Gn=0;function Ln(t){if(!In)return t.detail;let e=zn,i=Gn;return zn=t,Gn=Date.now(),Bn=!e||i>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(Bn+1)%3:1}function Nn(t,e,i,n){if(!i)return;let s=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:r}=t.inputState,o=n&&r&&function(t,e){let i=t.state.facet(Xi);return i.length?i[0](e):qe.mac?!e.altKey:!e.ctrlKey}(t,e)?{from:r.from,to:r.to}:null,a={from:s,insert:i},l=t.state.changes(o?[o,a]:a);t.focus(),t.dispatch({changes:l,selection:{anchor:l.mapPos(s,-1),head:l.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),t.inputState.draggedContent=null}Yn.dragstart=(t,e)=>{let{selection:{main:i}}=t.state;if(e.target.draggable){let n=t.docView.nearest(e.target);if(n&&n.isWidget){let t=n.posAtStart,e=t+n.length;(t>=i.to||e<=i.from)&&(i=X.range(t,e))}}let{inputState:n}=t;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=i,e.dataTransfer&&(e.dataTransfer.setData("Text",t.state.sliceDoc(i.from,i.to)),e.dataTransfer.effectAllowed="copyMove"),!1},Yn.dragend=t=>(t.inputState.draggedContent=null,!1),Yn.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let i=e.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&Nn(t,e,n.filter((t=>null!=t)).join(t.state.lineBreak),!1)};for(let t=0;t<i.length;t++){let e=new FileReader;e.onerror=r,e.onload=()=>{/[\x00-\x08\x0e-\x1f]{2}/.test(e.result)||(n[t]=e.result),r()},e.readAsText(i[t])}return!0}{let i=e.dataTransfer.getData("Text");if(i)return Nn(t,e,i,!0),!0}return!1},Yn.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let i=Mn?null:e.clipboardData;return i?(jn(t,i.getData("text/plain")||i.getData("text/uri-text")),!0):(function(t){let e=t.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{t.focus(),i.remove(),jn(t,i.value)}),50)}(t),!1)};let Un=null;Yn.copy=Yn.cut=(t,e)=>{let{text:i,ranges:n,linewise:s}=function(t){let e=[],i=[],n=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),i.push(n));if(!e.length){let s=-1;for(let{from:n}of t.selection.ranges){let r=t.doc.lineAt(n);r.number>s&&(e.push(r.text),i.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),s=r.number}n=!0}return{text:e.join(t.lineBreak),ranges:i,linewise:n}}(t.state);if(!i&&!s)return!1;Un=s?i:null,"cut"!=e.type||t.state.readOnly||t.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Mn?null:e.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(t,e){let i=t.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout((()=>{n.remove(),t.focus()}),50)}(t,i),!1)};const Hn=ht.define();function Fn(t,e){let i=[];for(let n of t.facet(Di)){let s=n(t,e);s&&i.push(s)}return i?t.update({effects:i,annotations:Hn.of(!0)}):null}function Jn(t){setTimeout((()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let i=Fn(t.state,e);i?t.dispatch(i):t.update([])}}),10)}Wn.focus=t=>{t.inputState.lastFocusTime=Date.now(),t.scrollDOM.scrollTop||!t.inputState.lastScrollTop&&!t.inputState.lastScrollLeft||(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),Jn(t)},Wn.blur=t=>{t.observer.clearSelectionRange(),Jn(t)},Wn.compositionstart=Wn.compositionupdate=t=>{null==t.inputState.compositionFirstChange&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0)},Wn.compositionend=t=>{t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,qe.chrome&&qe.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then((()=>t.observer.flush())):setTimeout((()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])}),50)},Wn.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()},Yn.beforeinput=(t,e)=>{var i;let n;if(qe.chrome&&qe.android&&(n=Cn.find((t=>t.inputType==e.inputType)))&&(t.observer.delayAndroidKey(n.key,n.keyCode),"Backspace"==n.key||"Delete"==n.key)){let e=(null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>e+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())}),100)}return!1};const Kn=new Set;const ts=["pre-wrap","normal","pre-line","break-spaces"];class es{constructor(e){this.lineWrapping=e,this.doc=t.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){if(!this.lineWrapping)return this.lineHeight;return(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return ts.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i<t.length;i++){let n=t[i];n<0?i++:this.heightSamples[Math.floor(10*n)]||(e=!0,this.heightSamples[Math.floor(10*n)]=!0)}return e}refresh(t,e,i,n,s,r){let o=ts.indexOf(t)>-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=s,a){this.heightSamples={};for(let t=0;t<r.length;t++){let e=r[t];e<0?t++:this.heightSamples[Math.floor(10*e)]=!0}}return a}}class is{constructor(t,e){this.from=t,this.heights=e,this.index=0}get more(){return this.index<this.heights.length}}class ns{constructor(t,e,i,n,s){this.from=t,this.length=e,this.top=i,this.height=n,this._content=s}get type(){return"number"==typeof this._content?ii.Text:Array.isArray(this._content)?this._content:this._content.type}get to(){return this.from+this.length}get bottom(){return this.top+this.height}get widget(){return this._content instanceof oi?this._content.widget:null}get widgetLineBreaks(){return"number"==typeof this._content?this._content:0}join(t){let e=(Array.isArray(this._content)?this._content:[this]).concat(Array.isArray(t._content)?t._content:[t]);return new ns(this.from,this.length+t.length,this.top,this.height+t.height,e)}}var ss=function(t){return t[t.ByPos=0]="ByPos",t[t.ByHeight=1]="ByHeight",t[t.ByPosNoHeight=2]="ByPosNoHeight",t}(ss||(ss={}));const rs=.001;class os{constructor(t,e,i=2){this.length=t,this.height=e,this.flags=i}get outdated(){return(2&this.flags)>0}set outdated(t){this.flags=(t?2:0)|-3&this.flags}setHeight(t,e){this.height!=e&&(Math.abs(this.height-e)>rs&&(t.heightChanged=!0),this.height=e)}replace(t,e,i){return os.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:a,toA:l,fromB:h,toB:c}=n[o],f=s.lineAt(a,ss.ByPosNoHeight,i.setDoc(e),0,0),u=f.to>=l?f:s.lineAt(l,ss.ByPosNoHeight,i,0,0);for(c+=u.to-l,l=u.to;o>0&&f.from<=n[o-1].toA;)a=n[o-1].fromA,h=n[o-1].fromB,o--,a<f.from&&(f=s.lineAt(a,ss.ByPosNoHeight,i,0,0));h+=f.from-a,a=f.from;let d=us.build(i.setDoc(r),t,h,c);s=s.replace(a,l,d)}return s.updateHeight(i,0)}static empty(){return new ls(0,0)}static of(t){if(1==t.length)return t[0];let e=0,i=t.length,n=0,s=0;for(;;)if(e==i)if(n>2*s){let s=t[e-1];s.break?t.splice(--e,1,s.left,null,s.right):t.splice(--e,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let e=t[i];e.break?t.splice(i,1,e.left,null,e.right):t.splice(i,1,e.left,e.right),i+=2+e.break,s-=e.size}}else if(n<s){let i=t[e++];i&&(n+=i.size)}else{let e=t[--i];e&&(s+=e.size)}let r=0;return null==t[e-1]?(r=1,e--):null==t[e]&&(r=1,i++),new cs(os.of(t.slice(0,e)),r,os.of(t.slice(i)))}}os.prototype.size=1;class as extends os{constructor(t,e,i){super(t,e),this.deco=i}blockAt(t,e,i,n){return new ns(n,this.length,i,this.height,this.deco||0)}lineAt(t,e,i,n,s){return this.blockAt(0,i,n,s)}forEachLine(t,e,i,n,s,r){t<=s+this.length&&e>=s&&r(this.blockAt(0,i,n,s))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(t,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class ls extends as{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new ns(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return 1==i.length&&(n instanceof ls||n instanceof hs&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof hs?n=new ls(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):os.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(t,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(t,Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class hs extends os{constructor(t){super(t,0)}heightMetrics(t,e){let i,n=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-n+1,o=0;if(t.lineWrapping){let e=Math.min(this.height,t.lineHeight*r);i=e/r,this.length>r+1&&(o=(this.height-e)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(t,e,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let s=n+Math.round(Math.max(0,Math.min(1,(t-i)/this.height))*this.length),r=e.doc.lineAt(s),l=o+r.length*a,h=Math.max(i,t-l/2);return new ns(r.from,r.length,h,l,0)}{let n=Math.max(0,Math.min(r-s,Math.floor((t-i)/o))),{from:a,length:l}=e.doc.line(s+n);return new ns(a,l,i+o*n,o,0)}}lineAt(t,e,i,n,s){if(e==ss.ByHeight)return this.blockAt(t,i,n,s);if(e==ss.ByPosNoHeight){let{from:e,to:n}=i.doc.lineAt(t);return new ns(e,n-e,0,0,0)}let{firstLine:r,perLine:o,perChar:a}=this.heightMetrics(i,s),l=i.doc.lineAt(t),h=o+l.length*a,c=l.number-r,f=n+o*c+a*(l.from-s-c);return new ns(l.from,l.length,Math.max(n,Math.min(f,n+this.height-h)),h,0)}forEachLine(t,e,i,n,s,r){t=Math.max(t,s),e=Math.min(e,s+this.length);let{firstLine:o,perLine:a,perChar:l}=this.heightMetrics(i,s);for(let h=t,c=n;h<=e;){let e=i.doc.lineAt(h);if(h==t){let i=e.number-o;c+=a*i+l*(t-s-i)}let n=a+l*e.length;r(new ns(e.from,e.length,c,n,0)),c+=n,h=e.to+1}}replace(t,e,i){let n=this.length-e;if(n>0){let t=i[i.length-1];t instanceof hs?i[i.length-1]=new hs(t.length+n):i.push(null,new hs(n-1))}if(t>0){let e=i[0];e instanceof hs?i[0]=new hs(t+e.length):i.unshift(new hs(t-1),null)}return os.of(i)}decomposeLeft(t,e){e.push(new hs(t-1),null)}decomposeRight(t,e){e.push(null,new hs(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let s=e+this.length;if(n&&n.from<=e+this.length&&n.more){let i=[],r=Math.max(e,n.from),o=-1;for(n.from>e&&i.push(new hs(n.from-e-1).updateHeight(t,e));r<=s&&n.more;){let e=t.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=rs&&(o=-2);let a=new ls(e,s);a.outdated=!1,i.push(a),r+=e+1}r<=s&&i.push(null,new hs(s-r).updateHeight(t,r));let a=os.of(i);return(o<0||Math.abs(a.height-this.height)>=rs||Math.abs(o-this.heightMetrics(t,e).perLine)>=rs)&&(t.heightChanged=!0),a}return(i||this.outdated)&&(this.setHeight(t,t.heightForGap(e,e+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class cs extends os{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return 1&this.flags}blockAt(t,e,i,n){let s=i+this.left.height;return t<s?this.left.blockAt(t,e,i,n):this.right.blockAt(t,e,s,n+this.left.length+this.break)}lineAt(t,e,i,n,s){let r=n+this.left.height,o=s+this.left.length+this.break,a=e==ss.ByHeight?t<r:t<o,l=a?this.left.lineAt(t,e,i,n,s):this.right.lineAt(t,e,i,r,o);if(this.break||(a?l.to<o:l.from>o))return l;let h=e==ss.ByPosNoHeight?ss.ByPosNoHeight:ss.ByPos;return a?l.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(l)}forEachLine(t,e,i,n,s,r){let o=n+this.left.height,a=s+this.left.length+this.break;if(this.break)t<a&&this.left.forEachLine(t,e,i,n,s,r),e>=a&&this.right.forEachLine(t,e,i,o,a,r);else{let l=this.lineAt(a,ss.ByPos,i,n,s);t<l.from&&this.left.forEachLine(t,l.from-1,i,n,s,r),l.to>=t&&l.from<=e&&r(l),e>l.to&&this.right.forEachLine(l.to+1,e,i,o,a,r)}}replace(t,e,i){let n=this.left.length+this.break;if(e<n)return this.balanced(this.left.replace(t,e,i),this.right);if(t>this.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let s=[];t>0&&this.decomposeLeft(t,s);let r=s.length;for(let t of i)s.push(t);if(t>0&&fs(s,r-1),e<this.length){let t=s.length;this.decomposeRight(e,s),fs(s,t)}return os.of(s)}decomposeLeft(t,e){let i=this.left.length;if(t<=i)return this.left.decomposeLeft(t,e);e.push(this.left),this.break&&(i++,t>=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t<i&&this.left.decomposeRight(t,e),this.break&&t<n&&e.push(null),e.push(this.right)}balanced(t,e){return t.size>2*e.size||e.size>2*t.size?os.of(this.break?[t,null,e]:[t,e]):(this.left=t,this.right=e,this.height=t.height+e.height,this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:s,right:r}=this,o=e+s.length+this.break,a=null;return n&&n.from<=e+s.length&&n.more?a=s=s.updateHeight(t,e,i,n):s.updateHeight(t,e,i),n&&n.from<=o+r.length&&n.more?a=r=r.updateHeight(t,o,i,n):r.updateHeight(t,o,i),a?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function fs(t,e){let i,n;null==t[e]&&(i=t[e-1])instanceof hs&&(n=t[e+1])instanceof hs&&t.splice(e-1,3,new hs(i.length+1+n.length))}class us{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let t=Math.min(e,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof ls?i.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new ls(t-this.pos,-1)),this.writtenTo=t,e>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t<e||i.heightRelevant){let n=i.widget?i.widget.estimatedHeight:0,s=i.widget?i.widget.lineBreaks:0;n<0&&(n=this.oracle.lineHeight);let r=e-t;i.block?this.addBlock(new as(r,n,i)):(r||s||n>=5)&&this.addLineDeco(n,s,r)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd<this.pos&&(this.lineEnd=this.oracle.doc.lineAt(this.pos).to)}enterLine(){if(this.lineStart>-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTo<t&&((this.writtenTo<t-1||null==this.nodes[this.nodes.length-1])&&this.nodes.push(this.blankContent(this.writtenTo,t-1)),this.nodes.push(null)),this.pos>t&&this.nodes.push(new ls(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new hs(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof ls)return t;let e=new ls(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||e instanceof ls||this.isCovered?(this.writtenTo<this.pos||null==e)&&this.nodes.push(this.blankContent(this.writtenTo,this.pos)):this.nodes.push(new ls(0,-1));let i=t;for(let t of this.nodes)t instanceof ls&&t.updateHeight(this.oracle,i),i+=t?t.length:1;return this.nodes}static build(t,e,i,n){let s=new us(i,t);return Tt.spans(e,i,n,s,0),s.finish(i)}}class ds{constructor(){this.changes=[]}compareRange(){}comparePoint(t,e,i,n){(t<e||i&&i.heightRelevant||n&&n.heightRelevant)&&li(t,e,this.changes,5)}}function ps(t,e){let i=t.getBoundingClientRect(),n=t.ownerDocument,s=n.defaultView||window,r=Math.max(0,i.left),o=Math.min(s.innerWidth,i.right),a=Math.max(0,i.top),l=Math.min(s.innerHeight,i.bottom);for(let e=t.parentNode;e&&e!=n.body;)if(1==e.nodeType){let i=e,n=window.getComputedStyle(i);if((i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),a=Math.max(a,n.top),l=e==t.parentNode?n.bottom:Math.min(l,n.bottom)}e="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=e.nodeType)break;e=e.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:a-(i.top+e),bottom:Math.max(a,l)-(i.top+e)}}function Os(t,e){let i=t.getBoundingClientRect();return{left:0,right:i.right-i.left,top:e,bottom:i.bottom-(i.top+e)}}class gs{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++){let n=t[i],s=e[i];if(n.from!=s.from||n.to!=s.to||n.size!=s.size)return!1}return!0}draw(t,e){return ni.replace({widget:new ms(this.size*(e?t.scaleY:t.scaleX),e)}).range(this.from,this.to)}}class ms extends ei{constructor(t,e){super(),this.size=t,this.vertical=e}eq(t){return t.size==this.size&&t.vertical==this.vertical}toDOM(){let t=document.createElement("div");return this.vertical?t.style.height=this.size+"px":(t.style.width=this.size+"px",t.style.height="2px",t.style.display="inline-block"),t}get estimatedHeight(){return this.vertical?this.size:-1}}class ws{constructor(e){this.state=e,this.pixelViewport={left:0,right:window.innerWidth,top:0,bottom:0},this.inView=!0,this.paddingTop=0,this.paddingBottom=0,this.contentDOMWidth=0,this.contentDOMHeight=0,this.editorHeight=0,this.editorWidth=0,this.scrollTop=0,this.scrolledToBottom=!0,this.scaleX=1,this.scaleY=1,this.scrollAnchorPos=0,this.scrollAnchorHeight=-1,this.scaler=xs,this.scrollTarget=null,this.printing=!1,this.mustMeasureContent=!0,this.defaultTextDirection=ui.LTR,this.visibleRanges=[],this.mustEnforceCursorAssoc=!1;let i=e.facet(Hi).some((t=>"function"!=typeof t&&"cm-lineWrapping"==t.class));this.heightOracle=new es(i),this.stateDeco=e.facet(Fi).filter((t=>"function"!=typeof t)),this.heightMap=os.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle.setDoc(e.doc),[new on(0,0,0,e.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ni.set(this.lineGaps.map((t=>t.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some((({from:t,to:e})=>n>=t&&n<=e))){let{from:e,to:i}=this.lineBlockAt(n);t.push(new vs(e,i))}}this.viewports=t.sort(((t,e)=>t.from-e.from)),this.scaler=this.heightMap.height<=7e6?xs:new ks(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(t=>{this.viewportLines.push(1==this.scaler.scale?t:Qs(t,this.scaler))}))}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(Fi).filter((t=>"function"!=typeof t));let n=t.changedRanges,s=on.extendWithRanges(n,function(t,e,i){let n=new ds;return Tt.compare(t,e,i,n,0),n.changes}(i,this.stateDeco,t?t.changes:Q.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),s),this.heightMap.height!=r&&(t.flags|=2),o?(this.scrollAnchorPos=t.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=s.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.head<a.from||e.range.head>a.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let l=!t.changes.empty||2&t.flags||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),l&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(qi)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let i=e.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?ui.RTL:ui.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),a=i.getBoundingClientRect(),l=o||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let h=0,c=0;if(a.width&&a.height){let{scaleX:t,scaleY:e}=de(i,a);this.scaleX==t&&this.scaleY==e||(this.scaleX=t,this.scaleY=e,h|=8,o=l=!0)}let f=(parseInt(n.paddingTop)||0)*this.scaleY,u=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==f&&this.paddingBottom==u||(this.paddingTop=f,this.paddingBottom=u,h|=10),this.editorWidth!=e.scrollDOM.clientWidth&&(s.lineWrapping&&(l=!0),this.editorWidth=e.scrollDOM.clientWidth,h|=8);let d=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=ye(e.scrollDOM);let p=(this.printing?Os:ps)(i,this.paddingTop),O=p.top-this.pixelViewport.top,g=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let m=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(m!=this.inView&&(this.inView=m,m&&(l=!0)),!this.inView&&!this.scrollTarget)return 0;let w=a.width;if(this.contentDOMWidth==w&&this.editorHeight==e.scrollDOM.clientHeight||(this.contentDOMWidth=a.width,this.editorHeight=e.scrollDOM.clientHeight,h|=8),l){let i=e.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(w-this.contentDOMWidth)>s.charWidth){let{lineHeight:t,charWidth:n,textHeight:a}=e.docView.measureTextSize();o=t>0&&s.refresh(r,t,n,a,w/n,i),o&&(e.docView.minWidth=0,h|=8)}O>0&&g>0?c=Math.max(O,g):O<0&&g<0&&(c=Math.min(O,g)),s.heightChanged=!1;for(let n of this.viewports){let r=n.from==this.viewport.from?i:e.docView.measureVisibleLineHeights(n);this.heightMap=(o?os.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle,[new on(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new is(n.from,r))}s.heightChanged&&(h|=2)}let v=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.head<this.viewport.from||this.scrollTarget.range.head>this.viewport.to);return v&&(this.viewport=this.getViewport(c,this.scrollTarget)),this.updateForViewport(),(2&h||v)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,e)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,a=new vs(n.lineAt(r-1e3*i,ss.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),ss.ByHeight,s,0,0).to);if(e){let{head:t}=e.range;if(t<a.from||t>a.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(t,ss.ByPos,s,0,0);i="center"==e.y?(o.top+o.bottom)/2-r/2:"start"==e.y||"nearest"==e.y&&t<a.from?o.top:o.bottom-r,a=new vs(n.lineAt(i-500,ss.ByHeight,s,0,0).from,n.lineAt(i+r+500,ss.ByHeight,s,0,0).to)}}return a}mapViewport(t,e){let i=e.mapPos(t.from,-1),n=e.mapPos(t.to,1);return new vs(this.heightMap.lineAt(i,ss.ByPos,this.heightOracle,0,0).from,this.heightMap.lineAt(n,ss.ByPos,this.heightOracle,0,0).to)}viewportIsAppropriate({from:t,to:e},i=0){if(!this.inView)return!0;let{top:n}=this.heightMap.lineAt(t,ss.ByPos,this.heightOracle,0,0),{bottom:s}=this.heightMap.lineAt(e,ss.ByPos,this.heightOracle,0,0),{visibleTop:r,visibleBottom:o}=this;return(0==t||n<=r-Math.max(10,Math.min(-i,250)))&&(e==this.state.doc.length||s>=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s<o+2e3}mapLineGaps(t,e){if(!t.length||e.empty)return t;let i=[];for(let n of t)e.touchesRange(n.from,n.to)||i.push(new gs(e.mapPos(n.from),e.mapPos(n.to),n.size));return i}ensureLineGaps(t,e){let i=this.heightOracle.lineWrapping,n=i?1e4:2e3,s=n>>1,r=n<<1;if(this.defaultTextDirection!=ui.LTR&&!i)return[];let o=[],a=(n,r,l,h)=>{if(r-n<s)return;let c=this.state.selection.main,f=[c.from];c.empty||f.push(c.to);for(let t of f)if(t>n&&t<r)return a(n,t-10,l,h),void a(t+10,r,l,h);let u=function(t,e){for(let i of t)if(e(i))return i;return}(t,(t=>t.from>=l.from&&t.to<=l.to&&Math.abs(t.from-n)<s&&Math.abs(t.to-r)<s&&!f.some((e=>t.from<e&&t.to>e))));if(!u){if(r<l.to&&e&&i&&e.visibleRanges.some((t=>t.from<=r&&t.to>=r))){let t=e.moveToLineBoundary(X.cursor(r),!1,!0).head;t>n&&(r=t)}u=new gs(n,r,this.gapSize(l,n,r,h))}o.push(u)};for(let t of this.viewportLines){if(t.length<r)continue;let e=bs(t.from,t.to,this.stateDeco);if(e.total<r)continue;let s,o,l=this.scrollTarget?this.scrollTarget.range.head:null;if(i){let i,r,a=n/this.heightOracle.lineLength*this.heightOracle.lineHeight;if(null!=l){let n=Ss(e,l),s=((this.visibleBottom-this.visibleTop)/2+a)/t.height;i=n-s,r=n+s}else i=(this.visibleTop-t.top-a)/t.height,r=(this.visibleBottom-t.top+a)/t.height;s=ys(e,i),o=ys(e,r)}else{let t,i,r=e.total*this.heightOracle.charWidth,a=n*this.heightOracle.charWidth;if(null!=l){let n=Ss(e,l),s=((this.pixelViewport.right-this.pixelViewport.left)/2+a)/r;t=n-s,i=n+s}else t=(this.pixelViewport.left-a)/r,i=(this.pixelViewport.right+a)/r;s=ys(e,t),o=ys(e,i)}s>t.from&&a(t.from,s,t,e),o<t.to&&a(o,t.to,t,e)}return o}gapSize(t,e,i,n){let s=Ss(n,i)-Ss(n,e);return this.heightOracle.lineWrapping?t.height*s:n.total*this.heightOracle.charWidth*s}updateLineGaps(t){gs.same(t,this.lineGaps)||(this.lineGaps=t,this.lineGapDeco=ni.set(t.map((t=>t.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];Tt.spans(t,this.viewport.from,this.viewport.to,{span(t,i){e.push({from:t,to:i})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some(((t,i)=>t.from!=e[i].from||t.to!=e[i].to));return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find((e=>e.from<=t&&e.to>=t))||Qs(this.heightMap.lineAt(t,ss.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return Qs(this.heightMap.lineAt(this.scaler.fromDOM(t),ss.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Qs(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class vs{constructor(t,e){this.from=t,this.to=e}}function bs(t,e,i){let n=[],s=t,r=0;return Tt.spans(i,t,e,{span(){},point(t,e){t>s&&(n.push({from:s,to:t}),r+=t-s),s=e}},20),s<e&&(n.push({from:s,to:e}),r+=e-s),{total:r,ranges:n}}function ys({total:t,ranges:e},i){if(i<=0)return e[0].from;if(i>=1)return e[e.length-1].to;let n=Math.floor(t*i);for(let t=0;;t++){let{from:i,to:s}=e[t],r=s-i;if(n<=r)return i+n;n-=r}}function Ss(t,e){let i=0;for(let{from:n,to:s}of t.ranges){if(e<=s){i+=e-n;break}i+=s-n}return i/t.total}const xs={toDOM:t=>t,fromDOM:t=>t,scale:1};class ks{constructor(t,e,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=e.lineAt(i,ss.ByPos,t,0,0).top,o=e.lineAt(s,ss.ByPos,t,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(e.height-n);for(let t of this.viewports)t.domTop=r+(t.top-s)*this.scale,r=t.domBottom=t.domTop+(t.bottom-t.top),s=t.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let s=e<this.viewports.length?this.viewports[e]:null;if(!s||t<s.top)return n+(t-i)*this.scale;if(t<=s.bottom)return s.domTop+(t-s.top);i=s.bottom,n=s.domBottom}}fromDOM(t){for(let e=0,i=0,n=0;;e++){let s=e<this.viewports.length?this.viewports[e]:null;if(!s||t<s.domTop)return i+(t-n)/this.scale;if(t<=s.domBottom)return s.top+(t-s.domTop);i=s.bottom,n=s.domBottom}}}function Qs(t,e){if(1==e.scale)return t;let i=e.toDOM(t.top),n=e.toDOM(t.bottom);return new ns(t.from,t.length,i,n-i,Array.isArray(t._content)?t._content.map((t=>Qs(t,e))):t._content)}const $s=M.define({combine:t=>t.join(" ")}),Ps=M.define({combine:t=>t.indexOf(!0)>-1}),Zs=Nt.newName(),Cs=Nt.newName(),Ts=Nt.newName(),As={"&light":"."+Cs,"&dark":"."+Ts};function Rs(t,e,i){return new Nt(e,{finish:e=>/&/.test(e)?e.replace(/&\w*/,(e=>{if("&"==e)return t;if(!i||!i[e])throw new RangeError(`Unsupported selector: ${e}`);return i[e]})):t+" "+e})}const Xs=Rs("."+Zs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="20"><path stroke="%23888" stroke-width="1" fill="none" d="M1 10H196L190 5M190 15L196 10M197 4L197 16"/></svg>\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},As),Ys="";class Ws{constructor(t,e){this.points=t,this.text="",this.lineSeparator=e.facet(kt.lineSeparator)}append(t){this.text+=t}lineBreak(){this.text+=Ys}readRange(t,e){if(!t)return this;let i=t.parentNode;for(let n=t;;){this.findPointBefore(i,n);let t=this.text.length;this.readNode(n);let s=n.nextSibling;if(s==e)break;let r=ke.get(n),o=ke.get(s);(r&&o?r.breakAfter:(r?r.breakAfter:js(n))||js(s)&&("BR"!=n.nodeName||n.cmIgnore)&&this.text.length>t)&&this.lineBreak(),n=s}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(e))&&(r=s.index,o=s[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let e of this.points)e.node==t&&e.pos>this.text.length&&(e.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=ke.get(t),i=e&&e.overrideDOMText;if(null!=i){this.findPointInside(t,i.length);for(let t=i.iter();!t.next().done;)t.lineBreak?this.lineBreak():this.append(t.value)}else 3==t.nodeType?this.readTextNode(t):"BR"==t.nodeName?t.nextSibling&&this.lineBreak():1==t.nodeType&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(3==t.nodeType?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(Ms(t,i.node,i.offset)?e:0))}}function Ms(t,e,i){for(;;){if(!e||i<ce(e))return!1;if(e==t)return!0;i=le(e)+1,e=e.parentNode}}function js(t){return 1==t.nodeType&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}class Ds{constructor(t,e){this.node=t,this.offset=e,this.pos=-1}}class Es{constructor(t,e,i,n){this.typeOver=n,this.bounds=null,this.text="";let{impreciseHead:s,impreciseAnchor:r}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let e=s||r?[]:function(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=t.observer.selectionRange;i&&(e.push(new Ds(i,n)),s==i&&r==n||e.push(new Ds(s,r)));return e}(t),i=new Ws(e,t.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(t,e){if(0==t.length)return null;let i=t[0].pos,n=2==t.length?t[1].pos:i;return i>-1&&n>-1?X.single(i+e,n+e):null}(e,this.bounds.from)}else{let e=t.observer.selectionRange,i=s&&s.node==e.focusNode&&s.offset==e.focusOffset||!se(t.contentDOM,e.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(e.focusNode,e.focusOffset),n=r&&r.node==e.anchorNode&&r.offset==e.anchorOffset||!se(t.contentDOM,e.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(e.anchorNode,e.anchorOffset),o=t.viewport;if(qe.ios&&t.state.selection.main.empty&&i!=n&&(o.from>0||o.to<t.state.doc.length)){let e=o.from-Math.min(i,n),s=o.to-Math.max(i,n);0!=e&&1!=e||0!=s&&-1!=s||(i=0,n=t.state.doc.length)}this.newSel=X.single(n,i)}}}function qs(e,i){let n,{newSel:s}=i,r=e.state.selection.main,o=e.inputState.lastKeyTime>Date.now()-100?e.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:a}=i.bounds,l=r.from,h=null;(8===o||qe.android&&i.text.length<a-s)&&(l=r.to,h="end");let c=function(t,e,i,n){let s=Math.min(t.length,e.length),r=0;for(;r<s&&t.charCodeAt(r)==e.charCodeAt(r);)r++;if(r==s&&t.length==e.length)return null;let o=t.length,a=e.length;for(;o>0&&a>0&&t.charCodeAt(o-1)==e.charCodeAt(a-1);)o--,a--;if("end"==n){i-=o+Math.max(0,r-Math.min(o,a))-r}if(o<r&&t.length<e.length){r-=i<=r&&i>=o?r-i:0,a=r+(a-o),o=r}else if(a<r){r-=i<=r&&i>=a?r-i:0,o=r+(o-a),a=r}return{from:r,toA:o,toB:a}}(e.state.doc.sliceString(s,a,Ys),i.text,l-s,h);c&&(qe.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==Ys+Ys&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:t.of(i.text.slice(c.from,c.toB).split(Ys))})}else s&&(!e.hasFocus&&e.state.facet(zi)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,n.from).append(n.insert).append(e.state.doc.slice(n.to,r.to))}:(qe.mac||qe.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==e.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=X.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}):qe.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&e.lineWrapping&&(s&&(s=X.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}),n){if(qe.ios&&e.inputState.flushIOSKey())return!0;if(qe.android&&(n.from==r.from&&n.to==r.to&&1==n.insert.length&&2==n.insert.lines&&ve(e.contentDOM,"Enter",13)||(n.from==r.from-1&&n.to==r.to&&0==n.insert.length||8==o&&n.insert.length<n.to-n.from&&n.to>r.head)&&ve(e.contentDOM,"Backspace",8)||n.from==r.from&&n.to==r.to+1&&0==n.insert.length&&ve(e.contentDOM,"Delete",46)))return!0;let t,i=n.insert.toString();e.inputState.composing>=0&&e.inputState.composing++;let a=()=>t||(t=function(t,e,i){let n,s=t.state,r=s.selection.main;if(e.from>=r.from&&e.to<=r.to&&e.to-e.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let i=r.from<e.from?s.sliceDoc(r.from,e.from):"",o=r.to>e.to?s.sliceDoc(e.to,r.to):"";n=s.replaceSelection(t.state.toText(i+e.insert.sliceString(0,void 0,t.state.lineBreak)+o))}else{let o=s.changes(e),a=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&t.inputState.composing>=0&&e.to<=r.to&&e.to>=r.to-10){let l,h=t.state.sliceDoc(e.from,e.to),c=i&&cn(t,i.main.head);if(c){let t=e.insert.length-(e.to-e.from);l={from:c.from,to:c.to-t}}else l=t.state.doc.lineAt(r.head);let f=r.to-e.to,u=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:a||i.map(o)};let n=i.to-f,c=n-h.length;if(i.to-i.from!=u||t.state.sliceDoc(c,n)!=h||i.to>=l.from&&i.from<=l.to)return{range:i};let d=s.changes({from:c,to:n,insert:e.insert}),p=i.to-r.to;return{changes:d,range:a?X.range(Math.max(0,a.anchor+p),Math.max(0,a.head+p)):i.map(d)}}))}else n={changes:o,selection:a&&s.selection.replaceRange(a)}}let o="input.type";(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,o+=".compose",t.inputState.compositionFirstChange&&(o+=".start",t.inputState.compositionFirstChange=!1));return s.update(n,{userEvent:o,scrollIntoView:!0})}(e,n,s));return e.state.facet(ji).some((t=>t(e,n.from,n.to,i,a)))||e.dispatch(a()),!0}if(s&&!s.main.eq(r)){let t=!1,i="select";return e.inputState.lastSelectionTime>Date.now()-50&&("select"==e.inputState.lastSelectionOrigin&&(t=!0),i=e.inputState.lastSelectionOrigin),e.dispatch({selection:s,scrollIntoView:t,userEvent:i}),!0}return!1}const _s={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Vs=qe.ie&&qe.ie_version<=11;class Is{constructor(t){this.view=t,this.active=!1,this.selectionRange=new pe,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver((e=>{for(let t of e)this.queue.push(t);(qe.ie&&qe.ie_version<=11||qe.ios&&t.composing)&&e.some((t=>"childList"==t.type&&t.removedNodes.length||"characterData"==t.type&&t.oldValue.length>t.target.nodeValue.length))?this.flushSoon():this.flush()})),Vs&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var t;(null===(t=this.view.docView)||void 0===t?void 0:t.lastUpdate)<Date.now()-75&&this.onResize()})),this.resizeScroll.observe(t.scrollDOM)),this.addWindowListeners(this.win=t.win),this.start(),"function"==typeof IntersectionObserver&&(this.intersection=new IntersectionObserver((t=>{this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500)}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some(((e,i)=>e!=t[i])))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(zi)?i.root.activeElement!=this.dom:!re(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(t)?e||(this.selectionChanged=!1):(qe.ie&&qe.ie_version<=11||qe.android&&qe.chrome)&&!i.state.selection.main.empty&&n.focusNode&&ae(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=qe.safari&&11==t.root.nodeType&&function(t){let e=t.activeElement;for(;e&&e.shadowRoot;)e=e.shadowRoot.activeElement;return e}(this.dom.ownerDocument)==this.dom&&function(t){let e=null;function i(t){t.preventDefault(),t.stopImmediatePropagation(),e=t.getTargetRanges()[0]}if(t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),!e)return null;let n=e.startContainer,s=e.startOffset,r=e.endContainer,o=e.endOffset,a=t.docView.domAtPos(t.state.selection.main.anchor);ae(a.node,a.offset,r,o)&&([n,s,r,o]=[r,o,n,s]);return{anchorNode:n,anchorOffset:s,focusNode:r,focusOffset:o}}(this.view)||ne(t.root);if(!e||this.selectionRange.eq(e))return!1;let i=re(this.dom,e);return i&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime<Date.now()-300&&function(t,e){let i=e.focusNode,n=e.focusOffset;if(!i||e.anchorNode!=i||e.anchorOffset!=n)return!1;for(n=Math.min(n,ce(i));;)if(n){if(1!=i.nodeType)return!1;let t=i.childNodes[n-1];"false"==t.contentEditable?n--:(i=t,n=ce(i))}else{if(i==t)return!0;n=le(i),i=i.parentNode}}(this.dom,e)?(this.view.inputState.lastFocusTime=0,t.docView.updateSelection(),!1):(this.selectionRange.setRange(e),i&&(this.selectionChanged=!0),!0)}setSelectionRange(t,e){this.selectionRange.set(t.node,t.offset,e.node,e.offset),this.selectionChanged=!1}clearSelectionRange(){this.selectionRange.set(null,0,null,0)}listenForScroll(){this.parentCheck=-1;let t=0,e=null;for(let i=this.dom;i;)if(1==i.nodeType)!e&&t<this.scrollTargets.length&&this.scrollTargets[t]==i?t++:e||(e=this.scrollTargets.slice(0,t)),e&&e.push(i),i=i.assignedSlot||i.parentNode;else{if(11!=i.nodeType)break;i=i.host}if(t<this.scrollTargets.length&&!e&&(e=this.scrollTargets.slice(0,t)),e){for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);for(let t of this.scrollTargets=e)t.addEventListener("scroll",this.onScroll)}}ignore(t){if(!this.active)return t();try{return this.stop(),t()}finally{this.start(),this.clear()}}start(){this.active||(this.observer.observe(this.dom,_s),Vs&&this.dom.addEventListener("DOMCharacterDataModified",this.onCharData),this.active=!0)}stop(){this.active&&(this.active=!1,this.observer.disconnect(),Vs&&this.dom.removeEventListener("DOMCharacterDataModified",this.onCharData))}clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}delayAndroidKey(t,e){var i;if(!this.delayedAndroidKey){let t=()=>{let t=this.delayedAndroidKey;if(t){this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=t.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&t.force&&ve(this.dom,t.key,t.keyCode)}};this.flushingAndroidKey=this.view.win.requestAnimationFrame(t)}this.delayedAndroidKey&&"Enter"!=t||(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange<Date.now()-50||!!(null===(i=this.delayedAndroidKey)||void 0===i?void 0:i.force)})}clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndroidKey),this.delayedAndroidKey=null,this.flushingAndroidKey=-1}flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.requestAnimationFrame((()=>{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let s of t){let t=this.readMutation(s);t&&(t.typeOver&&(n=!0),-1==e?({from:e,to:i}=t):(e=Math.min(t.from,e),i=Math.max(t.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&re(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new Es(this.view,t,e,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=qs(this.view,e);return this.view.state==i&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty("attributes"==t.type),"attributes"==t.type&&(e.flags|=4),"childList"==t.type){let i=zs(e,t.previousSibling||t.target.previousSibling,-1),n=zs(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}return"characterData"==t.type?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var t,e,i;this.stop(),null===(t=this.intersection)||void 0===t||t.disconnect(),null===(e=this.gapIntersection)||void 0===e||e.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}}function zs(t,e,i){for(;e;){let n=ke.get(e);if(n&&n.parent==t)return n;let s=e.parentNode;e=s!=t.dom?s:i>0?e.nextSibling:e.previousSibling}return null}class Bs{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:e}=t;this.dispatchTransactions=t.dispatchTransactions||e&&(t=>t.forEach((t=>e(t,this))))||(t=>this.update(t)),this.dispatch=this.dispatch.bind(this),this._root=t.root||function(t){for(;t;){if(t&&(9==t.nodeType||11==t.nodeType&&t.host))return t;t=t.assignedSlot||t.parentNode}return null}(t.parent)||document,this.viewState=new ws(t.state||kt.create(t)),t.scrollTo&&t.scrollTo.is(Vi)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Gi).map((t=>new Ni(t)));for(let t of this.plugins)t.update(this);this.observer=new Is(this),this.inputState=new $n(this),this.inputState.ensureHandlers(this.plugins),this.docView=new ln(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure()}dispatch(...t){let e=1==t.length&&t[0]instanceof dt?t:1==t.length&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e,i=!1,n=!1,s=this.state;for(let e of t){if(e.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=e.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,a=null;t.some((t=>t.annotation(Hn)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,a=Fn(s,r),a||(o=1));let l=this.observer.delayedAndroidKey,h=null;if(l?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(kt.phrases)!=this.state.facet(kt.phrases))return this.setState(s);e=an.create(this,s,t),e.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let e of t){if(c&&(c=c.map(e.changes)),e.scrollIntoView){let{main:t}=e.state.selection;c=new _i(t.empty?t:X.cursor(t.head,t.head>t.anchor?-1:1))}for(let t of e.effects)t.is(Vi)&&(c=t.value.clip(this.state))}this.viewState.update(e,c),this.bidiCache=Ns.update(this.bidiCache,e.changes),e.empty||(this.updatePlugins(e),this.inputState.update(e)),i=this.docView.update(e),this.state.facet(rn)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(i,t.some((t=>t.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(e.startState.facet($s)!=e.state.facet($s)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!e.empty)for(let t of this.state.facet(Mi))try{t(e)}catch(t){Ii(this.state,t,"update listener")}(a||h)&&Promise.resolve().then((()=>{a&&this.state==a.startState&&this.dispatch(a),h&&!qs(this,h)&&l.force&&ve(this.contentDOM,l.key,l.keyCode)}))}setState(t){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=t);this.updateState=2;let e=this.hasFocus;try{for(let t of this.plugins)t.destroy(this);this.viewState=new ws(t),this.plugins=t.facet(Gi).map((t=>new Ni(t))),this.pluginMap.clear();for(let t of this.plugins)t.update(this);this.docView.destroy(),this.docView=new ln(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Gi),i=t.state.facet(Gi);if(e!=i){let n=[];for(let s of i){let i=e.indexOf(s);if(i<0)n.push(new Ni(s));else{let e=this.plugins[i];e.mustUpdate=t,n.push(e)}}for(let e of this.plugins)e.mustUpdate!=t&&e.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let e of this.plugins)e.mustUpdate=t;for(let t=0;t<this.plugins.length;t++)this.plugins[t].update(this);e!=i&&this.inputState.ensureHandlers(this.plugins)}measure(t=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let t=0;;t++){if(r<0)if(ye(i))s=-1,r=this.viewState.heightMap.height;else{let t=this.viewState.scrollAnchorAt(n);s=t.from,r=t.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(t>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let a=[];4&o||([this.measureRequests,a]=[a,this.measureRequests]);let l=a.map((t=>{try{return t.read(this)}catch(t){return Ii(this.state,t),Ls}})),h=an.create(this,this.state,[]),c=!1;h.flags|=o,e?e.flags|=o:e=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h));for(let t=0;t<a.length;t++)if(l[t]!=Ls)try{let e=a[t];e.write&&e.write(l[t],this)}catch(t){Ii(this.state,t)}if(c&&this.docView.updateSelection(!0),!h.viewportChanged&&0==this.measureRequests.length){if(this.viewState.editorHeight){if(this.viewState.scrollTarget){this.docView.scrollIntoView(this.viewState.scrollTarget),this.viewState.scrollTarget=null,r=-1;continue}{let t=(s<0?this.viewState.heightMap.height:this.viewState.lineBlockAt(s).top)-r;if(t>1||t<-1){n+=t,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let t of this.state.facet(Mi))t(e)}get themeClasses(){return Zs+" "+(this.state.facet(Ps)?Ts:Cs)+" "+this.state.facet($s)}updateAttrs(){let t=Us(this,Ui,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(zi)?"true":"false",class:"cm-content",style:`${qe.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),Us(this,Hi,e);let i=this.observer.ignore((()=>{let i=Fe(this.contentDOM,this.contentAttrs,e),n=Fe(this.dom,this.editorAttrs,t);return i||n}));return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let t of i.effects)if(t.is(Bs.announce)){e&&(this.announceDOM.textContent=""),e=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=t.value}}mountStyles(){this.styleModules=this.state.facet(rn);let t=this.state.facet(Bs.cspNonce);Nt.mount(this.root,this.styleModules.concat(Xs).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),t){if(this.measureRequests.indexOf(t)>-1)return;if(null!=t.key)for(let e=0;e<this.measureRequests.length;e++)if(this.measureRequests[e].key===t.key)return void(this.measureRequests[e]=t);this.measureRequests.push(t)}}plugin(t){let e=this.pluginMap.get(t);return(void 0===e||e&&e.spec!=t)&&this.pluginMap.set(t,e=this.plugins.find((e=>e.spec==t))||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return Qn(this,t,xn(this,t,e,i))}moveByGroup(t,e){return Qn(this,t,xn(this,t,e,(e=>function(t,e,i){let n=t.state.charCategorizer(e),s=n(i);return t=>{let e=n(t);return s==bt.Space&&(s=e),s==e}}(this,t.head,e))))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),s=i[e?i.length-1:0];return X.cursor(s.side(e,n)+t.from,s.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return function(t,e,i,n){let s=Sn(t,e.head),r=n&&s.type==ii.Text&&(t.lineWrapping||s.widgetLineBreaks)?t.coordsAtPos(e.assoc<0&&e.head>s.from?e.head-1:e.head):null;if(r){let e=t.dom.getBoundingClientRect(),n=t.textDirectionAt(s.from),o=t.posAtCoords({x:i==(n==ui.LTR)?e.right-1:e.left+1,y:(r.top+r.bottom)/2});if(null!=o)return X.cursor(o,i?-1:1)}return X.cursor(i?s.to:s.from,i?-1:1)}(this,t,e,i)}moveVertically(t,e,i){return Qn(this,t,function(t,e,i,n){let s=e.head,r=i?1:-1;if(s==(i?t.state.doc.length:0))return X.cursor(s,e.assoc);let o,a=e.goalColumn,l=t.contentDOM.getBoundingClientRect(),h=t.coordsAtPos(s,e.assoc||-1),c=t.documentTop;if(h)null==a&&(a=h.left-l.left),o=r<0?h.top:h.bottom;else{let e=t.viewState.lineBlockAt(s);null==a&&(a=Math.min(l.right-l.left,t.defaultCharacterWidth*(s-e.from))),o=(r<0?e.top:e.bottom)+c}let f=l.left+a,u=null!=n?n:t.viewState.heightOracle.textHeight>>1;for(let e=0;;e+=10){let i=o+(u+e)*r,n=bn(t,{x:f,y:i},!1,r);if(i<l.top||i>l.bottom||(r<0?n<s:n>s)){let e=t.docView.coordsForChar(n),s=!e||i<e.top?-1:1;return X.cursor(n,s,void 0,a)}}}(this,t,e,i))}domAtPos(t){return this.docView.domAtPos(t)}posAtDOM(t,e=0){return this.docView.posFromDOM(t,e)}posAtCoords(t,e=!0){return this.readMeasured(),bn(this,t,e)}coordsAtPos(t,e=1){this.readMeasured();let i=this.docView.coordsAt(t,e);if(!i||i.left==i.right)return i;let n=this.state.doc.lineAt(t),s=this.bidiSpans(n);return fe(i,s[Si.find(s,t-n.from,-1,e)].dir==ui.LTR==e>0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(Ei)||t<this.viewport.from||t>this.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Gs)return Zi(t.length);let e,i=this.textDirectionAt(t.from);for(let n of this.bidiCache)if(n.from==t.from&&n.dir==i&&(n.fresh||xi(n.isolates,e=en(this,t))))return n.order;e||(e=en(this,t));let n=Pi(t.text,i,e);return this.bidiCache.push(new Ns(t.from,t.to,i,e,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||qe.safari&&(null===(t=this.inputState)||void 0===t?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{me(this.contentDOM),this.docView.updateSelection()}))}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((9==t.nodeType?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Vi.of(new _i("number"==typeof t?X.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Vi.of(new _i(X.cursor(i.from),"start","start",i.top-t,e,!0))}static domEventHandlers(t){return Li.define((()=>({})),{eventHandlers:t})}static domEventObservers(t){return Li.define((()=>({})),{eventObservers:t})}static theme(t,e){let i=Nt.newName(),n=[$s.of(i),rn.of(Rs(`.${i}`,t))];return e&&e.dark&&n.push(Ps.of(!0)),n}static baseTheme(t){return U.lowest(rn.of(Rs("."+Zs,t,As)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&ke.get(i)||ke.get(t);return(null===(e=null==n?void 0:n.rootView)||void 0===e?void 0:e.view)||null}}Bs.styleModule=rn,Bs.inputHandler=ji,Bs.focusChangeEffect=Di,Bs.perLineTextDirection=Ei,Bs.exceptionSink=Wi,Bs.updateListener=Mi,Bs.editable=zi,Bs.mouseSelectionStyle=Yi,Bs.dragMovesSelection=Xi,Bs.clickAddsSelectionRange=Ri,Bs.decorations=Fi,Bs.outerDecorations=Ji,Bs.atomicRanges=Ki,Bs.bidiIsolatedRanges=tn,Bs.scrollMargins=nn,Bs.darkTheme=Ps,Bs.cspNonce=M.define({combine:t=>t.length?t[0]:""}),Bs.contentAttributes=Hi,Bs.editorAttributes=Ui,Bs.lineWrapping=Bs.contentAttributes.of({class:"cm-lineWrapping"}),Bs.announce=ut.define();const Gs=4096,Ls={};class Ns{constructor(t,e,i,n,s,r){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(t,e){if(e.empty&&!t.some((t=>t.fresh)))return t;let i=[],n=t.length?t[t.length-1].dir:ui.LTR;for(let s=Math.max(0,t.length-10);s<t.length;s++){let r=t[s];r.dir!=n||e.touchesRange(r.from,r.to)||i.push(new Ns(e.mapPos(r.from,1),e.mapPos(r.to,-1),r.dir,r.isolates,!1,r.order))}return i}}function Us(t,e,i){for(let n=t.state.facet(e),s=n.length-1;s>=0;s--){let e=n[s],r="function"==typeof e?e(t):e;r&&Ne(r,i)}return i}const Hs=qe.mac?"mac":qe.windows?"win":qe.linux?"linux":"key";function Fs(t,e,i){return e.altKey&&(t="Alt-"+t),e.ctrlKey&&(t="Ctrl-"+t),e.metaKey&&(t="Meta-"+t),!1!==i&&e.shiftKey&&(t="Shift-"+t),t}const Js=U.default(Bs.domEventHandlers({keydown:(t,e)=>rr(er(e.state),t,e,"editor")})),Ks=M.define({enables:Js}),tr=new WeakMap;function er(t){let e=t.facet(Ks),i=tr.get(e);return i||tr.set(e,i=function(t,e=Hs){let i=Object.create(null),n=Object.create(null),s=(t,e)=>{let i=n[t];if(null==i)n[t]=e;else if(i!=e)throw new Error("Key binding "+t+" is used both as a regular binding and as a multi-stroke prefix")},r=(t,n,r,o,a)=>{var l,h;let c=i[t]||(i[t]=Object.create(null)),f=n.split(/ (?!$)/).map((t=>function(t,e){const i=t.split(/-(?!$)/);let n,s,r,o,a=i[i.length-1];"Space"==a&&(a=" ");for(let t=0;t<i.length-1;++t){const a=i[t];if(/^(cmd|meta|m)$/i.test(a))o=!0;else if(/^a(lt)?$/i.test(a))n=!0;else if(/^(c|ctrl|control)$/i.test(a))s=!0;else if(/^s(hift)?$/i.test(a))r=!0;else{if(!/^mod$/i.test(a))throw new Error("Unrecognized modifier name: "+a);"mac"==e?o=!0:s=!0}}return n&&(a="Alt-"+a),s&&(a="Ctrl-"+a),o&&(a="Meta-"+a),r&&(a="Shift-"+a),a}(t,e)));for(let e=1;e<f.length;e++){let i=f.slice(0,e).join(" ");s(i,!0),c[i]||(c[i]={preventDefault:!0,stopPropagation:!1,run:[e=>{let n=nr={view:e,prefix:i,scope:t};return setTimeout((()=>{nr==n&&(nr=null)}),sr),!0}]})}let u=f.join(" ");s(u,!1);let d=c[u]||(c[u]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(l=c._any)||void 0===l?void 0:l.run)||void 0===h?void 0:h.slice())||[]});r&&d.run.push(r),o&&(d.preventDefault=!0),a&&(d.stopPropagation=!0)};for(let n of t){let t=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let e of t){let t=i[e]||(i[e]=Object.create(null));t._any||(t._any={preventDefault:!1,stopPropagation:!1,run:[]});for(let e in t)t[e].run.push(n.any)}let s=n[e]||n.key;if(s)for(let e of t)r(e,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(e,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(e.reduce(((t,e)=>t.concat(e)),[]))),i}function ir(t,e,i){return rr(er(t.state),e,t,i)}let nr=null;const sr=4e3;function rr(t,e,i,n){let s=function(t){var e=!(Kt&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||te&&t.shiftKey&&t.key&&1==t.key.length||"Unidentified"==t.key)&&t.key||(t.shiftKey?Jt:Ft)[t.keyCode]||t.key||"Unidentified";return"Esc"==e&&(e="Escape"),"Del"==e&&(e="Delete"),"Left"==e&&(e="ArrowLeft"),"Up"==e&&(e="ArrowUp"),"Right"==e&&(e="ArrowRight"),"Down"==e&&(e="ArrowDown"),e}(e),r=y(v(s,0))==s.length&&" "!=s,o="",a=!1,l=!1,h=!1;nr&&nr.view==i&&nr.scope==n&&(o=nr.prefix+" ",An.indexOf(e.keyCode)<0&&(l=!0,nr=null));let c,f,u=new Set,d=t=>{if(t){for(let n of t.run)if(!u.has(n)&&(u.add(n),n(i,e)))return t.stopPropagation&&(h=!0),!0;t.preventDefault&&(t.stopPropagation&&(h=!0),l=!0)}return!1},p=t[n];return p&&(d(p[o+Fs(s,e,!r)])?a=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(qe.windows&&e.ctrlKey&&e.altKey)&&(c=Ft[e.keyCode])&&c!=s?(d(p[o+Fs(c,e,!0)])||e.shiftKey&&(f=Jt[e.keyCode])!=s&&f!=c&&d(p[o+Fs(f,e,!1)]))&&(a=!0):r&&e.shiftKey&&d(p[o+Fs(s,e,!0)])&&(a=!0),!a&&d(p._any)&&(a=!0)),l&&(a=!0),a&&h&&e.stopPropagation(),a}class or{constructor(t,e,i,n,s){this.className=t,this.left=e,this.top=i,this.width=n,this.height=s}draw(){let t=document.createElement("div");return t.className=this.className,this.adjust(t),t}update(t,e){return e.className==this.className&&(this.adjust(t),!0)}adjust(t){t.style.left=this.left+"px",t.style.top=this.top+"px",null!=this.width&&(t.style.width=this.width+"px"),t.style.height=this.height+"px"}eq(t){return this.left==t.left&&this.top==t.top&&this.width==t.width&&this.height==t.height&&this.className==t.className}static forRange(t,e,i){if(i.empty){let n=t.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=ar(t);return[new or(e,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(t,e,i){if(i.to<=t.viewport.from||i.from>=t.viewport.to)return[];let n=Math.max(i.from,t.viewport.from),s=Math.min(i.to,t.viewport.to),r=t.textDirection==ui.LTR,o=t.contentDOM,a=o.getBoundingClientRect(),l=ar(t),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),f=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),u=a.right-(c?parseInt(c.paddingRight):0),d=Sn(t,n),p=Sn(t,s),O=d.type==ii.Text?d:null,g=p.type==ii.Text?p:null;O&&(t.lineWrapping||d.widgetLineBreaks)&&(O=lr(t,n,O));g&&(t.lineWrapping||p.widgetLineBreaks)&&(g=lr(t,s,g));if(O&&g&&O.from==g.from)return w(v(i.from,i.to,O));{let e=O?v(i.from,null,O):b(d,!1),n=g?v(null,i.to,g):b(p,!0),s=[];return(O||d).to<(g||p).from-(O&&g?1:0)||d.widgetLineBreaks>1&&e.bottom+t.defaultLineHeight/2<n.top?s.push(m(f,e.bottom,u,n.top)):e.bottom<n.top&&t.elementAtHeight((e.bottom+n.top)/2).type==ii.Text&&(e.bottom=n.top=(e.bottom+n.top)/2),w(e).concat(s).concat(w(n))}function m(t,i,n,s){return new or(e,t-l.left,i-l.top-.01,n-t,s-i+.01)}function w({top:t,bottom:e,horizontal:i}){let n=[];for(let s=0;s<i.length;s+=2)n.push(m(i[s],t,i[s+1],e));return n}function v(e,i,n){let s=1e9,o=-1e9,a=[];function l(e,i,l,h,c){let d=t.coordsAtPos(e,e==n.to?-2:2),p=t.coordsAtPos(l,l==n.from?2:-2);d&&p&&(s=Math.min(d.top,p.top,s),o=Math.max(d.bottom,p.bottom,o),c==ui.LTR?a.push(r&&i?f:d.left,r&&h?u:p.right):a.push(!r&&h?f:p.left,!r&&i?u:d.right))}let h=null!=e?e:n.from,c=null!=i?i:n.to;for(let n of t.visibleRanges)if(n.to>h&&n.from<c)for(let s=Math.max(n.from,h),r=Math.min(n.to,c);;){let n=t.state.doc.lineAt(s);for(let o of t.bidiSpans(n)){let t=o.from+n.from,a=o.to+n.from;if(t>=r)break;a>s&&l(Math.max(t,s),null==e&&t<=h,Math.min(a,r),null==i&&a>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==a.length&&l(h,null==e,c,null==i,t.textDirection),{top:s,bottom:o,horizontal:a}}function b(t,e){let i=a.top+(e?t.top:t.bottom);return{top:i,bottom:i,horizontal:[]}}}(t,e,i)}}function ar(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==ui.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function lr(t,e,i){let n=X.cursor(e);return{from:Math.max(i.from,t.moveToLineBoundary(n,!1,!0).from),to:Math.min(i.to,t.moveToLineBoundary(n,!0,!0).from),type:ii.Text}}class hr{constructor(t,e){this.view=t,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=t.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(t.state),t.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,t)}update(t){t.startState.facet(cr)!=t.state.facet(cr)&&this.setOrder(t.state),(this.layer.update(t,this.dom)||t.geometryChanged)&&(this.scale(),t.view.requestMeasure(this.measureReq))}setOrder(t){let e=0,i=t.facet(cr);for(;e<i.length&&i[e]!=this.layer;)e++;this.dom.style.zIndex=String((this.layer.above?150:-1)-e)}measure(){return this.layer.markers(this.view)}scale(){let{scaleX:t,scaleY:e}=this.view;t==this.scaleX&&e==this.scaleY||(this.scaleX=t,this.scaleY=e,this.dom.style.transform=`scale(${1/t}, ${1/e})`)}draw(t){if(t.length!=this.drawn.length||t.some(((t,e)=>{return i=t,n=this.drawn[e],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let e=this.dom.firstChild,i=0;for(let n of t)n.update&&e&&n.constructor&&this.drawn[i].constructor&&n.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(n.draw(),e);for(;e;){let t=e.nextSibling;e.remove(),e=t}this.drawn=t}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const cr=M.define();function fr(t){return[Li.define((e=>new hr(e,t))),cr.of(t)]}const ur=!qe.ios,dr=M.define({combine:t=>Qt(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(t,e)=>Math.min(t,e),drawRangeCursor:(t,e)=>t||e})});function pr(t={}){return[dr.of(t),gr,wr,br,qi.of(!0)]}function Or(t){return t.startState.facet(dr)!=t.state.facet(dr)}const gr=fr({above:!0,markers(t){let{state:e}=t,i=e.facet(dr),n=[];for(let s of e.selection.ranges){let r=s==e.selection.main;if(s.empty?!r||ur:i.drawRangeCursor){let e=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:X.cursor(s.head,s.head>s.anchor?-1:1);for(let s of or.forRange(t,e,i))n.push(s)}}return n},update(t,e){t.transactions.some((t=>t.selection))&&(e.style.animationName="cm-blink"==e.style.animationName?"cm-blink2":"cm-blink");let i=Or(t);return i&&mr(t.state,e),t.docChanged||t.selectionSet||i},mount(t,e){mr(e.state,t)},class:"cm-cursorLayer"});function mr(t,e){e.style.animationDuration=t.facet(dr).cursorBlinkRate+"ms"}const wr=fr({above:!1,markers:t=>t.state.selection.ranges.map((e=>e.empty?[]:or.forRange(t,"cm-selectionBackground",e))).reduce(((t,e)=>t.concat(e))),update:(t,e)=>t.docChanged||t.selectionSet||t.viewportChanged||Or(t),class:"cm-selectionLayer"}),vr={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};ur&&(vr[".cm-line"].caretColor="transparent !important",vr[".cm-content"]={caretColor:"transparent !important"});const br=U.highest(Bs.theme(vr)),yr=ut.define({map:(t,e)=>null==t?null:e.mapPos(t)}),Sr=I.define({create:()=>null,update:(t,e)=>(null!=t&&(t=e.changes.mapPos(t)),e.effects.reduce(((t,e)=>e.is(yr)?e.value:t),t))}),xr=Li.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let i=t.state.field(Sr);null==i?null!=this.cursor&&(null===(e=this.cursor)||void 0===e||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(Sr)!=i||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(Sr),i=null!=e&&t.coordsAtPos(e);if(!i)return null;let n=t.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+t.scrollDOM.scrollLeft*t.scaleX,top:i.top-n.top+t.scrollDOM.scrollTop*t.scaleY,height:i.bottom-i.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:i}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/i+"px",this.cursor.style.height=t.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(Sr)!=t&&this.view.dispatch({effects:yr.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){t.target!=this.view.contentDOM&&this.view.contentDOM.contains(t.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function kr(){return[Sr,xr]}function Qr(t,e,i,n,s){e.lastIndex=0;for(let r,o=t.iterRange(i,n),a=i;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)s(a+r.index,r)}class $r{constructor(t){const{regexp:e,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=t;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,n)this.addMatch=(t,e,i,s)=>n(s,i,i+t[0].length,t,e);else if("function"==typeof i)this.addMatch=(t,e,n,s)=>{let r=i(t,e,n);r&&s(n,n+t[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(t,e,n,s)=>s(n,n+t[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(t){let e=new At,i=e.add.bind(e);for(let{from:e,to:n}of function(t,e){let i=t.visibleRanges;if(1==i.length&&i[0].from==t.viewport.from&&i[0].to==t.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(t.state.doc.lineAt(s).from,s-e),r=Math.min(t.state.doc.lineAt(r).to,r+e),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(t,this.maxLength))Qr(t.state.doc,this.regexp,e,n,((e,n)=>this.addMatch(n,t,e,i)));return e.finish()}updateDeco(t,e){let i=1e9,n=-1;return t.docChanged&&t.changes.iterChanges(((e,s,r,o)=>{o>t.view.viewport.from&&r<t.view.viewport.to&&(i=Math.min(r,i),n=Math.max(o,n))})),t.viewportChanged||n-i>1e3?this.createDeco(t.view):n>-1?this.updateRange(t.view,e.map(t.changes),i,n):e}updateRange(t,e,i,n){for(let s of t.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=t.state.doc.lineAt(r),n=i.to<o?t.state.doc.lineAt(o):i,a=Math.max(s.from,i.from),l=Math.min(s.to,n.to);if(this.boundary){for(;r>i.from;r--)if(this.boundary.test(i.text[r-1-i.from])){a=r;break}for(;o<n.to;o++)if(this.boundary.test(n.text[o-n.from])){l=o;break}}let h,c=[],f=(t,e,i)=>c.push(i.range(t,e));if(i==n)for(this.regexp.lastIndex=a-i.from;(h=this.regexp.exec(i.text))&&h.index<l-i.from;)this.addMatch(h,t,h.index+i.from,f);else Qr(t.state.doc,this.regexp,a,l,((e,i)=>this.addMatch(i,t,e,f)));e=e.update({filterFrom:a,filterTo:l,filter:(t,e)=>t<a||e>l,add:c})}}return e}}const Pr=null!=/x/.unicode?"gu":"g",Zr=new RegExp("[\0-\b\n--\u2028\u2029\ufeff-]",Pr),Cr={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let Tr=null;const Ar=M.define({combine(t){let e=Qt(t,{render:null,specialChars:Zr,addSpecialChars:null});return(e.replaceTabs=!function(){var t;if(null==Tr&&"undefined"!=typeof document&&document.body){let e=document.body.style;Tr=null!=(null!==(t=e.tabSize)&&void 0!==t?t:e.MozTabSize)}return Tr||!1}())&&(e.specialChars=new RegExp("\t|"+e.specialChars.source,Pr)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Pr)),e}});function Rr(t={}){return[Ar.of(t),Xr||(Xr=Li.fromClass(class{constructor(t){this.view=t,this.decorations=ni.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Ar)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new $r({regexp:t.specialChars,decoration:(e,i,n)=>{let{doc:s}=i.state,r=v(e[0],0);if(9==r){let t=s.lineAt(n),e=i.state.tabSize,r=Vt(t.text,e,n-t.from);return ni.replace({widget:new Wr((e-r%e)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=ni.replace({widget:new Yr(t,r)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Ar);t.startState.facet(Ar)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))]}let Xr=null;class Yr extends ei{constructor(t,e){super(),this.options=t,this.code=e}eq(t){return t.code==this.code}toDOM(t){let e=function(t){return t>=32?"•":10==t?"":String.fromCharCode(9216+t)}(this.code),i=t.state.phrase("Control character")+" "+(Cr[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,e);if(n)return n;let s=document.createElement("span");return s.textContent=e,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class Wr extends ei{constructor(t){super(),this.width=t}eq(t){return t.width==this.width}toDOM(){let t=document.createElement("span");return t.textContent="\t",t.className="cm-tab",t.style.width=this.width+"px",t}ignoreEvent(){return!1}}const Mr=Li.fromClass(class{constructor(){this.height=1e3,this.attrs={style:"padding-bottom: 1000px"}}update(t){let{view:e}=t,i=e.viewState.editorHeight*e.scaleY-e.defaultLineHeight-e.documentPadding.top-.5;i>=0&&i!=this.height&&(this.height=i,this.attrs={style:`padding-bottom: ${i}px`})}});function jr(){return Er}const Dr=ni.line({class:"cm-activeLine"}),Er=Li.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,i=[];for(let n of t.state.selection.ranges){let s=t.lineBlockAt(n.head);s.from>e&&(i.push(Dr.range(s.from)),e=s.from)}return ni.set(i)}},{decorations:t=>t.decorations});class qr extends ei{constructor(t){super(),this.content=t}toDOM(){let t=document.createElement("span");return t.className="cm-placeholder",t.style.pointerEvents="none",t.appendChild("string"==typeof this.content?document.createTextNode(this.content):this.content),"string"==typeof this.content?t.setAttribute("aria-label","placeholder "+this.content):t.setAttribute("aria-hidden","true"),t}coordsAt(t){let e=t.firstChild?oe(t.firstChild):[];if(!e.length)return null;let i=window.getComputedStyle(t.parentNode),n=fe(e[0],"rtl"!=i.direction),s=parseInt(i.lineHeight);return n.bottom-n.top>1.5*s?{left:n.left,right:n.right,top:n.top,bottom:n.top+s}:n}ignoreEvent(){return!1}}const _r=2e3;function Vr(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1),n=t.state.doc.lineAt(i),s=i-n.from,r=s>_r?-1:s==n.length?function(t,e){let i=t.coordsAtPos(t.viewport.from);return i?Math.round(Math.abs((i.left-e)/t.defaultCharacterWidth)):-1}(t,e.clientX):Vt(n.text,t.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function Ir(t,e){let i=Vr(t,e),n=t.state.selection;return i?{update(t){if(t.docChanged){let e=t.changes.mapPos(t.startState.doc.line(i.line).from),s=t.state.doc.lineAt(e);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(t.changes)}},get(e,s,r){let o=Vr(t,e);if(!o)return n;let a=function(t,e,i){let n=Math.min(e.line,i.line),s=Math.max(e.line,i.line),r=[];if(e.off>_r||i.off>_r||e.col<0||i.col<0){let o=Math.min(e.off,i.off),a=Math.max(e.off,i.off);for(let e=n;e<=s;e++){let i=t.doc.line(e);i.length<=a&&r.push(X.range(i.from+o,i.to+a))}}else{let o=Math.min(e.col,i.col),a=Math.max(e.col,i.col);for(let e=n;e<=s;e++){let i=t.doc.line(e),n=It(i.text,o,t.tabSize,!0);if(n<0)r.push(X.cursor(i.to));else{let e=It(i.text,a,t.tabSize);r.push(X.range(i.from+n,i.from+e))}}}return r}(t.state,i,o);return a.length?r?X.create(a.concat(n.ranges)):X.create(a):n}}:null}function zr(t){let e=(null==t?void 0:t.eventFilter)||(t=>t.altKey&&0==t.button);return Bs.mouseSelectionStyle.of(((t,i)=>e(i)?Ir(t,i):null))}const Br={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},Gr={style:"cursor: crosshair"};function Lr(t={}){let[e,i]=Br[t.key||"Alt"],n=Li.fromClass(class{constructor(t){this.view=t,this.isDown=!1}set(t){this.isDown!=t&&(this.isDown=t,this.view.update([]))}},{eventObservers:{keydown(t){this.set(t.keyCode==e||i(t))},keyup(t){t.keyCode!=e&&i(t)||this.set(!1)},mousemove(t){this.set(i(t))}}});return[n,Bs.contentAttributes.of((t=>{var e;return(null===(e=t.plugin(n))||void 0===e?void 0:e.isDown)?Gr:null}))]}const Nr="-10000px";class Ur{constructor(t,e,i,n){this.facet=e,this.createTooltipView=i,this.removeTooltipView=n,this.input=t.state.facet(e),this.tooltips=this.input.filter((t=>t)),this.tooltipViews=this.tooltips.map(i)}update(t,e){var i;let n=t.state.facet(this.facet),s=n.filter((t=>t));if(n===this.input){for(let e of this.tooltipViews)e.update&&e.update(t);return!1}let r=[],o=e?[]:null;for(let i=0;i<s.length;i++){let n=s[i],a=-1;if(n){for(let t=0;t<this.tooltips.length;t++){let e=this.tooltips[t];e&&e.create==n.create&&(a=t)}if(a<0)r[i]=this.createTooltipView(n),o&&(o[i]=!!n.above);else{let n=r[i]=this.tooltipViews[a];o&&(o[i]=e[a]),n.update&&n.update(t)}}}for(let t of this.tooltipViews)r.indexOf(t)<0&&(this.removeTooltipView(t),null===(i=t.destroy)||void 0===i||i.call(t));return e&&(o.forEach(((t,i)=>e[i]=t)),e.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Hr(t){let{win:e}=t;return{top:0,left:0,bottom:e.innerHeight,right:e.innerWidth}}const Fr=M.define({combine:t=>{var e,i,n;return{position:qe.ios?"absolute":(null===(e=t.find((t=>t.position)))||void 0===e?void 0:e.position)||"fixed",parent:(null===(i=t.find((t=>t.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=t.find((t=>t.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Hr}}}),Jr=new WeakMap,Kr=Li.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(Fr);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver="function"==typeof ResizeObserver?new ResizeObserver((()=>this.measureSoon())):null,this.manager=new Ur(t,io,(t=>this.createTooltip(t)),(t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()})),this.above=this.manager.tooltips.map((t=>!!t.above)),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let i=e||t.geometryChanged,n=t.state.facet(Fr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let t of this.manager.tooltipViews)t.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let t of this.manager.tooltipViews)this.container.appendChild(t.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(t){let e=t.create(this.view);if(e.dom.classList.add("cm-tooltip"),t.arrow&&!e.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let t=document.createElement("div");t.className="cm-tooltip-arrow",e.dom.appendChild(t)}return e.dom.style.position=this.position,e.dom.style.top=Nr,e.dom.style.left="0px",this.container.appendChild(e.dom),e.mount&&e.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(e.dom),e}destroy(){var t,e,i;this.view.win.removeEventListener("resize",this.measureSoon);for(let e of this.manager.tooltipViews)e.dom.remove(),null===(t=e.destroy)||void 0===t||t.call(e);this.parent&&this.container.remove(),null===(e=this.resizeObserver)||void 0===e||e.disconnect(),null===(i=this.intersectionObserver)||void 0===i||i.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=this.view.dom.getBoundingClientRect(),e=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:t}=this.manager.tooltipViews[0];if(qe.gecko)n=t.offsetParent!=this.container.ownerDocument.body;else if(t.style.top==Nr&&"0px"==t.style.left){let e=t.getBoundingClientRect();n=Math.abs(e.top+1e4)>1||Math.abs(e.left)>1}}if(n||"absolute"==this.position)if(this.parent){let t=this.parent.getBoundingClientRect();t.width&&t.height&&(e=t.width/this.parent.offsetWidth,i=t.height/this.parent.offsetHeight)}else({scaleX:e,scaleY:i}=this.view.viewState);return{editor:t,parent:this.parent?this.container.getBoundingClientRect():t,pos:this.manager.tooltips.map(((t,e)=>{let i=this.manager.tooltipViews[e];return i.getCoords?i.getCoords(t.pos):this.view.coordsAtPos(t.pos)})),size:this.manager.tooltipViews.map((({dom:t})=>t.getBoundingClientRect())),space:this.view.state.facet(Fr).tooltipSpace(this.view),scaleX:e,scaleY:i,makeAbsolute:n}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let t of this.manager.tooltipViews)t.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=t,o=[];for(let a=0;a<this.manager.tooltips.length;a++){let l=this.manager.tooltips[a],h=this.manager.tooltipViews[a],{dom:c}=h,f=t.pos[a],u=t.size[a];if(!f||f.bottom<=Math.max(i.top,n.top)||f.top>=Math.min(i.bottom,n.bottom)||f.right<Math.max(i.left,n.left)-.1||f.left>Math.min(i.right,n.right)+.1){c.style.top=Nr;continue}let d=l.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=d?7:0,O=u.right-u.left,g=null!==(e=Jr.get(h))&&void 0!==e?e:u.bottom-u.top,m=h.offset||eo,w=this.view.textDirection==ui.LTR,v=u.width>n.right-n.left?w?n.left:n.right-u.width:w?Math.min(f.left-(d?14:0)+m.x,n.right-O):Math.max(n.left,f.left-O+(d?14:0)-m.x),b=this.above[a];!l.strictSide&&(b?f.top-(u.bottom-u.top)-m.y<n.top:f.bottom+(u.bottom-u.top)+m.y>n.bottom)&&b==n.bottom-f.bottom>f.top-n.top&&(b=this.above[a]=!b);let y=(b?f.top-n.top:n.bottom-f.bottom)-p;if(y<g&&!1!==h.resize){if(y<this.view.defaultLineHeight){c.style.top=Nr;continue}Jr.set(h,g),c.style.height=(g=y)/r+"px"}else c.style.height&&(c.style.height="");let S=b?f.top-g-p-m.y:f.bottom+p+m.y,x=v+O;if(!0!==h.overlap)for(let t of o)t.left<x&&t.right>v&&t.top<S+g&&t.bottom>S&&(S=b?t.top-g-2-p:t.bottom+p+2);if("absolute"==this.position?(c.style.top=(S-t.parent.top)/r+"px",c.style.left=(v-t.parent.left)/s+"px"):(c.style.top=S/r+"px",c.style.left=v/s+"px"),d){let t=f.left+(w?m.x:-m.x)-(v+14-7);d.style.left=t/s+"px"}!0!==h.overlap&&o.push({left:v,top:S,right:x,bottom:S+g}),c.classList.toggle("cm-tooltip-above",b),c.classList.toggle("cm-tooltip-below",!b),h.positioned&&h.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=Nr}},{eventObservers:{scroll(){this.maybeMeasure()}}}),to=Bs.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),eo={x:0,y:0},io=M.define({enables:[Kr,to]}),no=M.define();class so{static create(t){return new so(t)}constructor(t){this.view=t,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Ur(t,no,(t=>this.createHostedView(t)),(t=>t.dom.remove()))}createHostedView(t){let e=t.create(this.view);return e.dom.classList.add("cm-tooltip-section"),this.dom.appendChild(e.dom),this.mounted&&e.mount&&e.mount(this.view),e}mount(t){for(let e of this.manager.tooltipViews)e.mount&&e.mount(t);this.mounted=!0}positioned(t){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(t)}update(t){this.manager.update(t)}destroy(){var t;for(let e of this.manager.tooltipViews)null===(t=e.destroy)||void 0===t||t.call(e)}passProp(t){let e;for(let i of this.manager.tooltipViews){let n=i[t];if(void 0!==n)if(void 0===e)e=n;else if(e!==n)return}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const ro=io.compute([no],(t=>{let e=t.facet(no).filter((t=>t));return 0===e.length?null:{pos:Math.min(...e.map((t=>t.pos))),end:Math.max(...e.map((t=>{var e;return null!==(e=t.end)&&void 0!==e?e:t.pos}))),create:so.create,above:e[0].above,arrow:e.some((t=>t.arrow))}}));class oo{constructor(t,e,i,n,s){this.view=t,this.source=e,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:t.dom,time:0},this.checkHover=this.checkHover.bind(this),t.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),t.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active)return;let t=Date.now()-this.lastMove.time;t<this.hoverTime?this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime-t):this.startHover()}startHover(){clearTimeout(this.restartTimeout);let{view:t,lastMove:e}=this,i=t.docView.nearest(e.target);if(!i)return;let n,s=1;if(i instanceof Ie)n=i.posAtStart;else{if(n=t.posAtCoords(e),null==n)return;let i=t.coordsAtPos(n);if(!i||e.y<i.top||e.y>i.bottom||e.x<i.left-t.defaultCharacterWidth||e.x>i.right+t.defaultCharacterWidth)return;let r=t.bidiSpans(t.state.doc.lineAt(n)).find((t=>t.from<=n&&t.to>=n)),o=r&&r.dir==ui.RTL?-1:1;s=e.x<i.left?-o:o}let r=this.source(t,n,s);if(null==r?void 0:r.then){let e=this.pending={pos:n};r.then((i=>{this.pending==e&&(this.pending=null,i&&t.dispatch({effects:this.setHover.of(i)}))}),(e=>Ii(t.state,e,"hover tooltip")))}else r&&t.dispatch({effects:this.setHover.of(r)})}get tooltip(){let t=this.view.plugin(Kr),e=t?t.manager.tooltips.findIndex((t=>t.create==so.create)):-1;return e>-1?t.manager.tooltipViews[e]:null}mousemove(t){var e;this.lastMove={x:t.clientX,y:t.clientY,target:t.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:i,tooltip:n}=this;if(i&&n&&!function(t,e){let i=t.getBoundingClientRect();return e.clientX>=i.left-ao&&e.clientX<=i.right+ao&&e.clientY>=i.top-ao&&e.clientY<=i.bottom+ao}(n.dom,t)||this.pending){let{pos:n}=i||this.pending,s=null!==(e=null==i?void 0:i.end)&&void 0!==e?e:n;(n==s?this.view.posAtCoords(this.lastMove)==n:function(t,e,i,n,s,r){let o=t.scrollDOM.getBoundingClientRect(),a=t.documentTop+t.documentPadding.top+t.contentHeight;if(o.left>n||o.right<n||o.top>s||Math.min(o.bottom,a)<s)return!1;let l=t.posAtCoords({x:n,y:s},!1);return l>=e&&l<=i}(this.view,n,s,t.clientX,t.clientY))||(this.view.dispatch({effects:this.setHover.of(null)}),this.pending=null)}}mouseleave(t){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e){let{tooltip:e}=this;e&&e.dom.contains(t.relatedTarget)?this.watchTooltipLeave(e.dom):this.view.dispatch({effects:this.setHover.of(null)})}}watchTooltipLeave(t){let e=i=>{t.removeEventListener("mouseleave",e),this.active&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of(null)})};t.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const ao=4;function lo(t,e={}){let i=ut.define(),n=I.define({create:()=>null,update(t,n){if(t&&(e.hideOnChange&&(n.docChanged||n.selection)||e.hideOn&&e.hideOn(n,t)))return null;if(t&&n.docChanged){let e=n.changes.mapPos(t.pos,-1,x.TrackDel);if(null==e)return null;let i=Object.assign(Object.create(null),t);i.pos=e,null!=t.end&&(i.end=n.changes.mapPos(t.end)),t=i}for(let e of n.effects)e.is(i)&&(t=e.value),e.is(co)&&(t=null);return t},provide:t=>no.from(t)});return[n,Li.define((s=>new oo(s,t,n,i,e.hoverTime||300))),ro]}function ho(t,e){let i=t.plugin(Kr);if(!i)return null;let n=i.manager.tooltips.indexOf(e);return n<0?null:i.manager.tooltipViews[n]}const co=ut.define(),fo=co.of(null);const uo=M.define({combine(t){let e,i;for(let n of t)e=e||n.topContainer,i=i||n.bottomContainer;return{topContainer:e,bottomContainer:i}}});function po(t,e){let i=t.plugin(Oo),n=i?i.specs.indexOf(e):-1;return n>-1?i.panels[n]:null}const Oo=Li.fromClass(class{constructor(t){this.input=t.state.facet(wo),this.specs=this.input.filter((t=>t)),this.panels=this.specs.map((e=>e(t)));let e=t.state.facet(uo);this.top=new go(t,!0,e.topContainer),this.bottom=new go(t,!1,e.bottomContainer),this.top.sync(this.panels.filter((t=>t.top))),this.bottom.sync(this.panels.filter((t=>!t.top)));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(t){let e=t.state.facet(uo);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new go(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new go(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=t.state.facet(wo);if(i!=this.input){let e=i.filter((t=>t)),n=[],s=[],r=[],o=[];for(let i of e){let e,a=this.specs.indexOf(i);a<0?(e=i(t.view),o.push(e)):(e=this.panels[a],e.update&&e.update(t)),n.push(e),(e.top?s:r).push(e)}this.specs=e,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let t of o)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}else for(let e of this.panels)e.update&&e.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>Bs.scrollMargins.of((e=>{let i=e.plugin(t);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class go{constructor(t,e,i){this.view=t,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(t){for(let e of this.panels)e.destroy&&t.indexOf(e)<0&&e.destroy();this.panels=t,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let t=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;t!=e.dom;)t=mo(t);t=t.nextSibling}else this.dom.insertBefore(e.dom,t);for(;t;)t=mo(t)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let t of this.classes.split(" "))t&&this.container.classList.remove(t);for(let t of(this.classes=this.view.themeClasses).split(" "))t&&this.container.classList.add(t)}}}function mo(t){let e=t.nextSibling;return t.remove(),e}const wo=M.define({enables:Oo});class vo extends $t{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}}vo.prototype.elementClass="",vo.prototype.toDOM=void 0,vo.prototype.mapMode=x.TrackBefore,vo.prototype.startSide=vo.prototype.endSide=-1,vo.prototype.point=!0;const bo=M.define(),yo={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Tt.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},So=M.define();function xo(t){return[Qo(),So.of(Object.assign(Object.assign({},yo),t))]}const ko=M.define({combine:t=>t.some((t=>t))});function Qo(t){let e=[$o];return t&&!1===t.fixed&&e.push(ko.of(!0)),e}const $o=Li.fromClass(class{constructor(t){this.view=t,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(So).map((e=>new To(t,e)));for(let t of this.gutters)this.dom.appendChild(t.dom);this.fixed=!t.state.facet(ko),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(ko)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=Tt.iter(this.view.state.facet(bo),this.view.viewport.from),n=[],s=this.gutters.map((t=>new Co(t,this.view.viewport,-this.view.documentPadding.top)));for(let t of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(t.type)){let e=!0;for(let r of t.type)if(r.type==ii.Text&&e){Zo(i,n,r.from);for(let t of s)t.line(this.view,r,n);e=!1}else if(r.widget)for(let t of s)t.widget(this.view,r)}else if(t.type==ii.Text){Zo(i,n,t.from);for(let e of s)e.line(this.view,t,n)}else if(t.widget)for(let e of s)e.widget(this.view,t);for(let t of s)t.finish();t&&this.view.scrollDOM.insertBefore(this.dom,e)}updateGutters(t){let e=t.startState.facet(So),i=t.state.facet(So),n=t.docChanged||t.heightChanged||t.viewportChanged||!Tt.eq(t.startState.facet(bo),t.state.facet(bo),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let e of this.gutters)e.update(t)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=e.indexOf(n);i<0?s.push(new To(this.view,n)):(this.gutters[i].update(t),s.push(this.gutters[i]))}for(let t of this.gutters)t.dom.remove(),s.indexOf(t)<0&&t.destroy();for(let t of s)this.dom.appendChild(t.dom);this.gutters=s}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}},{provide:t=>Bs.scrollMargins.of((e=>{let i=e.plugin(t);return i&&0!=i.gutters.length&&i.fixed?e.textDirection==ui.LTR?{left:i.dom.offsetWidth*e.scaleX}:{right:i.dom.offsetWidth*e.scaleX}:null}))});function Po(t){return Array.isArray(t)?t:[t]}function Zo(t,e,i){for(;t.value&&t.from<=i;)t.from==i&&e.push(t.value),t.next()}class Co{constructor(t,e,i){this.gutter=t,this.height=i,this.i=0,this.cursor=Tt.iter(t.markers,e.from)}addElement(t,e,i){let{gutter:n}=this,s=(e.top-this.height)/t.scaleY,r=e.height/t.scaleY;if(this.i==n.elements.length){let e=new Ao(t,r,s,i);n.elements.push(e),n.dom.appendChild(e.dom)}else n.elements[this.i].update(t,r,s,i);this.height=e.bottom,this.i++}line(t,e,i){let n=[];Zo(this.cursor,n,e.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(t,e,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(t,e,n)}widget(t,e){let i=this.gutter.config.widgetMarker(t,e.widget,e);i&&this.addElement(t,e,[i])}finish(){let t=this.gutter;for(;t.elements.length>this.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}}class To{constructor(t,e){this.view=t,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let t=r.getBoundingClientRect();s=(t.top+t.bottom)/2}else s=n.clientY;let o=t.lineBlockAtHeight(s-t.documentTop);e.domEventHandlers[i](t,o,n)&&n.preventDefault()}));this.markers=Po(e.markers(t)),e.initialSpacer&&(this.spacer=new Ao(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Po(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let e=this.config.updateSpacer(this.spacer.markers[0],t);e!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[e])}let i=t.view.viewport;return!Tt.eq(this.markers,e,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(t)}destroy(){for(let t of this.elements)t.destroy()}}class Ao{constructor(t,e,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,n)}update(t,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(t,e){if(t.length!=e.length)return!1;for(let i=0;i<t.length;i++)if(!t[i].compare(e[i]))return!1;return!0}(this.markers,n)||this.setMarkers(t,n)}setMarkers(t,e){let i="cm-gutterElement",n=this.dom.firstChild;for(let s=0,r=0;;){let o=r,a=s<e.length?e[s++]:null,l=!1;if(a){let t=a.elementClass;t&&(i+=" "+t);for(let t=r;t<this.markers.length;t++)if(this.markers[t].compare(a)){o=t,l=!0;break}}else o=this.markers.length;for(;r<o;){let t=this.markers[r++];if(t.toDOM){t.destroy(n);let e=n.nextSibling;n.remove(),n=e}}if(!a)break;a.toDOM&&(l?n=n.nextSibling:this.dom.insertBefore(a.toDOM(t),n)),l&&r++}this.dom.className=i,this.markers=e}destroy(){this.setMarkers(null,[])}}const Ro=M.define(),Xo=M.define({combine:t=>Qt(t,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(t,e){let i=Object.assign({},t);for(let t in e){let n=i[t],s=e[t];i[t]=n?(t,e,i)=>n(t,e,i)||s(t,e,i):s}return i}})});class Yo extends vo{constructor(t){super(),this.number=t}eq(t){return this.number==t.number}toDOM(){return document.createTextNode(this.number)}}function Wo(t,e){return t.state.facet(Xo).formatNumber(e,t.state)}const Mo=So.compute([Xo],(t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:t=>t.state.facet(Ro),lineMarker:(t,e,i)=>i.some((t=>t.toDOM))?null:new Yo(Wo(t,t.state.doc.lineAt(e.from).number)),widgetMarker:()=>null,lineMarkerChange:t=>t.startState.facet(Xo)!=t.state.facet(Xo),initialSpacer:t=>new Yo(Wo(t,Do(t.state.doc.lines))),updateSpacer(t,e){let i=Wo(e.view,Do(e.view.state.doc.lines));return i==t.number?t:new Yo(i)},domEventHandlers:t.facet(Xo).domEventHandlers})));function jo(t={}){return[Xo.of(t),Qo(),Mo]}function Do(t){let e=9;for(;e<t;)e=10*e+9;return e}const Eo=new class extends vo{constructor(){super(...arguments),this.elementClass="cm-activeLineGutter"}},qo=bo.compute(["selection"],(t=>{let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head).from;s>i&&(i=s,e.push(Eo.range(s)))}return Tt.of(e)}));function _o(){return qo}const Vo=new Map;function Io(t){return Li.define((e=>({decorations:t.createDeco(e),update(e){this.decorations=t.updateDeco(e,this.decorations)}})),{decorations:t=>t.decorations})}const zo=Io(new $r({regexp:/\t| +/g,decoration:t=>function(t){let e=Vo.get(t);return e||Vo.set(t,e=ni.mark({attributes:"\t"===t?{class:"cm-highlightTab"}:{class:"cm-highlightSpace","data-display":t.replace(/ /g,"·")}})),e}(t[0]),boundary:/\S/}));const Bo=Io(new $r({regexp:/\s+$/g,decoration:ni.mark({class:"cm-trailingSpace"}),boundary:/\S/}));const Go={HeightMap:os,HeightOracle:es,MeasuredHeights:is,QueryType:ss,ChangedRange:on,computeOrder:Pi,moveVisually:Ti};var Lo=Object.freeze({__proto__:null,BidiSpan:Si,BlockInfo:ns,get BlockType(){return ii},Decoration:ni,get Direction(){return ui},EditorView:Bs,GutterMarker:vo,MatchDecorator:$r,RectangleMarker:or,ViewPlugin:Li,ViewUpdate:an,WidgetType:ei,__test:Go,closeHoverTooltips:fo,crosshairCursor:Lr,drawSelection:pr,dropCursor:kr,getDrawSelectionConfig:function(t){return t.facet(dr)},getPanel:po,getTooltip:ho,gutter:xo,gutterLineClass:bo,gutters:Qo,hasHoverTooltips:function(t){return t.facet(no).some((t=>t))},highlightActiveLine:jr,highlightActiveLineGutter:_o,highlightSpecialChars:Rr,highlightTrailingWhitespace:function(){return Bo},highlightWhitespace:function(){return zo},hoverTooltip:lo,keymap:Ks,layer:fr,lineNumberMarkers:Ro,lineNumbers:jo,logException:Ii,panels:function(t){return t?[uo.of(t)]:[]},placeholder:function(t){return Li.fromClass(class{constructor(e){this.view=e,this.placeholder=t?ni.set([ni.widget({widget:new qr(t),side:1}).range(0)]):ni.none}get decorations(){return this.view.state.doc.length?ni.none:this.placeholder}},{decorations:t=>t.decorations})},rectangularSelection:zr,repositionTooltips:function(t){let e=t.plugin(Kr);e&&e.maybeMeasure()},runScopeHandlers:ir,scrollPastEnd:function(){return[Mr,Hi.of((t=>{var e;return(null===(e=t.plugin(Mr))||void 0===e?void 0:e.attrs)||null}))]},showPanel:wo,showTooltip:io,tooltips:function(t={}){return Fr.of(t)}});const No=1024;let Uo=0;class Ho{constructor(t,e){this.from=t,this.to=e}}class Fo{constructor(t={}){this.id=Uo++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof t&&(t=ta.match(t)),e=>{let i=t(e);return void 0===i?null:[this,i]}}}Fo.closedBy=new Fo({deserialize:t=>t.split(" ")}),Fo.openedBy=new Fo({deserialize:t=>t.split(" ")}),Fo.group=new Fo({deserialize:t=>t.split(" ")}),Fo.isolate=new Fo({deserialize:t=>{if(t&&"rtl"!=t&&"ltr"!=t&&"auto"!=t)throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Fo.contextHash=new Fo({perNode:!0}),Fo.lookAhead=new Fo({perNode:!0}),Fo.mounted=new Fo({perNode:!0});class Jo{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Fo.mounted.id]}}const Ko=Object.create(null);class ta{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):Ko,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(null==t.name?8:0),n=new ta(t.name||"",e,t.id,i);if(t.props)for(let i of t.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[i[0].id]=i[1]}return n}prop(t){return this.props[t.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(t){if("string"==typeof t){if(this.name==t)return!0;let e=this.prop(Fo.group);return!!e&&e.indexOf(t)>-1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return t=>{for(let i=t.prop(Fo.group),n=-1;n<(i?i.length:0);n++){let s=e[n<0?t.name:i[n]];if(s)return s}}}}ta.none=new ta("",Object.create(null),0,8);class ea{constructor(t){this.types=t;for(let e=0;e<t.length;e++)if(t[e].id!=e)throw new RangeError("Node type ids should correspond to array positions when creating a node set")}extend(...t){let e=[];for(let i of this.types){let n=null;for(let e of t){let t=e(i);t&&(n||(n=Object.assign({},i.props)),n[t[0].id]=t[1])}e.push(n?new ta(i.name,n,i.id,i.flags):i)}return new ea(e)}}const ia=new WeakMap,na=new WeakMap;var sa;!function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"}(sa||(sa={}));class ra{constructor(t,e,i,n,s){if(this.type=t,this.children=e,this.positions=i,this.length=n,this.props=null,s&&s.length){this.props=Object.create(null);for(let[t,e]of s)this.props["number"==typeof t?t:t.id]=e}}toString(){let t=Jo.get(this);if(t&&!t.overlay)return t.tree.toString();let e="";for(let t of this.children){let i=t.toString();i&&(e&&(e+=","),e+=i)}return this.type.name?(/\W/.test(this.type.name)&&!this.type.isError?JSON.stringify(this.type.name):this.type.name)+(e.length?"("+e+")":""):e}cursor(t=0){return new wa(this.topNode,t)}cursorAt(t,e=0,i=0){let n=ia.get(this)||this.topNode,s=new wa(n);return s.moveTo(t,e),ia.set(this,s._tree),s}get topNode(){return new fa(this,0,0,null)}resolve(t,e=0){let i=ha(ia.get(this)||this.topNode,t,e,!1);return ia.set(this,i),i}resolveInner(t,e=0){let i=ha(na.get(this)||this.topNode,t,e,!0);return na.set(this,i),i}resolveStack(t,e=0){return function(t,e,i){let n=t.resolveInner(e,i),s=null;for(let t=n instanceof fa?n:n.context.parent;t;t=t.parent)if(t.index<0){let r=t.parent;(s||(s=[n])).push(r.resolve(e,i)),t=r}else{let r=Jo.get(t.tree);if(r&&r.overlay&&r.overlay[0].from<=e&&r.overlay[r.overlay.length-1].to>=e){let o=new fa(r.tree,r.overlay[0].from+t.from,-1,t);(s||(s=[n])).push(ha(o,e,i,!1))}}return s?ga(s):n}(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:s=this.length}=t,r=t.mode||0,o=(r&sa.IncludeAnonymous)>0;for(let t=this.cursor(r|sa.IncludeAnonymous);;){let r=!1;if(t.from<=s&&t.to>=n&&(!o&&t.type.isAnonymous||!1!==e(t))){if(t.firstChild())continue;r=!0}for(;r&&i&&(o||!t.type.isAnonymous)&&i(t),!t.nextSibling();){if(!t.parent())return;r=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:Sa(ta.none,this.children,this.positions,0,this.children.length,0,this.length,((t,e,i)=>new ra(this.type,t,e,i,this.propValues)),t.makeTree||((t,e,i)=>new ra(ta.none,t,e,i)))}static build(t){return function(t){var e;let{buffer:i,nodeSet:n,maxBufferLength:s=No,reused:r=[],minRepeatType:o=n.types.length}=t,a=Array.isArray(i)?new oa(i,i.length):i,l=n.types,h=0,c=0;function f(t,e,i,w,v,b){let{id:y,start:S,end:x,size:k}=a,Q=c;for(;k<0;){if(a.next(),-1==k){let e=r[y];return i.push(e),void w.push(S-t)}if(-3==k)return void(h=y);if(-4==k)return void(c=y);throw new RangeError(`Unrecognized record size: ${k}`)}let $,P,Z=l[y],C=S-t;if(x-S<=s&&(P=g(a.pos-e,v))){let e=new Uint16Array(P.size-P.skip),i=a.pos-P.size,s=e.length;for(;a.pos>i;)s=m(P.start,e,s);$=new aa(e,x-P.start,n),C=P.start-t}else{let t=a.pos-k;a.next();let e=[],i=[],n=y>=o?y:-1,r=0,l=x;for(;a.pos>t;)n>=0&&a.id==n&&a.size>=0?(a.end<=l-s&&(p(e,i,S,r,a.end,l,n,Q),r=e.length,l=a.end),a.next()):b>2500?u(S,t,e,i):f(S,t,e,i,n,b+1);if(n>=0&&r>0&&r<e.length&&p(e,i,S,r,S,l,n,Q),e.reverse(),i.reverse(),n>-1&&r>0){let t=d(Z);$=Sa(Z,e,i,0,e.length,0,x-S,t,t)}else $=O(Z,e,i,x-S,Q-x)}i.push($),w.push(C)}function u(t,e,i,r){let o=[],l=0,h=-1;for(;a.pos>e;){let{id:t,start:e,end:i,size:n}=a;if(n>4)a.next();else{if(h>-1&&e<h)break;h<0&&(h=i-s),o.push(t,e,i),l++,a.next()}}if(l){let e=new Uint16Array(4*l),s=o[o.length-2];for(let t=o.length-3,i=0;t>=0;t-=3)e[i++]=o[t],e[i++]=o[t+1]-s,e[i++]=o[t+2]-s,e[i++]=i;i.push(new aa(e,o[2]-s,n)),r.push(s-t)}}function d(t){return(e,i,n)=>{let s,r,o=0,a=e.length-1;if(a>=0&&(s=e[a])instanceof ra){if(!a&&s.type==t&&s.length==n)return s;(r=s.prop(Fo.lookAhead))&&(o=i[a]+s.length+r)}return O(t,e,i,n,o)}}function p(t,e,i,s,r,o,a,l){let h=[],c=[];for(;t.length>s;)h.push(t.pop()),c.push(e.pop()+i-r);t.push(O(n.types[a],h,c,o-r,l-o)),e.push(r-i)}function O(t,e,i,n,s=0,r){if(h){let t=[Fo.contextHash,h];r=r?[t].concat(r):[t]}if(s>25){let t=[Fo.lookAhead,s];r=r?[t].concat(r):[t]}return new ra(t,e,i,n,r)}function g(t,e){let i=a.fork(),n=0,r=0,l=0,h=i.end-s,c={size:0,start:0,skip:0};t:for(let s=i.pos-t;i.pos>s;){let t=i.size;if(i.id==e&&t>=0){c.size=n,c.start=r,c.skip=l,l+=4,n+=4,i.next();continue}let a=i.pos-t;if(t<0||a<s||i.start<h)break;let f=i.id>=o?4:0,u=i.start;for(i.next();i.pos>a;){if(i.size<0){if(-3!=i.size)break t;f+=4}else i.id>=o&&(f+=4);i.next()}r=u,n+=t,l+=f}return(e<0||n==t)&&(c.size=n,c.start=r,c.skip=l),c.size>4?c:void 0}function m(t,e,i){let{id:n,start:s,end:r,size:l}=a;if(a.next(),l>=0&&n<o){let o=i;if(l>4){let n=a.pos-(l-4);for(;a.pos>n;)i=m(t,e,i)}e[--i]=o,e[--i]=r-t,e[--i]=s-t,e[--i]=n}else-3==l?h=n:-4==l&&(c=n);return i}let w=[],v=[];for(;a.pos>0;)f(t.start||0,t.bufferStart||0,w,v,-1,0);let b=null!==(e=t.length)&&void 0!==e?e:w.length?v[0]+w[0].length:0;return new ra(l[t.topID],w.reverse(),v.reverse(),b)}(t)}}ra.empty=new ra(ta.none,[],[],0);class oa{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new oa(this.buffer,this.index)}}class aa{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return ta.none}toString(){let t=[];for(let e=0;e<this.buffer.length;)t.push(this.childString(e)),e=this.buffer[e+3];return t.join(",")}childString(t){let e=this.buffer[t],i=this.buffer[t+3],n=this.set.types[e],s=n.name;if(/\W/.test(s)&&!n.isError&&(s=JSON.stringify(s)),i==(t+=4))return s;let r=[];for(;t<i;)r.push(this.childString(t)),t=this.buffer[t+3];return s+"("+r.join(",")+")"}findChild(t,e,i,n,s){let{buffer:r}=this,o=-1;for(let a=t;a!=e&&!(la(s,n,r[a+1],r[a+2])&&(o=a,i>0));a=r[a+3]);return o}slice(t,e,i){let n=this.buffer,s=new Uint16Array(e-t),r=0;for(let o=t,a=0;o<e;){s[a++]=n[o++],s[a++]=n[o++]-i;let e=s[a++]=n[o++]-i;s[a++]=n[o++]-t,r=Math.max(r,e)}return new aa(s,r,this.set)}}function la(t,e,i,n){switch(t){case-2:return i<e;case-1:return n>=e&&i<e;case 0:return i<e&&n>e;case 1:return i<=e&&n>e;case 2:return n>e;case 4:return!0}}function ha(t,e,i,n){for(var s;t.from==t.to||(i<1?t.from>=e:t.from>e)||(i>-1?t.to<=e:t.to<e);){let e=!n&&t instanceof fa&&t.index<0?null:t.parent;if(!e)return t;t=e}let r=n?0:sa.IgnoreOverlays;if(n)for(let n=t,o=n.parent;o;n=o,o=n.parent)n instanceof fa&&n.index<0&&(null===(s=o.enter(e,i,r))||void 0===s?void 0:s.from)!=n.from&&(t=o);for(;;){let n=t.enter(e,i,r);if(!n)return t;t=n}}class ca{cursor(t=0){return new wa(this,t)}getChild(t,e=null,i=null){let n=ua(this,t,e,i);return n.length?n[0]:null}getChildren(t,e=null,i=null){return ua(this,t,e,i)}resolve(t,e=0){return ha(this,t,e,!1)}resolveInner(t,e=0){return ha(this,t,e,!0)}matchContext(t){return da(this,t)}enterUnfinishedNodesBefore(t){let e=this.childBefore(t),i=this;for(;e;){let t=e.lastChild;if(!t||t.to!=e.to)break;t.type.isError&&t.from==t.to?(i=e,e=t.prevSibling):e=t}return i}get node(){return this}get next(){return this.parent}}class fa extends ca{constructor(t,e,i,n){super(),this._tree=t,this.from=e,this.index=i,this._parent=n}get type(){return this._tree.type}get name(){return this._tree.type.name}get to(){return this.from+this._tree.length}nextChild(t,e,i,n,s=0){for(let r=this;;){for(let{children:o,positions:a}=r._tree,l=e>0?o.length:-1;t!=l;t+=e){let l=o[t],h=a[t]+r.from;if(la(n,i,h,h+l.length))if(l instanceof aa){if(s&sa.ExcludeBuffers)continue;let o=l.findChild(0,l.buffer.length,e,i-h,n);if(o>-1)return new Oa(new pa(r,l,t,h),null,o)}else if(s&sa.IncludeAnonymous||!l.type.isAnonymous||va(l)){let o;if(!(s&sa.IgnoreMounts)&&(o=Jo.get(l))&&!o.overlay)return new fa(o.tree,h,t,r);let a=new fa(l,h,t,r);return s&sa.IncludeAnonymous||!a.type.isAnonymous?a:a.nextChild(e<0?l.children.length-1:0,e,i,n)}}if(s&sa.IncludeAnonymous||!r.type.isAnonymous)return null;if(t=r.index>=0?r.index+e:e<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&sa.IgnoreOverlays)&&(n=Jo.get(this._tree))&&n.overlay){let i=t-this.from;for(let{from:t,to:s}of n.overlay)if((e>0?t<=i:t<i)&&(e<0?s>=i:s>i))return new fa(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function ua(t,e,i,n){let s=t.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(let t=!1;!t;)if(t=s.type.is(i),!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(e)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function da(t,e,i=e.length-1){for(let n=t.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[i]&&e[i]!=n.name)return!1;i--}}return!0}class pa{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}}class Oa extends ca{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return s<0?null:new Oa(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&sa.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new Oa(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new Oa(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new Oa(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];t.push(i.slice(n,s,r)),e.push(0)}return new ra(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function ga(t){if(!t.length)return null;let e=0,i=t[0];for(let n=1;n<t.length;n++){let s=t[n];(s.from>i.from||s.to<i.to)&&(i=s,e=n)}let n=i instanceof fa&&i.index<0?null:i.parent,s=t.slice();return n?s[e]=n:s.splice(e,1),new ma(s,i)}class ma{constructor(t,e){this.heads=t,this.node=e}get next(){return ga(this.heads)}}class wa{get name(){return this.type.name}constructor(t,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,t instanceof fa)this.yieldNode(t);else{this._tree=t.context.parent,this.buffer=t.context;for(let e=t._parent;e;e=e._parent)this.stack.unshift(e.index);this.bufferNode=t,this.yieldBuf(t.index)}}yieldNode(t){return!!t&&(this._tree=t,this.type=t.type,this.from=t.from,this.to=t.to,!0)}yieldBuf(t,e){this.index=t;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[t]],this.from=i+n.buffer[t+1],this.to=i+n.buffer[t+2],!0}yield(t){return!!t&&(t instanceof fa?(this.buffer=null,this.yieldNode(t)):(this.buffer=t.context,this.yieldBuf(t.index,t.type)))}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(t,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(t<0?this._tree._tree.children.length-1:0,t,e,i,this.mode));let{buffer:n}=this.buffer,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.buffer.start,i);return!(s<0)&&(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(t){return this.enterChild(1,t,2)}childBefore(t){return this.enterChild(-1,t,-2)}enter(t,e,i=this.mode){return this.buffer?!(i&sa.ExcludeBuffers)&&this.enterChild(1,t,e):this.yield(this._tree.enter(t,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&sa.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let t=this.mode&sa.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(t)}sibling(t){if(!this.buffer)return!!this._tree._parent&&this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+t,t,0,4,this.mode));let{buffer:e}=this.buffer,i=this.stack.length-1;if(t<0){let t=i<0?0:this.stack[i]+4;if(this.index!=t)return this.yieldBuf(e.findChild(t,this.index,-1,0,4))}else{let t=e.buffer[this.index+3];if(t<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(t)}return i<0&&this.yield(this.buffer.parent.nextChild(this.buffer.index+t,t,0,4,this.mode))}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(t){let e,i,{buffer:n}=this;if(n){if(t>0){if(this.index<n.buffer.buffer.length)return!1}else for(let t=0;t<this.index;t++)if(n.buffer.buffer[t+3]<this.index)return!1;({index:e,parent:i}=n)}else({index:e,_parent:i}=this._tree);for(;i;({index:e,_parent:i}=i))if(e>-1)for(let n=e+t,s=t<0?-1:i._tree.children.length;n!=s;n+=t){let t=i._tree.children[n];if(this.mode&sa.IncludeAnonymous||t instanceof aa||!t.type.isAnonymous||va(t))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to<t))&&this.parent(););for(;this.enterChild(1,t,e););return this}get node(){if(!this.buffer)return this._tree;let t=this.bufferNode,e=null,i=0;if(t&&t.context==this.buffer)t:for(let n=this.index,s=this.stack.length;s>=0;){for(let r=t;r;r=r._parent)if(r.index==n){if(n==this.index)return r;e=r,i=s+1;break t}n=this.stack[--s]}for(let t=i;t<this.stack.length;t++)e=new Oa(this.buffer,e,this.stack[t]);return this.bufferNode=new Oa(this.buffer,e,this.index)}get tree(){return this.buffer?null:this._tree._tree}iterate(t,e){for(let i=0;;){let n=!1;if(this.type.isAnonymous||!1!==t(this)){if(this.firstChild()){i++;continue}this.type.isAnonymous||(n=!0)}for(;n&&e&&e(this),n=this.type.isAnonymous,!this.nextSibling();){if(!i)return;this.parent(),i--,n=!0}}}matchContext(t){if(!this.buffer)return da(this.node,t);let{buffer:e}=this.buffer,{types:i}=e.set;for(let n=t.length-1,s=this.stack.length-1;n>=0;s--){if(s<0)return da(this.node,t,n);let r=i[e.buffer[this.stack[s]]];if(!r.isAnonymous){if(t[n]&&t[n]!=r.name)return!1;n--}}return!0}}function va(t){return t.children.some((t=>t instanceof aa||!t.type.isAnonymous||va(t)))}const ba=new WeakMap;function ya(t,e){if(!t.isAnonymous||e instanceof aa||e.type!=t)return 1;let i=ba.get(e);if(null==i){i=1;for(let n of e.children){if(n.type!=t||!(n instanceof ra)){i=1;break}i+=ya(t,n)}ba.set(e,i)}return i}function Sa(t,e,i,n,s,r,o,a,l){let h=0;for(let i=n;i<s;i++)h+=ya(t,e[i]);let c=Math.ceil(1.5*h/8),f=[],u=[];return function e(i,n,s,o,a){for(let h=s;h<o;){let s=h,d=n[h],p=ya(t,i[h]);for(h++;h<o;h++){let e=ya(t,i[h]);if(p+e>=c)break;p+=e}if(h==s+1){if(p>c){let t=i[s];e(t.children,t.positions,0,t.children.length,n[s]+a);continue}f.push(i[s])}else{let e=n[h-1]+i[h-1].length-d;f.push(Sa(t,i,n,s,h,d,e,null,l))}u.push(d+a-r)}}(e,i,n,s,0),(a||l)(f,u,o)}class xa{constructor(){this.map=new WeakMap}setBuffer(t,e,i){let n=this.map.get(t);n||this.map.set(t,n=new Map),n.set(e,i)}getBuffer(t,e){let i=this.map.get(t);return i&&i.get(e)}set(t,e){t instanceof Oa?this.setBuffer(t.context.buffer,t.index,e):t instanceof fa&&this.map.set(t.tree,e)}get(t){return t instanceof Oa?this.getBuffer(t.context.buffer,t.index):t instanceof fa?this.map.get(t.tree):void 0}cursorSet(t,e){t.buffer?this.setBuffer(t.buffer.buffer,t.index,e):this.map.set(t.tree,e)}cursorGet(t){return t.buffer?this.getBuffer(t.buffer.buffer,t.index):this.map.get(t.tree)}}class ka{constructor(t,e,i,n,s=!1,r=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(t,e=[],i=!1){let n=[new ka(0,t.length,t,0,!1,i)];for(let i of e)i.to>t.length&&n.push(i);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],s=1,r=t.length?t[0]:null;for(let o=0,a=0,l=0;;o++){let h=o<e.length?e[o]:null,c=h?h.fromA:1e9;if(c-a>=i)for(;r&&r.from<c;){let e=r;if(a>=e.from||c<=e.to||l){let t=Math.max(e.from,a)-l,i=Math.min(e.to,c)-l;e=t>=i?null:new ka(t,i,e.tree,e.offset+l,o>0,!!h)}if(e&&n.push(e),r.to>c)break;r=s<t.length?t[s++]:null}if(!h)break;a=h.toA,l=h.toA-h.toB}return n}}class Qa{startParse(t,e,i){return"string"==typeof t&&(t=new $a(t)),i=i?i.length?i.map((t=>new Ho(t.from,t.to))):[new Ho(0,0)]:[new Ho(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let t=n.advance();if(t)return t}}}class $a{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}}new Fo({perNode:!0});let Pa=0;class Za{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=Pa++}static define(t){if(null==t?void 0:t.base)throw new Error("Can not derive from a modified tag");let e=new Za([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new Ta;return e=>e.modified.indexOf(t)>-1?e:Ta.get(e.base||e,e.modified.concat(t).sort(((t,e)=>t.id-e.id)))}}let Ca=0;class Ta{constructor(){this.instances=[],this.id=Ca++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find((i=>{return i.base==t&&(n=e,s=i.modified,n.length==s.length&&n.every(((t,e)=>t==s[e])));var n,s}));if(i)return i;let n=[],s=new Za(n,t,e);for(let t of e)t.instances.push(s);let r=function(t){let e=[[]];for(let i=0;i<t.length;i++)for(let n=0,s=e.length;n<s;n++)e.push(e[n].concat(t[i]));return e.sort(((t,e)=>e.length-t.length))}(e);for(let e of t.set)if(!e.modified.length)for(let t of r)n.push(Ta.get(e,t));return s}}function Aa(t){let e=Object.create(null);for(let i in t){let n=t[i];Array.isArray(n)||(n=[n]);for(let t of i.split(" "))if(t){let i=[],s=2,r=t;for(let e=0;;){if("..."==r&&e>0&&e+3==t.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+t);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),e+=n[0].length,e==t.length)break;let o=t[e++];if(e==t.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+t);r=t.slice(e)}let o=i.length-1,a=i[o];if(!a)throw new RangeError("Invalid path: "+t);let l=new Xa(n,s,o>0?i.slice(0,o):null);e[a]=l.sort(e[a])}}return Ra.add(e)}const Ra=new Fo;class Xa{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(t){return!t||t.depth<this.depth?(this.next=t,this):(t.next=this.sort(t.next),t)}get depth(){return this.context?this.context.length:0}}function Ya(t,e){let i=Object.create(null);for(let e of t)if(Array.isArray(e.tag))for(let t of e.tag)i[t.id]=e.class;else i[e.tag.id]=e.class;let{scope:n,all:s=null}=e||{};return{style:t=>{let e=s;for(let n of t)for(let t of n.set){let n=i[t.id];if(n){e=e?e+" "+n:n;break}}return e},scope:n}}function Wa(t,e,i,n=0,s=t.length){let r=new Ma(n,Array.isArray(e)?e:[e],i);r.highlightRange(t.cursor(),n,s,"",r.highlighters),r.flush(s)}Xa.empty=new Xa([],2,null);class Ma{constructor(t,e,i){this.at=t,this.highlighters=e,this.span=i,this.class=""}startSpan(t,e){e!=this.class&&(this.flush(t),t>this.at&&(this.at=t),this.class=e)}flush(t){t>this.at&&this.class&&this.span(this.at,t,this.class)}highlightRange(t,e,i,n,s){let{type:r,from:o,to:a}=t;if(o>=i||a<=e)return;r.isTop&&(s=this.highlighters.filter((t=>!t.scope||t.scope(r))));let l=n,h=ja(t)||Xa.empty,c=function(t,e){let i=null;for(let n of t){let t=n.style(e);t&&(i=i?i+" "+t:t)}return i}(s,h.tags);if(c&&(l&&(l+=" "),l+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(e,o),l),h.opaque)return;let f=t.tree&&t.tree.prop(Fo.mounted);if(f&&f.overlay){let r=t.node.enter(f.overlay[0].from+o,1),h=this.highlighters.filter((t=>!t.scope||t.scope(f.tree.type))),c=t.firstChild();for(let u=0,d=o;;u++){let p=u<f.overlay.length?f.overlay[u]:null,O=p?p.from+o:a,g=Math.max(e,d),m=Math.min(i,O);if(g<m&&c)for(;t.from<m&&(this.highlightRange(t,g,m,n,s),this.startSpan(Math.min(m,t.to),l),!(t.to>=O)&&t.nextSibling()););if(!p||O>i)break;d=p.to+o,d>e&&(this.highlightRange(r.cursor(),Math.max(e,p.from+o),Math.min(i,d),"",h),this.startSpan(Math.min(i,d),l))}c&&t.parent()}else if(t.firstChild()){f&&(n="");do{if(!(t.to<=e)){if(t.from>=i)break;this.highlightRange(t,e,i,n,s),this.startSpan(Math.min(i,t.to),l)}}while(t.nextSibling());t.parent()}}}function ja(t){let e=t.type.prop(Ra);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}const Da=Za.define,Ea=Da(),qa=Da(),_a=Da(qa),Va=Da(qa),Ia=Da(),za=Da(Ia),Ba=Da(Ia),Ga=Da(),La=Da(Ga),Na=Da(),Ua=Da(),Ha=Da(),Fa=Da(Ha),Ja=Da(),Ka={comment:Ea,lineComment:Da(Ea),blockComment:Da(Ea),docComment:Da(Ea),name:qa,variableName:Da(qa),typeName:_a,tagName:Da(_a),propertyName:Va,attributeName:Da(Va),className:Da(qa),labelName:Da(qa),namespace:Da(qa),macroName:Da(qa),literal:Ia,string:za,docString:Da(za),character:Da(za),attributeValue:Da(za),number:Ba,integer:Da(Ba),float:Da(Ba),bool:Da(Ia),regexp:Da(Ia),escape:Da(Ia),color:Da(Ia),url:Da(Ia),keyword:Na,self:Da(Na),null:Da(Na),atom:Da(Na),unit:Da(Na),modifier:Da(Na),operatorKeyword:Da(Na),controlKeyword:Da(Na),definitionKeyword:Da(Na),moduleKeyword:Da(Na),operator:Ua,derefOperator:Da(Ua),arithmeticOperator:Da(Ua),logicOperator:Da(Ua),bitwiseOperator:Da(Ua),compareOperator:Da(Ua),updateOperator:Da(Ua),definitionOperator:Da(Ua),typeOperator:Da(Ua),controlOperator:Da(Ua),punctuation:Ha,separator:Da(Ha),bracket:Fa,angleBracket:Da(Fa),squareBracket:Da(Fa),paren:Da(Fa),brace:Da(Fa),content:Ga,heading:La,heading1:Da(La),heading2:Da(La),heading3:Da(La),heading4:Da(La),heading5:Da(La),heading6:Da(La),contentSeparator:Da(Ga),list:Da(Ga),quote:Da(Ga),emphasis:Da(Ga),strong:Da(Ga),link:Da(Ga),monospace:Da(Ga),strikethrough:Da(Ga),inserted:Da(),deleted:Da(),changed:Da(),invalid:Da(),meta:Ja,documentMeta:Da(Ja),annotation:Da(Ja),processingInstruction:Da(Ja),definition:Za.defineModifier(),constant:Za.defineModifier(),function:Za.defineModifier(),standard:Za.defineModifier(),local:Za.defineModifier(),special:Za.defineModifier()},tl=Ya([{tag:Ka.link,class:"tok-link"},{tag:Ka.heading,class:"tok-heading"},{tag:Ka.emphasis,class:"tok-emphasis"},{tag:Ka.strong,class:"tok-strong"},{tag:Ka.keyword,class:"tok-keyword"},{tag:Ka.atom,class:"tok-atom"},{tag:Ka.bool,class:"tok-bool"},{tag:Ka.url,class:"tok-url"},{tag:Ka.labelName,class:"tok-labelName"},{tag:Ka.inserted,class:"tok-inserted"},{tag:Ka.deleted,class:"tok-deleted"},{tag:Ka.literal,class:"tok-literal"},{tag:Ka.string,class:"tok-string"},{tag:Ka.number,class:"tok-number"},{tag:[Ka.regexp,Ka.escape,Ka.special(Ka.string)],class:"tok-string2"},{tag:Ka.variableName,class:"tok-variableName"},{tag:Ka.local(Ka.variableName),class:"tok-variableName tok-local"},{tag:Ka.definition(Ka.variableName),class:"tok-variableName tok-definition"},{tag:Ka.special(Ka.variableName),class:"tok-variableName2"},{tag:Ka.definition(Ka.propertyName),class:"tok-propertyName tok-definition"},{tag:Ka.typeName,class:"tok-typeName"},{tag:Ka.namespace,class:"tok-namespace"},{tag:Ka.className,class:"tok-className"},{tag:Ka.macroName,class:"tok-macroName"},{tag:Ka.propertyName,class:"tok-propertyName"},{tag:Ka.operator,class:"tok-operator"},{tag:Ka.comment,class:"tok-comment"},{tag:Ka.meta,class:"tok-meta"},{tag:Ka.invalid,class:"tok-invalid"},{tag:Ka.punctuation,class:"tok-punctuation"}]);var el,il=Object.freeze({__proto__:null,Tag:Za,classHighlighter:tl,getStyleTags:ja,highlightCode:function(t,e,i,n,s,r=0,o=t.length){let a=r;function l(e,i){if(!(e<=a)){for(let r=t.slice(a,e),o=0;;){let t=r.indexOf("\n",o),e=t<0?r.length:t;if(e>o&&n(r.slice(o,e),i),t<0)break;s(),o=t+1}a=e}}Wa(e,i,((t,e,i)=>{l(t,""),l(e,i)}),r,o),l(o,"")},highlightTree:Wa,styleTags:Aa,tagHighlighter:Ya,tags:Ka});const nl=new Fo;function sl(t){return M.define({combine:t?e=>e.concat(t):void 0})}const rl=new Fo;class ol{constructor(t,e,i=[],n=""){this.data=t,this.name=n,kt.prototype.hasOwnProperty("tree")||Object.defineProperty(kt.prototype,"tree",{get(){return hl(this)}}),this.parser=e,this.extension=[vl.of(this),kt.languageData.of(((t,e,i)=>{let n=al(t,e,i),s=n.type.prop(nl);if(!s)return[];let r=t.facet(s),o=n.type.prop(rl);if(o){let s=n.resolve(e-n.from,i);for(let e of o)if(e.test(s,t)){let i=t.facet(e.facet);return"replace"==e.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(t,e,i=-1){return al(t,e,i).type.prop(nl)==this.data}findRegions(t){let e=t.facet(vl);if((null==e?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(t,e)=>{if(t.prop(nl)==this.data)return void i.push({from:e,to:e+t.length});let s=t.prop(Fo.mounted);if(s){if(s.tree.prop(nl)==this.data){if(s.overlay)for(let t of s.overlay)i.push({from:t.from+e,to:t.to+e});else i.push({from:e,to:e+t.length});return}if(s.overlay){let t=i.length;if(n(s.tree,s.overlay[0].from+e),i.length>t)return}}for(let i=0;i<t.children.length;i++){let s=t.children[i];s instanceof ra&&n(s,t.positions[i]+e)}};return n(hl(t),0),i}get allowsNesting(){return!0}}function al(t,e,i){let n=t.facet(vl),s=hl(t).topNode;if(!n||n.allowsNesting)for(let t=s;t;t=t.enter(e,i,sa.ExcludeBuffers))t.type.isTop&&(s=t);return s}ol.setState=ut.define();class ll extends ol{constructor(t,e,i){super(t,e,[],i),this.parser=e}static define(t){let e=sl(t.languageData);return new ll(e,t.parser.configure({props:[nl.add((t=>t.isTop?e:void 0))]}),t.name)}configure(t,e){return new ll(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function hl(t){let e=t.field(ol.state,!1);return e?e.tree:ra.empty}function cl(t,e,i=50){var n;let s=null===(n=t.field(ol.state,!1))||void 0===n?void 0:n.context;if(!s)return null;let r=s.viewport;s.updateViewport({from:0,to:e});let o=s.isDone(e)||s.work(i,e)?s.tree:null;return s.updateViewport(r),o}class fl{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t<i||e>=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}}let ul=null;class dl{constructor(t,e,i=[],n,s,r,o,a){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new dl(t,e,[],ra.empty,0,i,[],null)}startParse(){return this.parser.startParse(new fl(this.state.doc),this.fragments)}work(t,e){return null!=e&&e>=this.state.doc.length&&(e=void 0),this.tree!=ra.empty&&this.isDone(null!=e?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof t){let e=Date.now()+t;t=()=>Date.now()>e}for(this.parse||(this.parse=this.startParse()),null!=e&&(null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&e<this.state.doc.length&&this.parse.stopAt(e);;){let n=this.parse.advance();if(n){if(this.fragments=this.withoutTempSkipped(ka.addTree(n,this.fragments,null!=this.parse.stoppedAt)),this.treeLen=null!==(i=this.parse.stoppedAt)&&void 0!==i?i:this.state.doc.length,this.tree=n,this.parse=null,!(this.treeLen<(null!=e?e:this.state.doc.length)))return!0;this.parse=this.startParse()}if(t())return!1}}))}takeTree(){let t,e;this.parse&&(t=this.parse.parsedPos)>=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext((()=>{for(;!(e=this.parse.advance()););})),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(ka.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=ul;ul=this;try{return t()}finally{ul=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=pl(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!t.empty){let e=[];if(t.iterChangedRanges(((t,i,n,s)=>e.push({fromA:t,toA:i,fromB:n,toB:s}))),i=ka.applyChanges(i,e),n=ra.empty,s=0,r={from:t.mapPos(r.from,-1),to:t.mapPos(r.to,1)},this.skipped.length){o=[];for(let e of this.skipped){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);i<n&&o.push({from:i,to:n})}}}return new dl(this.parser,e,i,n,s,r,o,this.scheduleOn)}updateViewport(t){if(this.viewport.from==t.from&&this.viewport.to==t.to)return!1;this.viewport=t;let e=this.skipped.length;for(let e=0;e<this.skipped.length;e++){let{from:i,to:n}=this.skipped[e];i<t.to&&n>t.from&&(this.fragments=pl(this.fragments,i,n),this.skipped.splice(e--,1))}return!(this.skipped.length>=e)&&(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends Qa{createParse(e,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let e=ul;if(e){for(let t of n)e.tempSkipped.push(t);t&&(e.scheduleOn=e.scheduleOn?Promise.all([e.scheduleOn,t]):t)}return this.parsedPos=r,new ra(ta.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&0==e[0].from&&e[0].to>=t}static get(){return ul}}function pl(t,e,i){return ka.applyChanges(t,[{fromA:e,toA:i,fromB:e,toB:i}])}class Ol{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new Ol(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=dl.create(t.facet(vl).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new Ol(i)}}ol.state=I.define({create:Ol.init,update(t,e){for(let t of e.effects)if(t.is(ol.setState))return t.value;return e.startState.facet(vl)!=e.state.facet(vl)?Ol.init(e.state):t.apply(e)}});let gl=t=>{let e=setTimeout((()=>t()),500);return()=>clearTimeout(e)};"undefined"!=typeof requestIdleCallback&&(gl=t=>{let e=-1,i=setTimeout((()=>{e=requestIdleCallback(t,{timeout:400})}),100);return()=>e<0?clearTimeout(i):cancelIdleCallback(e)});const ml="undefined"!=typeof navigator&&(null===(el=navigator.scheduling)||void 0===el?void 0:el.isInputPending)?()=>navigator.scheduling.isInputPending():null,wl=Li.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(ol.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(ol.state);e.tree==e.context.tree&&e.context.isDone(t.doc.length)||(this.working=gl(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEnd<e&&(this.chunkEnd<0||this.view.hasFocus)&&(this.chunkEnd=e+3e4,this.chunkBudget=3e3),this.chunkBudget<=0)return;let{state:i,viewport:{to:n}}=this.view,s=i.field(ol.state);if(s.tree==s.context.tree&&s.context.isDone(n+1e5))return;let r=Date.now()+Math.min(this.chunkBudget,100,t&&!ml?Math.max(25,t.timeRemaining()-5):1e9),o=s.context.treeLen<n&&i.doc.length>n+1e3,a=s.context.work((()=>ml&&ml()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:ol.setState.of(new Ol(s.context))})),this.chunkBudget>0&&(!a||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then((()=>this.scheduleWork())).catch((t=>Ii(this.view.state,t))).then((()=>this.workScheduled--)),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),vl=M.define({combine:t=>t.length?t[0]:null,enables:t=>[ol.state,wl,Bs.contentAttributes.compute([t],(e=>{let i=e.facet(t);return i&&i.name?{"data-language":i.name}:{}}))]});class bl{constructor(t,e=[]){this.language=t,this.support=e,this.extension=[t,e]}}class yl{constructor(t,e,i,n,s,r=void 0){this.name=t,this.alias=e,this.extensions=i,this.filename=n,this.loadFunc=s,this.support=r,this.loading=null}load(){return this.loading||(this.loading=this.loadFunc().then((t=>this.support=t),(t=>{throw this.loading=null,t})))}static of(t){let{load:e,support:i}=t;if(!e){if(!i)throw new RangeError("Must pass either 'load' or 'support' to LanguageDescription.of");e=()=>Promise.resolve(i)}return new yl(t.name,(t.alias||[]).concat(t.name).map((t=>t.toLowerCase())),t.extensions||[],t.filename,e,i)}static matchFilename(t,e){for(let i of t)if(i.filename&&i.filename.test(e))return i;let i=/\.([^.]+)$/.exec(e);if(i)for(let e of t)if(e.extensions.indexOf(i[1])>-1)return e;return null}static matchLanguageName(t,e,i=!0){e=e.toLowerCase();for(let i of t)if(i.alias.some((t=>t==e)))return i;if(i)for(let i of t)for(let t of i.alias){let n=e.indexOf(t);if(n>-1&&(t.length>2||!/\w/.test(e[n-1])&&!/\w/.test(e[n+t.length])))return i}return null}}const Sl=M.define(),xl=M.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some((t=>t!=e[0])))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function kl(t){let e=t.facet(xl);return 9==e.charCodeAt(0)?t.tabSize*e.length:e.length}function Ql(t,e){let i="",n=t.tabSize,s=t.facet(xl)[0];if("\t"==s){for(;e>=n;)i+="\t",e-=n;s=" "}for(let t=0;t<e;t++)i+=s;return i}function $l(t,e){t instanceof kt&&(t=new Pl(t));for(let i of t.state.facet(Sl)){let n=i(t,e);if(void 0!==n)return n}let i=hl(t.state);return i.length>=e?function(t,e,i){let n=e.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let t=[];for(let e=s;e!=n.node;e=e.parent)t.push(e);for(let e=t.length-1;e>=0;e--)n={node:t[e],next:n}}return Cl(n,t,i)}(t,i,e):null}class Pl{constructor(t,e={}){this.state=t,this.options=e,this.unit=kl(t)}lineAt(t,e=1){let i=this.state.doc.lineAt(t),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==t?{text:"",from:t}:(e<0?n<t:n<=t)?{text:i.text.slice(n-i.from),from:n}:{text:i.text.slice(0,n-i.from),from:i.from}:i}textAfterPos(t,e=1){if(this.options.simulateDoubleBreak&&t==this.options.simulateBreak)return"";let{text:i,from:n}=this.lineAt(t,e);return i.slice(t-n,Math.min(i.length,t+100-n))}column(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.countColumn(i,t-n),r=this.options.overrideIndentation?this.options.overrideIndentation(n):-1;return r>-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(t,e=t.length){return Vt(t,this.state.tabSize,e)}lineIndent(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.options.overrideIndentation;if(s){let t=s(n);if(t>-1)return t}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Zl=new Fo;function Cl(t,e,i){for(let n=t;n;n=n.next){let t=Tl(n.node);if(t)return t(Rl.create(e,i,n))}return 0}function Tl(t){let e=t.type.prop(Zl);if(e)return e;let i,n=t.firstChild;if(n&&(i=n.type.prop(Fo.closedBy))){let e=t.lastChild,n=e&&i.indexOf(e.name)>-1;return t=>Wl(t,!0,1,void 0,n&&!function(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}(t)?e.from:void 0)}return null==t.parent?Al:null}function Al(){return 0}class Rl extends Pl{constructor(t,e,i){super(t.state,t.options),this.base=t,this.pos=e,this.context=i}get node(){return this.context.node}static create(t,e,i){return new Rl(t,e,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(t){let e=this.state.doc.lineAt(t.from);for(;;){let i=t.resolve(e.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(Xl(i,t))break;e=this.state.doc.lineAt(i.from)}return this.lineIndent(e.from)}continue(){return Cl(this.context.next,this.base,this.pos)}}function Xl(t,e){for(let i=e;i;i=i.parent)if(t==i)return!0;return!1}function Yl({closing:t,align:e=!0,units:i=1}){return n=>Wl(n,e,i,t)}function Wl(t,e,i,n,s){let r=t.textAfter,o=r.match(/^\s*/)[0].length,a=n&&r.slice(o,o+n.length)==n||s==t.pos+o,l=e?function(t){let e=t.node,i=e.childAfter(e.from),n=e.lastChild;if(!i)return null;let s=t.options.simulateBreak,r=t.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let t=i.to;;){let s=e.childAfter(t);if(!s||s==n)return null;if(!s.type.isSkipped)return s.from<o?i:null;t=s.to}}(t):null;return l?a?t.column(l.from):t.column(l.to):t.baseIndent+(a?0:t.unit*i)}const Ml=t=>t.baseIndent;function jl({except:t,units:e=1}={}){return i=>{let n=t&&t.test(i.textAfter);return i.baseIndent+(n?0:e*i.unit)}}function Dl(){return kt.transactionFilter.of((t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let i=t.newDoc,{head:n}=t.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return t;let r=i.sliceString(s.from,n);if(!e.some((t=>t.test(r))))return t;let{state:o}=t,a=-1,l=[];for(let{head:t}of o.selection.ranges){let e=o.doc.lineAt(t);if(e.from==a)continue;a=e.from;let i=$l(o,e.from);if(null==i)continue;let n=/^\s*/.exec(e.text)[0],s=Ql(o,i);n!=s&&l.push({from:e.from,to:e.from+n.length,insert:s})}return l.length?[t,{changes:l,sequential:!0}]:t}))}const El=M.define(),ql=new Fo;function _l(t){let e=t.firstChild,i=t.lastChild;return e&&e.to<i.from?{from:e.to,to:i.type.isError?t.to:i.from}:null}function Vl(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function Il(t,e,i){for(let n of t.facet(El)){let s=n(t,e,i);if(s)return s}return function(t,e,i){let n=hl(t);if(n.length<i)return null;let s=null;for(let r=n.resolveStack(i,1);r;r=r.next){let o=r.node;if(o.to<=i||o.from>i)continue;if(s&&o.from<e)break;let a=o.type.prop(ql);if(a&&(o.to<n.length-50||n.length==t.doc.length||!Vl(o))){let n=a(o,t);n&&n.from<=i&&n.from>=e&&n.to>i&&(s=n)}}return s}(t,e,i)}function zl(t,e){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);return i>=n?void 0:{from:i,to:n}}const Bl=ut.define({map:zl}),Gl=ut.define({map:zl});function Ll(t){let e=[];for(let{head:i}of t.state.selection.ranges)e.some((t=>t.from<=i&&t.to>=i))||e.push(t.lineBlockAt(i));return e}const Nl=I.define({create:()=>ni.none,update(t,e){t=t.map(e.changes);for(let i of e.effects)if(i.is(Bl)&&!Hl(t,i.value.from,i.value.to)){let{preparePlaceholder:n}=e.state.facet(oh),s=n?ni.replace({widget:new ch(n(e.state,i.value))}):hh;t=t.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(Gl)&&(t=t.update({filter:(t,e)=>i.value.from!=t||i.value.to!=e,filterFrom:i.value.from,filterTo:i.value.to}));if(e.selection){let i=!1,{head:n}=e.selection.main;t.between(n,n,((t,e)=>{t<n&&e>n&&(i=!0)})),i&&(t=t.update({filterFrom:n,filterTo:n,filter:(t,e)=>e<=n||t>=n}))}return t},provide:t=>Bs.decorations.from(t),toJSON(t,e){let i=[];return t.between(0,e.doc.length,((t,e)=>{i.push(t,e)})),i},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let i=0;i<t.length;){let n=t[i++],s=t[i++];if("number"!=typeof n||"number"!=typeof s)throw new RangeError("Invalid JSON for fold state");e.push(hh.range(n,s))}return ni.set(e,!0)}});function Ul(t,e,i){var n;let s=null;return null===(n=t.field(Nl,!1))||void 0===n||n.between(e,i,((t,e)=>{(!s||s.from>t)&&(s={from:t,to:e})})),s}function Hl(t,e,i){let n=!1;return t.between(e,e,((t,s)=>{t==e&&s==i&&(n=!0)})),n}function Fl(t,e){return t.field(Nl,!1)?e:e.concat(ut.appendConfig.of(ah()))}const Jl=t=>{for(let e of Ll(t)){let i=Il(t.state,e.from,e.to);if(i)return t.dispatch({effects:Fl(t.state,[Bl.of(i),th(t,i)])}),!0}return!1},Kl=t=>{if(!t.state.field(Nl,!1))return!1;let e=[];for(let i of Ll(t)){let n=Ul(t.state,i.from,i.to);n&&e.push(Gl.of(n),th(t,n,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function th(t,e,i=!0){let n=t.state.doc.lineAt(e.from).number,s=t.state.doc.lineAt(e.to).number;return Bs.announce.of(`${t.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${t.state.phrase("to")} ${s}.`)}const eh=t=>{let{state:e}=t,i=[];for(let n=0;n<e.doc.length;){let s=t.lineBlockAt(n),r=Il(e,s.from,s.to);r&&i.push(Bl.of(r)),n=(r?t.lineBlockAt(r.to):s).to+1}return i.length&&t.dispatch({effects:Fl(t.state,i)}),!!i.length},ih=t=>{let e=t.state.field(Nl,!1);if(!e||!e.size)return!1;let i=[];return e.between(0,t.state.doc.length,((t,e)=>{i.push(Gl.of({from:t,to:e}))})),t.dispatch({effects:i}),!0};function nh(t,e){for(let i=e;;){let n=Il(t.state,i.from,i.to);if(n&&n.to>e.from)return n;if(!i.from)return null;i=t.lineBlockAt(i.from-1)}}const sh=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:Jl},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:Kl},{key:"Ctrl-Alt-[",run:eh},{key:"Ctrl-Alt-]",run:ih}],rh={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},oh=M.define({combine:t=>Qt(t,rh)});function ah(t){let e=[Nl,ph];return t&&e.push(oh.of(t)),e}function lh(t,e){let{state:i}=t,n=i.facet(oh),s=e=>{let i=t.lineBlockAt(t.posAtDOM(e.target)),n=Ul(t.state,i.from,i.to);n&&t.dispatch({effects:Gl.of(n)}),e.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(t,s,e);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const hh=ni.replace({widget:new class extends ei{toDOM(t){return lh(t,null)}}});class ch extends ei{constructor(t){super(),this.value=t}eq(t){return this.value==t.value}toDOM(t){return lh(t,this.value)}}const fh={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class uh extends vo{constructor(t,e){super(),this.config=t,this.open=e}eq(t){return this.config==t.config&&this.open==t.open}toDOM(t){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=t.state.phrase(this.open?"Fold line":"Unfold line"),e}}function dh(t={}){let e=Object.assign(Object.assign({},fh),t),i=new uh(e,!0),n=new uh(e,!1),s=Li.fromClass(class{constructor(t){this.from=t.viewport.from,this.markers=this.buildMarkers(t)}update(t){(t.docChanged||t.viewportChanged||t.startState.facet(vl)!=t.state.facet(vl)||t.startState.field(Nl,!1)!=t.state.field(Nl,!1)||hl(t.startState)!=hl(t.state)||e.foldingChanged(t))&&(this.markers=this.buildMarkers(t.view))}buildMarkers(t){let e=new At;for(let s of t.viewportLineBlocks){let r=Ul(t.state,s.from,s.to)?n:Il(t.state,s.from,s.to)?i:null;r&&e.add(s.from,s.from,r)}return e.finish()}}),{domEventHandlers:r}=e;return[s,xo({class:"cm-foldGutter",markers(t){var e;return(null===(e=t.plugin(s))||void 0===e?void 0:e.markers)||Tt.empty},initialSpacer:()=>new uh(e,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(t,e,i)=>{if(r.click&&r.click(t,e,i))return!0;let n=Ul(t.state,e.from,e.to);if(n)return t.dispatch({effects:Gl.of(n)}),!0;let s=Il(t.state,e.from,e.to);return!!s&&(t.dispatch({effects:Bl.of(s)}),!0)}})}),ah()]}const ph=Bs.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class Oh{constructor(t,e){let i;function n(t){let e=Nt.newName();return(i||(i=Object.create(null)))["."+e]=t,e}this.specs=t;const s="string"==typeof e.all?e.all:e.all?n(e.all):void 0,r=e.scope;this.scope=r instanceof ol?t=>t.prop(nl)==r.data:r?t=>t==r:void 0,this.style=Ya(t.map((t=>({tag:t.tag,class:t.class||n(Object.assign({},t,{tag:null}))}))),{all:s}).style,this.module=i?new Nt(i):null,this.themeType=e.themeType}static define(t,e){return new Oh(t,e||{})}}const gh=M.define(),mh=M.define({combine:t=>t.length?[t[0]]:null});function wh(t){let e=t.facet(gh);return e.length?e:t.facet(mh)}function vh(t,e){let i,n=[yh];return t instanceof Oh&&(t.module&&n.push(Bs.styleModule.of(t.module)),i=t.themeType),(null==e?void 0:e.fallback)?n.push(mh.of(t)):i?n.push(gh.computeN([Bs.darkTheme],(e=>e.facet(Bs.darkTheme)==("dark"==i)?[t]:[]))):n.push(gh.of(t)),n}class bh{constructor(t){this.markCache=Object.create(null),this.tree=hl(t.state),this.decorations=this.buildDeco(t,wh(t.state)),this.decoratedTo=t.viewport.to}update(t){let e=hl(t.state),i=wh(t.state),n=i!=wh(t.startState),{viewport:s}=t.view,r=t.changes.mapPos(this.decoratedTo,1);e.length<s.to&&!n&&e.type==this.tree.type&&r>=s.to?(this.decorations=this.decorations.map(t.changes),this.decoratedTo=r):(e!=this.tree||t.viewportChanged||n)&&(this.tree=e,this.decorations=this.buildDeco(t.view,i),this.decoratedTo=s.to)}buildDeco(t,e){if(!e||!this.tree.length)return ni.none;let i=new At;for(let{from:n,to:s}of t.visibleRanges)Wa(this.tree,e,((t,e,n)=>{i.add(t,e,this.markCache[n]||(this.markCache[n]=ni.mark({class:n})))}),n,s);return i.finish()}}const yh=U.high(Li.fromClass(bh,{decorations:t=>t.decorations})),Sh=Oh.define([{tag:Ka.meta,color:"#404740"},{tag:Ka.link,textDecoration:"underline"},{tag:Ka.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ka.emphasis,fontStyle:"italic"},{tag:Ka.strong,fontWeight:"bold"},{tag:Ka.strikethrough,textDecoration:"line-through"},{tag:Ka.keyword,color:"#708"},{tag:[Ka.atom,Ka.bool,Ka.url,Ka.contentSeparator,Ka.labelName],color:"#219"},{tag:[Ka.literal,Ka.inserted],color:"#164"},{tag:[Ka.string,Ka.deleted],color:"#a11"},{tag:[Ka.regexp,Ka.escape,Ka.special(Ka.string)],color:"#e40"},{tag:Ka.definition(Ka.variableName),color:"#00f"},{tag:Ka.local(Ka.variableName),color:"#30a"},{tag:[Ka.typeName,Ka.namespace],color:"#085"},{tag:Ka.className,color:"#167"},{tag:[Ka.special(Ka.variableName),Ka.macroName],color:"#256"},{tag:Ka.definition(Ka.propertyName),color:"#00c"},{tag:Ka.comment,color:"#940"},{tag:Ka.invalid,color:"#f00"}]),xh=Bs.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),kh=1e4,Qh="()[]{}",$h=M.define({combine:t=>Qt(t,{afterCursor:!0,brackets:Qh,maxScanDistance:kh,renderMatch:Ch})}),Ph=ni.mark({class:"cm-matchingBracket"}),Zh=ni.mark({class:"cm-nonmatchingBracket"});function Ch(t){let e=[],i=t.matched?Ph:Zh;return e.push(i.range(t.start.from,t.start.to)),t.end&&e.push(i.range(t.end.from,t.end.to)),e}const Th=I.define({create:()=>ni.none,update(t,e){if(!e.docChanged&&!e.selection)return t;let i=[],n=e.state.facet($h);for(let t of e.state.selection.ranges){if(!t.empty)continue;let s=Mh(e.state,t.head,-1,n)||t.head>0&&Mh(e.state,t.head-1,1,n)||n.afterCursor&&(Mh(e.state,t.head,1,n)||t.head<e.state.doc.length&&Mh(e.state,t.head+1,-1,n));s&&(i=i.concat(n.renderMatch(s,e.state)))}return ni.set(i,!0)},provide:t=>Bs.decorations.from(t)}),Ah=[Th,xh];function Rh(t={}){return[$h.of(t),Ah]}const Xh=new Fo;function Yh(t,e,i){let n=t.prop(e<0?Fo.openedBy:Fo.closedBy);if(n)return n;if(1==t.name.length){let n=i.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[i[n+e]]}return null}function Wh(t){let e=t.type.prop(Xh);return e?e(t.node):t}function Mh(t,e,i,n={}){let s=n.maxScanDistance||kh,r=n.brackets||Qh,o=hl(t),a=o.resolveInner(e,i);for(let n=a;n;n=n.parent){let s=Yh(n.type,i,r);if(s&&n.from<n.to){let o=Wh(n);if(o&&(i>0?e>=o.from&&e<o.to:e>o.from&&e<=o.to))return jh(t,e,i,n,o,s,r)}}return function(t,e,i,n,s,r,o){let a=i<0?t.sliceDoc(e-1,e):t.sliceDoc(e,e+1),l=o.indexOf(a);if(l<0||l%2==0!=i>0)return null;let h={from:i<0?e-1:e,to:i>0?e+1:e},c=t.doc.iterRange(e,i>0?t.doc.length:0),f=0;for(let t=0;!c.next().done&&t<=r;){let r=c.value;i<0&&(t+=r.length);let a=e+t*i;for(let t=i>0?0:r.length-1,e=i>0?r.length:-1;t!=e;t+=i){let e=o.indexOf(r[t]);if(!(e<0||n.resolveInner(a+t,1).type!=s))if(e%2==0==i>0)f++;else{if(1==f)return{start:h,end:{from:a+t,to:a+t+1},matched:e>>1==l>>1};f--}}i>0&&(t+=r.length)}return c.done?{start:h,matched:!1}:null}(t,e,i,o,a.type,s,r)}function jh(t,e,i,n,s,r,o){let a=n.parent,l={from:s.from,to:s.to},h=0,c=null==a?void 0:a.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from<c.to){let t=Wh(c);return{start:l,end:t?{from:t.from,to:t.to}:void 0,matched:!0}}if(Yh(c.type,i,o))h++;else if(Yh(c.type,-i,o)){if(0==h){let t=Wh(c);return{start:l,end:t&&t.from<t.to?{from:t.from,to:t.to}:void 0,matched:!1}}h--}}}while(i<0?c.prevSibling():c.nextSibling());return{start:l,matched:!1}}function Dh(t,e,i,n=0,s=0){null==e&&-1==(e=t.search(/[^\s\u00a0]/))&&(e=t.length);let r=s;for(let s=n;s<e;s++)9==t.charCodeAt(s)?r+=i-r%i:r++;return r}class Eh{constructor(t,e,i,n){this.string=t,this.tabSize=e,this.indentUnit=i,this.overrideIndent=n,this.pos=0,this.start=0,this.lastColumnPos=0,this.lastColumnValue=0}eol(){return this.pos>=this.string.length}sol(){return 0==this.pos}peek(){return this.string.charAt(this.pos)||void 0}next(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)}eat(t){let e,i=this.string.charAt(this.pos);if(e="string"==typeof t?i==t:i&&(t instanceof RegExp?t.test(i):t(i)),e)return++this.pos,i}eatWhile(t){let e=this.pos;for(;this.eat(t););return this.pos>e}eatSpace(){let t=this.pos;for(;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>t}skipToEnd(){this.pos=this.string.length}skipTo(t){let e=this.string.indexOf(t,this.pos);if(e>-1)return this.pos=e,!0}backUp(t){this.pos-=t}column(){return this.lastColumnPos<this.start&&(this.lastColumnValue=Dh(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue}indentation(){var t;return null!==(t=this.overrideIndent)&&void 0!==t?t:Dh(this.string,null,this.tabSize)}match(t,e,i){if("string"==typeof t){let n=t=>i?t.toLowerCase():t;return n(this.string.substr(this.pos,t.length))==n(t)?(!1!==e&&(this.pos+=t.length),!0):null}{let i=this.string.slice(this.pos).match(t);return i&&i.index>0?null:(i&&!1!==e&&(this.pos+=i[0].length),i)}}current(){return this.string.slice(this.start,this.pos)}}function qh(t){if("object"!=typeof t)return t;let e={};for(let i in t){let n=t[i];e[i]=n instanceof Array?n.slice():n}return e}const _h=new WeakMap;class Vh extends ol{constructor(t){let e,i=sl(t.languageData),n={name:(s=t).name||"",token:s.token,blankLine:s.blankLine||(()=>{}),startState:s.startState||(()=>!0),copyState:s.copyState||qh,indent:s.indent||(()=>null),languageData:s.languageData||{},tokenTable:s.tokenTable||Lh};var s;super(i,new class extends Qa{createParse(t,i,n){return new Bh(e,t,i,n)}},[Sl.of(((t,e)=>this.getIndent(t,e)))],t.name),this.topNode=function(t){let e=ta.define({id:Nh.length,name:"Document",props:[nl.add((()=>t))],top:!0});return Nh.push(e),e}(i),e=this,this.streamParser=n,this.stateAfter=new Fo({perNode:!0}),this.tokenTable=t.tokenTable?new Kh(n.tokenTable):tc}static define(t){return new Vh(t)}getIndent(t,e){let i,n=hl(t.state),s=n.resolve(e);for(;s&&s.type!=this.topNode;)s=s.parent;if(!s)return null;let{overrideIndentation:r}=t.options;r&&(i=_h.get(t.state),null!=i&&i<e-1e4&&(i=void 0));let o,a,l=Ih(this,n,0,s.from,null!=i?i:e);if(l?(a=l.state,o=l.pos+1):(a=this.streamParser.startState(t.unit),o=0),e-o>1e4)return null;for(;o<e;){let i=t.state.doc.lineAt(o),n=Math.min(e,i.to);if(i.length){let e=r?r(i.from):-1,s=new Eh(i.text,t.state.tabSize,t.unit,e<0?void 0:e);for(;s.pos<n-i.from;)Gh(this.streamParser.token,s,a)}else this.streamParser.blankLine(a,t.unit);if(n==e)break;o=i.to+1}let h=t.lineAt(e);return r&&null==i&&_h.set(t.state,h.from),this.streamParser.indent(a,/^\s*(.*)/.exec(h.text)[1],t)}get allowsNesting(){return!1}}function Ih(t,e,i,n,s){let r=i>=n&&i+e.length<=s&&e.prop(t.stateAfter);if(r)return{state:t.streamParser.copyState(r),pos:i+e.length};for(let r=e.children.length-1;r>=0;r--){let o=e.children[r],a=i+e.positions[r],l=o instanceof ra&&a<s&&Ih(t,o,a,n,s);if(l)return l}return null}function zh(t,e,i,n,s){if(s&&i<=0&&n>=e.length)return e;s||e.type!=t.topNode||(s=!0);for(let r=e.children.length-1;r>=0;r--){let o,a=e.positions[r],l=e.children[r];if(a<n&&l instanceof ra){if(!(o=zh(t,l,i-a,n-a,s)))break;return s?new ra(e.type,e.children.slice(0,r).concat(o),e.positions.slice(0,r+1),a+o.length):o}}return null}let Bh=class{constructor(t,e,i,n){this.lang=t,this.input=e,this.fragments=i,this.ranges=n,this.stoppedAt=null,this.chunks=[],this.chunkPos=[],this.chunk=[],this.chunkReused=void 0,this.rangeIndex=0,this.to=n[n.length-1].to;let s=dl.get(),r=n[0].from,{state:o,tree:a}=function(t,e,i,n){for(let n of e){let e,s=n.from+(n.openStart?25:0),r=n.to-(n.openEnd?25:0),o=s<=i&&r>i&&Ih(t,n.tree,0-n.offset,i,r);if(o&&(e=zh(t,n.tree,i+n.offset,o.pos+n.offset,!1)))return{state:o.state,tree:e}}return{state:t.streamParser.startState(n?kl(n):4),tree:ra.empty}}(t,i,r,null==s?void 0:s.state);this.state=o,this.parsedPos=this.chunkStart=r+a.length;for(let t=0;t<a.children.length;t++)this.chunks.push(a.children[t]),this.chunkPos.push(a.positions[t]);s&&this.parsedPos<s.viewport.from-1e5&&(this.state=this.lang.streamParser.startState(kl(s.state)),s.skipUntilInView(this.parsedPos,s.viewport.from),this.parsedPos=s.viewport.from),this.moveRangeIndex()}advance(){let t=dl.get(),e=null==this.stoppedAt?this.to:Math.min(this.to,this.stoppedAt),i=Math.min(e,this.chunkStart+2048);for(t&&(i=Math.min(i,t.viewport.to));this.parsedPos<i;)this.parseLine(t);return this.chunkStart<this.parsedPos&&this.finishChunk(),this.parsedPos>=e?this.finish():t&&this.parsedPos>=t.viewport.to?(t.skipUntilInView(this.parsedPos,e),this.finish()):null}stopAt(t){this.stoppedAt=t}lineAfter(t){let e=this.input.chunk(t);if(this.input.lineChunks)"\n"==e&&(e="");else{let t=e.indexOf("\n");t>-1&&(e=e.slice(0,t))}return t+e.length<=this.to?e:e.slice(0,this.to-t)}nextLine(){let t=this.parsedPos,e=this.lineAfter(t),i=t+e.length;for(let t=this.rangeIndex;;){let n=this.ranges[t].to;if(n>=i)break;if(e=e.slice(0,n-(i-e.length)),t++,t==this.ranges.length)break;let s=this.ranges[t].from,r=this.lineAfter(s);e+=r,i=s+r.length}return{line:e,end:i}}skipGapsTo(t,e,i){for(;;){let n=this.ranges[this.rangeIndex].to,s=t+e;if(i>0?n>s:n>=s)break;e+=this.ranges[++this.rangeIndex].from-n}return e}moveRangeIndex(){for(;this.ranges[this.rangeIndex].to<this.parsedPos;)this.rangeIndex++}emitToken(t,e,i,n,s){if(this.ranges.length>1){e+=s=this.skipGapsTo(e,s,1);let t=this.chunk.length;i+=s=this.skipGapsTo(i,s,-1),n+=this.chunk.length-t}return this.chunk.push(t,e,i,n),s}parseLine(t){let{line:e,end:i}=this.nextLine(),n=0,{streamParser:s}=this.lang,r=new Eh(e,t?t.state.tabSize:4,t?kl(t.state):2);if(r.eol())s.blankLine(this.state,r.indentUnit);else for(;!r.eol();){let t=Gh(s.token,r,this.state);if(t&&(n=this.emitToken(this.lang.tokenTable.resolve(t),this.parsedPos+r.start,this.parsedPos+r.pos,4,n)),r.start>1e4)break}this.parsedPos=i,this.moveRangeIndex(),this.parsedPos<this.to&&this.parsedPos++}finishChunk(){let t=ra.build({buffer:this.chunk,start:this.chunkStart,length:this.parsedPos-this.chunkStart,nodeSet:Uh,topID:0,maxBufferLength:2048,reused:this.chunkReused});t=new ra(t.type,t.children,t.positions,t.length,[[this.lang.stateAfter,this.lang.streamParser.copyState(this.state)]]),this.chunks.push(t),this.chunkPos.push(this.chunkStart-this.ranges[0].from),this.chunk=[],this.chunkReused=void 0,this.chunkStart=this.parsedPos}finish(){return new ra(this.lang.topNode,this.chunks,this.chunkPos,this.parsedPos-this.ranges[0].from).balance()}};function Gh(t,e,i){e.start=e.pos;for(let n=0;n<10;n++){let n=t(e,i);if(e.pos>e.start)return n}throw new Error("Stream parser failed to advance stream.")}const Lh=Object.create(null),Nh=[ta.none],Uh=new ea(Nh),Hh=[],Fh=Object.create(null),Jh=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])Jh[t]=ic(Lh,e);class Kh{constructor(t){this.extra=t,this.table=Object.assign(Object.create(null),Jh)}resolve(t){return t?this.table[t]||(this.table[t]=ic(this.extra,t)):0}}const tc=new Kh(Lh);function ec(t,e){Hh.indexOf(t)>-1||(Hh.push(t),console.warn(e))}function ic(t,e){let i=[];for(let n of e.split(" ")){let e=[];for(let i of n.split(".")){let n=t[i]||Ka[i];n?"function"==typeof n?e.length?e=e.map(n):ec(i,`Modifier ${i} used at start of tag`):e.length?ec(i,`Tag ${i} used as modifier`):e=Array.isArray(n)?n:[n]:ec(i,`Unknown highlighting tag ${i}`)}for(let t of e)i.push(t)}if(!i.length)return 0;let n=e.replace(/ /g,"_"),s=n+" "+i.map((t=>t.id)),r=Fh[s];if(r)return r.id;let o=Fh[s]=ta.define({id:Nh.length,name:n,props:[Aa({[n]:i})]});return Nh.push(o),o.id}function nc(t){return t.length<=4096&&/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac\ufb50-\ufdff]/.test(t)}function sc(t){for(let e=t.iter();!e.next().done;)if(nc(e.value))return!0;return!1}const rc=M.define({combine:t=>t.some((t=>t))});const oc=Li.fromClass(class{constructor(t){this.always=t.state.facet(rc)||t.textDirection!=ui.LTR||t.state.facet(Bs.perLineTextDirection),this.hasRTL=!this.always&&sc(t.state.doc),this.tree=hl(t.state),this.decorations=this.always||this.hasRTL?ac(t,this.tree,this.always):ni.none}update(t){let e=t.state.facet(rc)||t.view.textDirection!=ui.LTR||t.state.facet(Bs.perLineTextDirection);if(e||this.hasRTL||!function(t){let e=!1;return t.iterChanges(((t,i,n,s,r)=>{!e&&sc(r)&&(e=!0)})),e}(t.changes)||(this.hasRTL=!0),!e&&!this.hasRTL)return;let i=hl(t.state);(e!=this.always||i!=this.tree||t.docChanged||t.viewportChanged)&&(this.tree=i,this.always=e,this.decorations=ac(t.view,i,e))}},{provide:t=>{function e(e){var i,n;return null!==(n=null===(i=e.plugin(t))||void 0===i?void 0:i.decorations)&&void 0!==n?n:ni.none}return[Bs.outerDecorations.of(e),U.lowest(Bs.bidiIsolatedRanges.of(e))]}});function ac(t,e,i){let n=new At,s=t.visibleRanges;i||(s=function(t,e){let i=e.iter(),n=0,s=[],r=null;for(let{from:e,to:o}of t)for(e!=n&&(n<e&&i.next(e-n),n=e);;){let t=n,e=n+i.value.length;if(!i.lineBreak&&nc(i.value)&&(r&&r.to>t-10?r.to=Math.min(o,e):s.push(r={from:t,to:Math.min(o,e)})),n>=o)break;n=e,i.next()}return s}(s,t.state.doc));for(let{from:t,to:i}of s)e.iterate({enter:t=>{let e=t.type.prop(Fo.isolate);e&&n.add(t.from,t.to,lc[e])},from:t,to:i});return n.finish()}const lc={rtl:ni.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:ui.RTL}),ltr:ni.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:ui.LTR}),auto:ni.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var hc=Object.freeze({__proto__:null,DocInput:fl,HighlightStyle:Oh,IndentContext:Pl,LRLanguage:ll,Language:ol,LanguageDescription:yl,LanguageSupport:bl,ParseContext:dl,StreamLanguage:Vh,StringStream:Eh,TreeIndentContext:Rl,bidiIsolates:function(t={}){let e=[oc];return t.alwaysIsolate&&e.push(rc.of(!0)),e},bracketMatching:Rh,bracketMatchingHandle:Xh,codeFolding:ah,continuedIndent:jl,defaultHighlightStyle:Sh,defineLanguageFacet:sl,delimitedIndent:Yl,ensureSyntaxTree:cl,flatIndent:Ml,foldAll:eh,foldCode:Jl,foldEffect:Bl,foldGutter:dh,foldInside:_l,foldKeymap:sh,foldNodeProp:ql,foldService:El,foldState:Nl,foldable:Il,foldedRanges:function(t){return t.field(Nl,!1)||Tt.empty},forceParsing:function(t,e=t.viewport.to,i=100){let n=cl(t.state,e,i);return n!=hl(t.state)&&t.dispatch({}),!!n},getIndentUnit:kl,getIndentation:$l,highlightingFor:function(t,e,i){let n=wh(t),s=null;if(n)for(let t of n)if(!t.scope||i&&t.scope(i)){let i=t.style(e);i&&(s=s?s+" "+i:i)}return s},indentNodeProp:Zl,indentOnInput:Dl,indentRange:function(t,e,i){let n=Object.create(null),s=new Pl(t,{overrideIndentation:t=>{var e;return null!==(e=n[t])&&void 0!==e?e:-1}}),r=[];for(let o=e;o<=i;){let e=t.doc.lineAt(o);o=e.to+1;let i=$l(s,e.from);if(null==i)continue;/\S/.test(e.text)||(i=0);let a=/^\s*/.exec(e.text)[0],l=Ql(t,i);a!=l&&(n[e.from]=i,r.push({from:e.from,to:e.from+a.length,insert:l}))}return t.changes(r)},indentService:Sl,indentString:Ql,indentUnit:xl,language:vl,languageDataProp:nl,matchBrackets:Mh,sublanguageProp:rl,syntaxHighlighting:vh,syntaxParserRunning:function(t){var e;return(null===(e=t.plugin(wl))||void 0===e?void 0:e.isWorking())||!1},syntaxTree:hl,syntaxTreeAvailable:function(t,e=t.doc.length){var i;return(null===(i=t.field(ol.state,!1))||void 0===i?void 0:i.context.isDone(e))||!1},toggleFold:t=>{let e=[];for(let i of Ll(t)){let n=Ul(t.state,i.from,i.to);if(n)e.push(Gl.of(n),th(t,n,!1));else{let n=nh(t,i);n&&e.push(Bl.of(n),th(t,n))}}return e.length>0&&t.dispatch({effects:Fl(t.state,e)}),!!e.length},unfoldAll:ih,unfoldCode:Kl,unfoldEffect:Gl});function cc(t,e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=t(e,i);return!!s&&(n(i.update(s)),!0)}}const fc=cc(mc,0),uc=cc(gc,0),dc=cc(((t,e)=>gc(t,e,function(t){let e=[];for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),s=i.to<=n.to?n:t.doc.lineAt(i.to),r=e.length-1;r>=0&&e[r].to>n.from?e[r].to=s.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return e}(e))),0);function pc(t,e){let i=t.languageDataAt("commentTokens",e);return i.length?i[0]:{}}const Oc=50;function gc(t,e,i=e.selection.ranges){let n=i.map((t=>pc(e,t.from).block));if(!n.every((t=>t)))return null;let s=i.map(((t,i)=>function(t,{open:e,close:i},n,s){let r,o,a=t.sliceDoc(n-Oc,n),l=t.sliceDoc(s,s+Oc),h=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(l)[0].length,f=a.length-h;if(a.slice(f-e.length,f)==e&&l.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*Oc?r=o=t.sliceDoc(n,s):(r=t.sliceDoc(n,n+Oc),o=t.sliceDoc(s-Oc,s));let u=/^\s*/.exec(r)[0].length,d=/\s*$/.exec(o)[0].length,p=o.length-d-i.length;return r.slice(u,u+e.length)==e&&o.slice(p,p+i.length)==i?{open:{pos:n+u+e.length,margin:/\s/.test(r.charAt(u+e.length))?1:0},close:{pos:s-d-i.length,margin:/\s/.test(o.charAt(p-1))?1:0}}:null}(e,n[i],t.from,t.to)));if(2!=t&&!s.every((t=>t)))return{changes:e.changes(i.map(((t,e)=>s[e]?[]:[{from:t.from,insert:n[e].open+" "},{from:t.to,insert:" "+n[e].close}])))};if(1!=t&&s.some((t=>t))){let t=[];for(let e,i=0;i<s.length;i++)if(e=s[i]){let s=n[i],{open:r,close:o}=e;t.push({from:r.pos-s.open.length,to:r.pos+r.margin},{from:o.pos-o.margin,to:o.pos+s.close.length})}return{changes:t}}return null}function mc(t,e,i=e.selection.ranges){let n=[],s=-1;for(let{from:t,to:r}of i){let i=n.length,o=1e9,a=pc(e,t).line;if(a){for(let i=t;i<=r;){let l=e.doc.lineAt(i);if(l.from>s&&(t==r||r>l.from)){s=l.from;let t=/^\s*/.exec(l.text)[0].length,e=t==l.length,i=l.text.slice(t,t+a.length)==a?t:-1;t<l.text.length&&t<o&&(o=t),n.push({line:l,comment:i,token:a,indent:t,empty:e,single:!1})}i=l.to+1}if(o<1e9)for(let t=i;t<n.length;t++)n[t].indent<n[t].line.text.length&&(n[t].indent=o);n.length==i+1&&(n[i].single=!0)}}if(2!=t&&n.some((t=>t.comment<0&&(!t.empty||t.single)))){let t=[];for(let{line:e,token:i,indent:s,empty:r,single:o}of n)!o&&r||t.push({from:e.from+s,insert:i+" "});let i=e.changes(t);return{changes:i,selection:e.selection.map(i,1)}}if(1!=t&&n.some((t=>t.comment>=0))){let t=[];for(let{line:e,comment:i,token:s}of n)if(i>=0){let n=e.from+i,r=n+s.length;" "==e.text[r-e.from]&&r++,t.push({from:n,to:r})}return{changes:t}}return null}const wc=ht.define(),vc=ht.define(),bc=M.define(),yc=M.define({combine:t=>Qt(t,{minDepth:100,newGroupDelay:500,joinToEvent:(t,e)=>e},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(t,e)=>(i,n)=>t(i,n)||e(i,n)})}),Sc=I.define({create:()=>Ec.empty,update(t,e){let i=e.state.facet(yc),n=e.annotation(wc);if(n){let s=Cc.fromTransaction(e,n.selection),r=n.side,o=0==r?t.undone:t.done;return o=s?Tc(o,o.length,i.minDepth,s):Yc(o,e.startState.selection),new Ec(0==r?n.rest:o,0==r?o:n.rest)}let s=e.annotation(vc);if("full"!=s&&"before"!=s||(t=t.isolate()),!1===e.annotation(dt.addToHistory))return e.changes.empty?t:t.addMapping(e.changes.desc);let r=Cc.fromTransaction(e),o=e.annotation(dt.time),a=e.annotation(dt.userEvent);return r?t=t.addChanges(r,o,a,i,e):e.selection&&(t=t.addSelection(e.startState.selection,o,a,i.newGroupDelay)),"full"!=s&&"after"!=s||(t=t.isolate()),t},toJSON:t=>({done:t.done.map((t=>t.toJSON())),undone:t.undone.map((t=>t.toJSON()))}),fromJSON:t=>new Ec(t.done.map(Cc.fromJSON),t.undone.map(Cc.fromJSON))});function xc(t={}){return[Sc,yc.of(t),Bs.domEventHandlers({beforeinput(t,e){let i="historyUndo"==t.inputType?Qc:"historyRedo"==t.inputType?$c:null;return!!i&&(t.preventDefault(),i(e))}})]}function kc(t,e){return function({state:i,dispatch:n}){if(!e&&i.readOnly)return!1;let s=i.field(Sc,!1);if(!s)return!1;let r=s.pop(t,i,e);return!!r&&(n(r),!0)}}const Qc=kc(0,!1),$c=kc(1,!1),Pc=kc(0,!0),Zc=kc(1,!0);class Cc{constructor(t,e,i,n,s){this.changes=t,this.effects=e,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(t){return new Cc(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){var t,e,i;return{changes:null===(t=this.changes)||void 0===t?void 0:t.toJSON(),mapped:null===(e=this.mapped)||void 0===e?void 0:e.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((t=>t.toJSON()))}}static fromJSON(t){return new Cc(t.changes&&Q.fromJSON(t.changes),[],t.mapped&&k.fromJSON(t.mapped),t.startSelection&&X.fromJSON(t.startSelection),t.selectionsAfter.map(X.fromJSON))}static fromTransaction(t,e){let i=Rc;for(let e of t.startState.facet(bc)){let n=e(t);n.length&&(i=i.concat(n))}return!i.length&&t.changes.empty?null:new Cc(t.changes.invert(t.startState.doc),i,void 0,e||t.startState.selection,Rc)}static selection(t){return new Cc(void 0,Rc,void 0,void 0,t)}}function Tc(t,e,i,n){let s=e+1>i+20?e-i-1:0,r=t.slice(s,e);return r.push(n),r}function Ac(t,e){return t.length?e.length?t.concat(e):t:e}const Rc=[],Xc=200;function Yc(t,e){if(t.length){let i=t[t.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Xc));return n.length&&n[n.length-1].eq(e)?t:(n.push(e),Tc(t,t.length-1,1e9,i.setSelAfter(n)))}return[Cc.selection([e])]}function Wc(t){let e=t[t.length-1],i=t.slice();return i[t.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),i}function Mc(t,e){if(!t.length)return t;let i=t.length,n=Rc;for(;i;){let s=jc(t[i-1],e,n);if(s.changes&&!s.changes.empty||s.effects.length){let e=t.slice(0,i);return e[i-1]=s,e}e=s.mapped,i--,n=s.selectionsAfter}return n.length?[Cc.selection(n)]:Rc}function jc(t,e,i){let n=Ac(t.selectionsAfter.length?t.selectionsAfter.map((t=>t.map(e))):Rc,i);if(!t.changes)return Cc.selection(n);let s=t.changes.map(e),r=e.mapDesc(t.changes,!0),o=t.mapped?t.mapped.composeDesc(r):r;return new Cc(s,ut.mapEffects(t.effects,e),o,t.startSelection.map(r),n)}const Dc=/^(input\.type|delete)($|\.)/;class Ec{constructor(t,e,i=0,n=void 0){this.done=t,this.undone=e,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new Ec(this.done,this.undone):this}addChanges(t,e,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&t.changes&&(!i||Dc.test(i))&&(!o.selectionsAfter.length&&e-this.prevTime<n.newGroupDelay&&n.joinToEvent(s,function(t,e){let i=[],n=!1;return t.iterChangedRanges(((t,e)=>i.push(t,e))),e.iterChangedRanges(((t,e,s,r)=>{for(let t=0;t<i.length;){let e=i[t++],o=i[t++];r>=e&&s<=o&&(n=!0)}})),n}(o.changes,t.changes))||"input.type.compose"==i)?Tc(r,r.length-1,n.minDepth,new Cc(t.changes.compose(o.changes),Ac(t.effects,o.effects),o.mapped,o.startSelection,Rc)):Tc(r,r.length,n.minDepth,t),new Ec(r,Rc,e,i)}addSelection(t,e,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:Rc;return s.length>0&&e-this.prevTime<n&&i==this.prevUserEvent&&i&&/^select($|\.)/.test(i)&&(r=s[s.length-1],o=t,r.ranges.length==o.ranges.length&&0===r.ranges.filter(((t,e)=>t.empty!=o.ranges[e].empty)).length)?this:new Ec(Yc(this.done,t),this.undone,e,i);var r,o}addMapping(t){return new Ec(Mc(this.done,t),Mc(this.undone,t),this.prevTime,this.prevUserEvent)}pop(t,e,i){let n=0==t?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1],r=s.selectionsAfter[0]||e.selection;if(i&&s.selectionsAfter.length)return e.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:wc.of({side:t,rest:Wc(n),selection:r}),userEvent:0==t?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?Rc:n.slice(0,n.length-1);return s.mapped&&(i=Mc(i,s.mapped)),e.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:wc.of({side:t,rest:i,selection:r}),filter:!1,userEvent:0==t?"undo":"redo",scrollIntoView:!0})}return null}}Ec.empty=new Ec(Rc,Rc);const qc=[{key:"Mod-z",run:Qc,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:$c,preventDefault:!0},{linux:"Ctrl-Shift-z",run:$c,preventDefault:!0},{key:"Mod-u",run:Pc,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:Zc,preventDefault:!0}];function _c(t,e){return X.create(t.ranges.map(e),t.mainIndex)}function Vc(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Ic({state:t,dispatch:e},i){let n=_c(t.selection,i);return!n.eq(t.selection,!0)&&(e(Vc(t,n)),!0)}function zc(t,e){return X.cursor(e?t.to:t.from)}function Bc(t,e){return Ic(t,(i=>i.empty?t.moveByChar(i,e):zc(i,e)))}function Gc(t){return t.textDirectionAt(t.state.selection.main.head)==ui.LTR}const Lc=t=>Bc(t,!Gc(t)),Nc=t=>Bc(t,Gc(t));function Uc(t,e){return Ic(t,(i=>i.empty?t.moveByGroup(i,e):zc(i,e)))}function Hc(t,e,i){if(e.type.prop(i))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function Fc(t,e,i){let n,s,r=hl(t).resolveInner(e.head),o=i?Fo.closedBy:Fo.openedBy;for(let n=e.head;;){let e=i?r.childAfter(n):r.childBefore(n);if(!e)break;Hc(t,e,o)?r=e:n=i?e.to:e.from}return s=r.type.prop(o)&&(n=i?Mh(t,r.from,1):Mh(t,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,X.cursor(s,i?-1:1)}function Jc(t,e){return Ic(t,(i=>{if(!i.empty)return zc(i,e);let n=t.moveVertically(i,e);return n.head!=i.head?n:t.moveToLineBoundary(i,e)}))}const Kc=t=>Jc(t,!1),tf=t=>Jc(t,!0);function ef(t){let e,i=t.scrollDOM.clientHeight<t.scrollDOM.scrollHeight-2,n=0,s=0;if(i){for(let e of t.state.facet(Bs.scrollMargins)){let i=e(t);(null==i?void 0:i.top)&&(n=Math.max(null==i?void 0:i.top,n)),(null==i?void 0:i.bottom)&&(s=Math.max(null==i?void 0:i.bottom,s))}e=t.scrollDOM.clientHeight-n-s}else e=(t.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:n,marginBottom:s,selfScroll:i,height:Math.max(t.defaultLineHeight,e-5)}}function nf(t,e){let i,n=ef(t),{state:s}=t,r=_c(s.selection,(i=>i.empty?t.moveVertically(i,e,n.height):zc(i,e)));if(r.eq(s.selection))return!1;if(n.selfScroll){let e=t.coordsAtPos(s.selection.main.head),o=t.scrollDOM.getBoundingClientRect(),a=o.top+n.marginTop,l=o.bottom-n.marginBottom;e&&e.top>a&&e.bottom<l&&(i=Bs.scrollIntoView(r.main.head,{y:"start",yMargin:e.top-a}))}return t.dispatch(Vc(s,r),{effects:i}),!0}const sf=t=>nf(t,!1),rf=t=>nf(t,!0);function of(t,e,i){let n=t.lineBlockAt(e.head),s=t.moveToLineBoundary(e,i);if(s.head==e.head&&s.head!=(i?n.to:n.from)&&(s=t.moveToLineBoundary(e,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(t.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&e.head!=n.from+i&&(s=X.cursor(n.from+i))}return s}function af(t,e){let i=_c(t.state.selection,(t=>{let i=e(t);return X.range(t.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(t.state.selection)&&(t.dispatch(Vc(t.state,i)),!0)}function lf(t,e){return af(t,(i=>t.moveByChar(i,e)))}const hf=t=>lf(t,!Gc(t)),cf=t=>lf(t,Gc(t));function ff(t,e){return af(t,(i=>t.moveByGroup(i,e)))}function uf(t,e){return af(t,(i=>t.moveVertically(i,e)))}const df=t=>uf(t,!1),pf=t=>uf(t,!0);function Of(t,e){return af(t,(i=>t.moveVertically(i,e,ef(t).height)))}const gf=t=>Of(t,!1),mf=t=>Of(t,!0),wf=({state:t,dispatch:e})=>(e(Vc(t,{anchor:0})),!0),vf=({state:t,dispatch:e})=>(e(Vc(t,{anchor:t.doc.length})),!0),bf=({state:t,dispatch:e})=>(e(Vc(t,{anchor:t.selection.main.anchor,head:0})),!0),yf=({state:t,dispatch:e})=>(e(Vc(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0);function Sf(t,e){if(t.state.readOnly)return!1;let i="delete.selection",{state:n}=t,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=e(n);o<s?(i="delete.backward",o=xf(t,o,!1)):o>s&&(i="delete.forward",o=xf(t,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=xf(t,s,!1),r=xf(t,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:X.cursor(s,s<n.head?-1:1)}}));return!s.changes.empty&&(t.dispatch(n.update(s,{scrollIntoView:!0,userEvent:i,effects:"delete.selection"==i?Bs.announce.of(n.phrase("Selection deleted")):void 0})),!0)}function xf(t,e,i){if(t instanceof Bs)for(let n of t.state.facet(Bs.atomicRanges).map((e=>e(t))))n.between(e,e,((t,n)=>{t<e&&n>e&&(e=i?n:t)}));return e}const kf=(t,e)=>Sf(t,(i=>{let n,s,r=i.from,{state:o}=t,a=o.doc.lineAt(r);if(!e&&r>a.from&&r<a.from+200&&!/[^ \t]/.test(n=a.text.slice(0,r-a.from))){if("\t"==n[n.length-1])return r-1;let t=Vt(n,o.tabSize)%kl(o)||kl(o);for(let e=0;e<t&&" "==n[n.length-1-e];e++)r--;s=r}else s=p(a.text,r-a.from,e,e)+a.from,s==r&&a.number!=(e?o.doc.lines:1)?s+=e?1:-1:!e&&/[\ufe00-\ufe0f]/.test(a.text.slice(s-a.from,r-a.from))&&(s=p(a.text,s-a.from,!1,!1)+a.from);return s})),Qf=t=>kf(t,!1),$f=t=>kf(t,!0),Pf=(t,e)=>Sf(t,(i=>{let n=i.head,{state:s}=t,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let t=null;;){if(n==(e?r.to:r.from)){n==i.head&&r.number!=(e?s.doc.lines:1)&&(n+=e?1:-1);break}let a=p(r.text,n-r.from,e)+r.from,l=r.text.slice(Math.min(n,a)-r.from,Math.max(n,a)-r.from),h=o(l);if(null!=t&&h!=t)break;" "==l&&n==i.head||(t=h),n=a}return n})),Zf=t=>Pf(t,!1);function Cf(t){let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.from),r=t.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=t.doc.lineAt(n.to-1)),i>=s.number){let t=e[e.length-1];t.to=r.to,t.ranges.push(n)}else e.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return e}function Tf(t,e,i){if(t.readOnly)return!1;let n=[],s=[];for(let e of Cf(t)){if(i?e.to==t.doc.length:0==e.from)continue;let r=t.doc.lineAt(i?e.to+1:e.from-1),o=r.length+1;if(i){n.push({from:e.to,to:r.to},{from:e.from,insert:r.text+t.lineBreak});for(let i of e.ranges)s.push(X.range(Math.min(t.doc.length,i.anchor+o),Math.min(t.doc.length,i.head+o)))}else{n.push({from:r.from,to:e.from},{from:e.to,insert:t.lineBreak+r.text});for(let t of e.ranges)s.push(X.range(t.anchor-o,t.head-o))}}return!!n.length&&(e(t.update({changes:n,scrollIntoView:!0,selection:X.create(s,t.selection.mainIndex),userEvent:"move.line"})),!0)}function Af(t,e,i){if(t.readOnly)return!1;let n=[];for(let e of Cf(t))i?n.push({from:e.from,insert:t.doc.slice(e.from,e.to)+t.lineBreak}):n.push({from:e.to,insert:t.lineBreak+t.doc.slice(e.from,e.to)});return e(t.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Rf=Xf(!1);function Xf(e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),a=!e&&s==r&&function(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let i,n=hl(t).resolveInner(e),s=n.childBefore(e),r=n.childAfter(e);return s&&r&&s.to<=e&&r.from>=e&&(i=s.type.prop(Fo.closedBy))&&i.indexOf(r.name)>-1&&t.doc.lineAt(s.to).from==t.doc.lineAt(r.from).from&&!/\S/.test(t.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);e&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let l=new Pl(i,{simulateBreak:s,simulateDoubleBreak:!!a}),h=$l(l,s);for(null==h&&(h=Vt(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));r<o.to&&/\s/.test(o.text[r-o.from]);)r++;a?({from:s,to:r}=a):s>o.from&&s<o.from+100&&!/\S/.test(o.text.slice(0,s))&&(s=o.from);let c=["",Ql(i,h)];return a&&c.push(Ql(i,l.lineIndent(o.from,-1))),{changes:{from:s,to:r,insert:t.of(c)},range:X.cursor(s+1+c[1].length)}}));return n(i.update(s,{scrollIntoView:!0,userEvent:"input"})),!0}}function Yf(t,e){let i=-1;return t.changeByRange((n=>{let s=[];for(let r=n.from;r<=n.to;){let o=t.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(e(o,s,n),i=o.number),r=o.to+1}let r=t.changes(s);return{changes:s,range:X.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Wf=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:t=>Ic(t,(e=>Fc(t.state,e,!Gc(t)))),shift:t=>af(t,(e=>Fc(t.state,e,!Gc(t))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:t=>Ic(t,(e=>Fc(t.state,e,Gc(t)))),shift:t=>af(t,(e=>Fc(t.state,e,Gc(t))))},{key:"Alt-ArrowUp",run:({state:t,dispatch:e})=>Tf(t,e,!1)},{key:"Shift-Alt-ArrowUp",run:({state:t,dispatch:e})=>Af(t,e,!1)},{key:"Alt-ArrowDown",run:({state:t,dispatch:e})=>Tf(t,e,!0)},{key:"Shift-Alt-ArrowDown",run:({state:t,dispatch:e})=>Af(t,e,!0)},{key:"Escape",run:({state:t,dispatch:e})=>{let i=t.selection,n=null;return i.ranges.length>1?n=X.create([i.main]):i.main.empty||(n=X.create([X.cursor(i.main.head)])),!!n&&(e(Vc(t,n)),!0)}},{key:"Mod-Enter",run:Xf(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:t,dispatch:e})=>{let i=Cf(t).map((({from:e,to:i})=>X.range(e,Math.min(i+1,t.doc.length))));return e(t.update({selection:X.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:t,dispatch:e})=>{let i=_c(t.selection,(e=>{var i;for(let n=hl(t).resolveStack(e.from,1);n;n=n.next){let{node:t}=n;if((t.from<e.from&&t.to>=e.to||t.to>e.to&&t.from<=e.from)&&(null===(i=t.parent)||void 0===i?void 0:i.parent))return X.range(t.to,t.from)}return e}));return e(Vc(t,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Yf(t,((e,i)=>{let n=/^\s*/.exec(e.text)[0];if(!n)return;let s=Vt(n,t.tabSize),r=0,o=Ql(t,Math.max(0,s-kl(t)));for(;r<n.length&&r<o.length&&n.charCodeAt(r)==o.charCodeAt(r);)r++;i.push({from:e.from+r,to:e.from+n.length,insert:o.slice(r)})})),{userEvent:"delete.dedent"})),!0)},{key:"Mod-]",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Yf(t,((e,i)=>{i.push({from:e.from,insert:t.facet(xl)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Object.create(null),n=new Pl(t,{overrideIndentation:t=>{let e=i[t];return null==e?-1:e}}),s=Yf(t,((e,s,r)=>{let o=$l(n,e.from);if(null==o)return;/\S/.test(e.text)||(o=0);let a=/^\s*/.exec(e.text)[0],l=Ql(t,o);(a!=l||r.from<e.from+a.length)&&(i[e.from]=o,s.push({from:e.from,to:e.from+a.length,insert:l}))}));return s.changes.empty||e(t.update(s,{userEvent:"indent"})),!0}},{key:"Shift-Mod-k",run:t=>{if(t.state.readOnly)return!1;let{state:e}=t,i=e.changes(Cf(e).map((({from:t,to:i})=>(t>0?t--:i<e.doc.length&&i++,{from:t,to:i})))),n=_c(e.selection,(e=>t.moveVertically(e,!0))).map(i);return t.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:t,dispatch:e})=>function(t,e,i){let n=!1,s=_c(t.selection,(e=>{let s=Mh(t,e.head,-1)||Mh(t,e.head,1)||e.head>0&&Mh(t,e.head-1,1)||e.head<t.doc.length&&Mh(t,e.head+1,-1);if(!s||!s.end)return e;n=!0;let r=s.start.from==e.head?s.end.to:s.end.from;return i?X.range(e.anchor,r):X.cursor(r)}));return!!n&&(e(Vc(t,s)),!0)}(t,e,!1)},{key:"Mod-/",run:t=>{let{state:e}=t,i=e.doc.lineAt(e.selection.main.from),n=pc(t.state,i.from);return n.line?fc(t):!!n.block&&dc(t)}},{key:"Alt-A",run:uc}].concat([{key:"ArrowLeft",run:Lc,shift:hf,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:t=>Uc(t,!Gc(t)),shift:t=>ff(t,!Gc(t)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:t=>Ic(t,(e=>of(t,e,!Gc(t)))),shift:t=>af(t,(e=>of(t,e,!Gc(t)))),preventDefault:!0},{key:"ArrowRight",run:Nc,shift:cf,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:t=>Uc(t,Gc(t)),shift:t=>ff(t,Gc(t)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:t=>Ic(t,(e=>of(t,e,Gc(t)))),shift:t=>af(t,(e=>of(t,e,Gc(t)))),preventDefault:!0},{key:"ArrowUp",run:Kc,shift:df,preventDefault:!0},{mac:"Cmd-ArrowUp",run:wf,shift:bf},{mac:"Ctrl-ArrowUp",run:sf,shift:gf},{key:"ArrowDown",run:tf,shift:pf,preventDefault:!0},{mac:"Cmd-ArrowDown",run:vf,shift:yf},{mac:"Ctrl-ArrowDown",run:rf,shift:mf},{key:"PageUp",run:sf,shift:gf},{key:"PageDown",run:rf,shift:mf},{key:"Home",run:t=>Ic(t,(e=>of(t,e,!1))),shift:t=>af(t,(e=>of(t,e,!1))),preventDefault:!0},{key:"Mod-Home",run:wf,shift:bf},{key:"End",run:t=>Ic(t,(e=>of(t,e,!0))),shift:t=>af(t,(e=>of(t,e,!0))),preventDefault:!0},{key:"Mod-End",run:vf,shift:yf},{key:"Enter",run:Rf},{key:"Mod-a",run:({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:Qf,shift:Qf},{key:"Delete",run:$f},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Zf},{key:"Mod-Delete",mac:"Alt-Delete",run:t=>Pf(t,!0)},{mac:"Mod-Backspace",run:t=>Sf(t,(e=>{let i=t.moveToLineBoundary(e,!1).head;return e.head>i?i:Math.max(0,e.head-1)}))},{mac:"Mod-Delete",run:t=>Sf(t,(e=>{let i=t.moveToLineBoundary(e,!0).head;return e.head<i?i:Math.min(t.state.doc.length,e.head+1)}))}].concat([{key:"Ctrl-b",run:Lc,shift:hf,preventDefault:!0},{key:"Ctrl-f",run:Nc,shift:cf},{key:"Ctrl-p",run:Kc,shift:df},{key:"Ctrl-n",run:tf,shift:pf},{key:"Ctrl-a",run:t=>Ic(t,(e=>X.cursor(t.lineBlockAt(e.head).from,1))),shift:t=>af(t,(e=>X.cursor(t.lineBlockAt(e.head).from)))},{key:"Ctrl-e",run:t=>Ic(t,(e=>X.cursor(t.lineBlockAt(e.head).to,-1))),shift:t=>af(t,(e=>X.cursor(t.lineBlockAt(e.head).to)))},{key:"Ctrl-d",run:$f},{key:"Ctrl-h",run:Qf},{key:"Ctrl-k",run:t=>Sf(t,(e=>{let i=t.lineBlockAt(e.head).to;return e.head<i?i:Math.min(t.state.doc.length,e.head+1)}))},{key:"Ctrl-Alt-h",run:Zf},{key:"Ctrl-o",run:({state:e,dispatch:i})=>{if(e.readOnly)return!1;let n=e.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t.of(["",""])},range:X.cursor(e.from)})));return i(e.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=t.changeByRange((e=>{if(!e.empty||0==e.from||e.from==t.doc.length)return{range:e};let i=e.from,n=t.doc.lineAt(i),s=i==n.from?i-1:p(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:p(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:t.doc.slice(i,r).append(t.doc.slice(s,i))},range:X.cursor(r)}}));return!i.changes.empty&&(e(t.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:rf}].map((t=>({mac:t.key,run:t.run,shift:t.shift})))));function Mf(){var t=arguments[0];"string"==typeof t&&(t=document.createElement(t));var e=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?t.setAttribute(n,s):null!=s&&(t[n]=s)}e++}for(;e<arguments.length;e++)jf(t,arguments[e]);return t}function jf(t,e){if("string"==typeof e)t.appendChild(document.createTextNode(e));else if(null==e);else if(null!=e.nodeType)t.appendChild(e);else{if(!Array.isArray(e))throw new RangeError("Unsupported child node: "+e);for(var i=0;i<e.length;i++)jf(t,e[i])}}const Df="function"==typeof String.prototype.normalize?t=>t.normalize("NFKD"):t=>t;class Ef{constructor(t,e,i=0,n=t.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=t.iterRange(i,n),this.bufferStart=i,this.normalize=s?t=>s(Df(t)):Df,this.query=this.normalize(e)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return v(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let t=this.peek();if(t<0)return this.done=!0,this;let e=b(t),i=this.bufferStart+this.bufferPos;this.bufferPos+=y(t);let n=this.normalize(e);for(let t=0,s=i;;t++){let r=n.charCodeAt(t),o=this.match(r,s);if(t==n.length-1){if(o)return this.value=o,this;break}s==i&&t<e.length&&e.charCodeAt(t)==r&&s++}}}match(t,e){let i=null;for(let n=0;n<this.matches.length;n+=2){let s=this.matches[n],r=!1;this.query.charCodeAt(s)==t&&(s==this.query.length-1?i={from:this.matches[n+1],to:e+1}:(this.matches[n]++,r=!0)),r||(this.matches.splice(n,2),n-=2)}return this.query.charCodeAt(0)==t&&(1==this.query.length?i={from:e,to:e+1}:this.matches.push(1,e)),i&&this.test&&!this.test(i.from,i.to,this.buffer,this.bufferStart)&&(i=null),i}}"undefined"!=typeof Symbol&&(Ef.prototype[Symbol.iterator]=function(){return this});const qf={from:-1,to:-1,match:/.*/.exec("")},_f="gm"+(null==/x/.unicode?"":"u");class Vf{constructor(t,e,i,n=0,s=t.length){if(this.text=t,this.to=s,this.curLine="",this.done=!1,this.value=qf,/\\[sWDnr]|\n|\r|\[\^/.test(e))return new Bf(t,e,i,n,s);this.re=new RegExp(e,_f+((null==i?void 0:i.ignoreCase)?"i":"")),this.test=null==i?void 0:i.test,this.iter=t.iter();let r=t.lineAt(n);this.curLineStart=r.from,this.matchPos=Gf(t,n),this.getLine(this.curLineStart)}getLine(t){this.iter.next(t),this.iter.lineBreak?this.curLine="":(this.curLine=this.iter.value,this.curLineStart+this.curLine.length>this.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let t=this.matchPos-this.curLineStart;;){this.re.lastIndex=t;let e=this.matchPos<=this.to&&this.re.exec(this.curLine);if(e){let i=this.curLineStart+e.index,n=i+e[0].length;if(this.matchPos=Gf(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(i<n||i>this.value.to)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this;t=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length<this.to))return this.done=!0,this;this.nextLine(),t=0}}}}const If=new WeakMap;class zf{constructor(t,e){this.from=t,this.text=e}get to(){return this.from+this.text.length}static get(t,e,i){let n=If.get(t);if(!n||n.from>=i||n.to<=e){let n=new zf(e,t.sliceString(e,i));return If.set(t,n),n}if(n.from==e&&n.to==i)return n;let{text:s,from:r}=n;return r>e&&(s=t.sliceString(e,r)+s,r=e),n.to<i&&(s+=t.sliceString(n.to,i)),If.set(t,new zf(r,s)),new zf(e,s.slice(e-r,i-r))}}class Bf{constructor(t,e,i,n,s){this.text=t,this.to=s,this.done=!1,this.value=qf,this.matchPos=Gf(t,n),this.re=new RegExp(e,_f+((null==i?void 0:i.ignoreCase)?"i":"")),this.test=null==i?void 0:i.test,this.flat=zf.get(t,n,this.chunkEnd(n+5e3))}chunkEnd(t){return t>=this.to?this.to:this.text.lineAt(t).to}next(){for(;;){let t=this.re.lastIndex=this.matchPos-this.flat.from,e=this.re.exec(this.flat.text);if(e&&!e[0]&&e.index==t&&(this.re.lastIndex=t+1,e=this.re.exec(this.flat.text)),e){let t=this.flat.from+e.index,i=t+e[0].length;if((this.flat.to>=this.to||e.index+e[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,i,e)))return this.value={from:t,to:i,match:e},this.matchPos=Gf(this.text,i+(t==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=zf.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function Gf(t,e){if(e>=t.length)return e;let i,n=t.lineAt(e);for(;e<n.to&&(i=n.text.charCodeAt(e-n.from))>=56320&&i<57344;)e++;return e}function Lf(t){let e=Mf("input",{class:"cm-textfield",name:"line",value:String(t.state.doc.lineAt(t.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(e.value);if(!i)return;let{state:n}=t,s=n.doc.lineAt(n.selection.main.head),[,r,o,a,l]=i,h=a?+a.slice(1):0,c=o?+o:s.number;if(o&&l){let t=c/100;r&&(t=t*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*t)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let f=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),u=X.cursor(f.from+Math.max(0,Math.min(h,f.length)));t.dispatch({effects:[Nf.of(!1),Bs.scrollIntoView(u.from,{y:"center"})],selection:u}),t.focus()}return{dom:Mf("form",{class:"cm-gotoLine",onkeydown:e=>{27==e.keyCode?(e.preventDefault(),t.dispatch({effects:Nf.of(!1)}),t.focus()):13==e.keyCode&&(e.preventDefault(),i())},onsubmit:t=>{t.preventDefault(),i()}},Mf("label",t.state.phrase("Go to line"),": ",e)," ",Mf("button",{class:"cm-button",type:"submit"},t.state.phrase("go")))}}"undefined"!=typeof Symbol&&(Vf.prototype[Symbol.iterator]=Bf.prototype[Symbol.iterator]=function(){return this});const Nf=ut.define(),Uf=I.define({create:()=>!0,update(t,e){for(let i of e.effects)i.is(Nf)&&(t=i.value);return t},provide:t=>wo.from(t,(t=>t?Lf:null))}),Hf=Bs.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),Ff={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Jf=M.define({combine:t=>Qt(t,Ff,{highlightWordAroundCursor:(t,e)=>t||e,minSelectionLength:Math.min,maxMatches:Math.min})});function Kf(t){let e=[su,nu];return t&&e.push(Jf.of(t)),e}const tu=ni.mark({class:"cm-selectionMatch"}),eu=ni.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function iu(t,e,i,n){return!(0!=i&&t(e.sliceDoc(i-1,i))==bt.Word||n!=e.doc.length&&t(e.sliceDoc(n,n+1))==bt.Word)}const nu=Li.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(Jf),{state:i}=t,n=i.selection;if(n.ranges.length>1)return ni.none;let s,r=n.main,o=null;if(r.empty){if(!e.highlightWordAroundCursor)return ni.none;let t=i.wordAt(r.head);if(!t)return ni.none;o=i.charCategorizer(r.head),s=i.sliceDoc(t.from,t.to)}else{let t=r.to-r.from;if(t<e.minSelectionLength||t>200)return ni.none;if(e.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!iu(o,i,r.from,r.to)||!function(t,e,i,n){return t(e.sliceDoc(i,i+1))==bt.Word&&t(e.sliceDoc(n-1,n))==bt.Word}(o,i,r.from,r.to))return ni.none}else if(s=i.sliceDoc(r.from,r.to).trim(),!s)return ni.none}let a=[];for(let n of t.visibleRanges){let t=new Ef(i.doc,s,n.from,n.to);for(;!t.next().done;){let{from:n,to:s}=t.value;if((!o||iu(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?a.push(eu.range(n,s)):(n>=r.to||s<=r.from)&&a.push(tu.range(n,s)),a.length>e.maxMatches))return ni.none}}return ni.set(a)}},{decorations:t=>t.decorations}),su=Bs.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}});const ru=M.define({combine:t=>Qt(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:t=>new Yu(t),scrollToMatch:t=>Bs.scrollIntoView(t)})});class ou{constructor(t){this.search=t.search,this.caseSensitive=!!t.caseSensitive,this.literal=!!t.literal,this.regexp=!!t.regexp,this.replace=t.replace||"",this.valid=!!this.search&&(!this.regexp||function(t){try{return new RegExp(t,_f),!0}catch(t){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!t.wholeWord}unquote(t){return this.literal?t:t.replace(/\\([nrt\\])/g,((t,e)=>"n"==e?"\n":"r"==e?"\r":"t"==e?"\t":"\\"))}eq(t){return this.search==t.search&&this.replace==t.replace&&this.caseSensitive==t.caseSensitive&&this.regexp==t.regexp&&this.wholeWord==t.wholeWord}create(){return this.regexp?new du(this):new hu(this)}getCursor(t,e=0,i){let n=t.doc?t:kt.create({doc:t});return null==i&&(i=n.doc.length),this.regexp?cu(this,n,e,i):lu(this,n,e,i)}}class au{constructor(t){this.spec=t}}function lu(t,e,i,n){return new Ef(e.doc,t.unquoted,i,n,t.caseSensitive?void 0:t=>t.toLowerCase(),t.wholeWord?function(t,e){return(i,n,s,r)=>((r>i||r+s.length<n)&&(r=Math.max(0,i-2),s=t.sliceString(r,Math.min(t.length,n+2))),!(e(fu(s,i-r))==bt.Word&&e(uu(s,i-r))==bt.Word||e(uu(s,n-r))==bt.Word&&e(fu(s,n-r))==bt.Word))}(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}class hu extends au{constructor(t){super(t)}nextMatch(t,e,i){let n=lu(this.spec,t,i,t.doc.length).nextOverlapping();return n.done&&(n=lu(this.spec,t,0,e).nextOverlapping()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=i;;){let i=Math.max(e,n-1e4-this.spec.unquoted.length),s=lu(this.spec,t,i,n),r=null;for(;!s.nextOverlapping().done;)r=s.value;if(r)return r;if(i==e)return null;n-=1e4}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace)}matchAll(t,e){let i=lu(this.spec,t,0,t.doc.length),n=[];for(;!i.next().done;){if(n.length>=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=lu(this.spec,t,Math.max(0,e-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function cu(t,e,i,n){return new Vf(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?(s=e.charCategorizer(e.selection.main.head),(t,e,i)=>!i[0].length||(s(fu(i.input,i.index))!=bt.Word||s(uu(i.input,i.index))!=bt.Word)&&(s(uu(i.input,i.index+i[0].length))!=bt.Word||s(fu(i.input,i.index+i[0].length))!=bt.Word)):void 0},i,n);var s}function fu(t,e){return t.slice(p(t,e,!1),e)}function uu(t,e){return t.slice(e,p(t,e))}class du extends au{nextMatch(t,e,i){let n=cu(this.spec,t,i,t.doc.length).next();return n.done&&(n=cu(this.spec,t,0,e).next()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=1;;n++){let s=Math.max(e,i-1e4*n),r=cu(this.spec,t,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==e||o.from>s+10))return o;if(s==e)return null}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace).replace(/\$([$&\d+])/g,((e,i)=>"$"==i?"$":"&"==i?t.match[0]:"0"!=i&&+i<t.match.length?t.match[i]:e))}matchAll(t,e){let i=cu(this.spec,t,0,t.doc.length),n=[];for(;!i.next().done;){if(n.length>=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=cu(this.spec,t,Math.max(0,e-250),Math.min(i+250,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const pu=ut.define(),Ou=ut.define(),gu=I.define({create:t=>new mu(Zu(t).create(),null),update(t,e){for(let i of e.effects)i.is(pu)?t=new mu(i.value.create(),t.panel):i.is(Ou)&&(t=new mu(t.query,i.value?Pu:null));return t},provide:t=>wo.from(t,(t=>t.panel))});class mu{constructor(t,e){this.query=t,this.panel=e}}const wu=ni.mark({class:"cm-searchMatch"}),vu=ni.mark({class:"cm-searchMatch cm-searchMatch-selected"}),bu=Li.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(gu))}update(t){let e=t.state.field(gu);(e!=t.startState.field(gu)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return ni.none;let{view:i}=this,n=new At;for(let e=0,s=i.visibleRanges,r=s.length;e<r;e++){let{from:o,to:a}=s[e];for(;e<r-1&&a>s[e+1].from-500;)a=s[++e].to;t.highlight(i.state,o,a,((t,e)=>{let s=i.state.selection.ranges.some((i=>i.from==t&&i.to==e));n.add(t,e,s?vu:wu)}))}return n.finish()}},{decorations:t=>t.decorations});function yu(t){return e=>{let i=e.state.field(gu,!1);return i&&i.query.spec.valid?t(e,i):Au(e)}}const Su=yu(((t,{query:e})=>{let{to:i}=t.state.selection.main,n=e.nextMatch(t.state,i,i);if(!n)return!1;let s=X.single(n.from,n.to),r=t.state.facet(ru);return t.dispatch({selection:s,effects:[Du(t,n),r.scrollToMatch(s.main,t)],userEvent:"select.search"}),Tu(t),!0})),xu=yu(((t,{query:e})=>{let{state:i}=t,{from:n}=i.selection.main,s=e.prevMatch(i,n,n);if(!s)return!1;let r=X.single(s.from,s.to),o=t.state.facet(ru);return t.dispatch({selection:r,effects:[Du(t,s),o.scrollToMatch(r.main,t)],userEvent:"select.search"}),Tu(t),!0})),ku=yu(((t,{query:e})=>{let i=e.matchAll(t.state,1e3);return!(!i||!i.length)&&(t.dispatch({selection:X.create(i.map((t=>X.range(t.from,t.to)))),userEvent:"select.search.matches"}),!0)})),Qu=yu(((t,{query:e})=>{let{state:i}=t,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=e.nextMatch(i,n,n);if(!r)return!1;let o,a,l=[],h=[];if(r.from==n&&r.to==s&&(a=i.toText(e.getReplacement(r)),l.push({from:r.from,to:r.to,insert:a}),r=e.nextMatch(i,r.from,r.to),h.push(Bs.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let e=0==l.length||l[0].from>=r.to?0:r.to-r.from-a.length;o=X.single(r.from-e,r.to-e),h.push(Du(t,r)),h.push(i.facet(ru).scrollToMatch(o.main,t))}return t.dispatch({changes:l,selection:o,effects:h,userEvent:"input.replace"}),!0})),$u=yu(((t,{query:e})=>{if(t.state.readOnly)return!1;let i=e.matchAll(t.state,1e9).map((t=>{let{from:i,to:n}=t;return{from:i,to:n,insert:e.getReplacement(t)}}));if(!i.length)return!1;let n=t.state.phrase("replaced $ matches",i.length)+".";return t.dispatch({changes:i,effects:Bs.announce.of(n),userEvent:"input.replace.all"}),!0}));function Pu(t){return t.state.facet(ru).createPanel(t)}function Zu(t,e){var i,n,s,r,o;let a=t.selection.main,l=a.empty||a.to>a.from+100?"":t.sliceDoc(a.from,a.to);if(e&&!l)return e;let h=t.facet(ru);return new ou({search:(null!==(i=null==e?void 0:e.literal)&&void 0!==i?i:h.literal)?l:l.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==e?void 0:e.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==e?void 0:e.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==e?void 0:e.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==e?void 0:e.wholeWord)&&void 0!==o?o:h.wholeWord})}function Cu(t){let e=po(t,Pu);return e&&e.dom.querySelector("[main-field]")}function Tu(t){let e=Cu(t);e&&e==t.root.activeElement&&e.select()}const Au=t=>{let e=t.state.field(gu,!1);if(e&&e.panel){let i=Cu(t);if(i&&i!=t.root.activeElement){let n=Zu(t.state,e.query.spec);n.valid&&t.dispatch({effects:pu.of(n)}),i.focus(),i.select()}}else t.dispatch({effects:[Ou.of(!0),e?pu.of(Zu(t.state,e.query.spec)):ut.appendConfig.of(qu)]});return!0},Ru=t=>{let e=t.state.field(gu,!1);if(!e||!e.panel)return!1;let i=po(t,Pu);return i&&i.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:Ou.of(!1)}),!0},Xu=[{key:"Mod-f",run:Au,scope:"editor search-panel"},{key:"F3",run:Su,shift:xu,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:Su,shift:xu,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Ru,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:t,dispatch:e})=>{let i=t.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let e=new Ef(t.doc,t.sliceDoc(n,s));!e.next().done;){if(r.length>1e3)return!1;e.value.from==n&&(o=r.length),r.push(X.range(e.value.from,e.value.to))}return e(t.update({selection:X.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Mod-Alt-g",run:t=>{let e=po(t,Lf);if(!e){let i=[Nf.of(!0)];null==t.state.field(Uf,!1)&&i.push(ut.appendConfig.of([Uf,Hf])),t.dispatch({effects:i}),e=po(t,Lf)}return e&&e.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:t,dispatch:e})=>{let{ranges:i}=t.selection;if(i.some((t=>t.from===t.to)))return(({state:t,dispatch:e})=>{let{selection:i}=t,n=X.create(i.ranges.map((e=>t.wordAt(e.head)||X.cursor(e.head))),i.mainIndex);return!n.eq(i)&&(e(t.update({selection:n})),!0)})({state:t,dispatch:e});let n=t.sliceDoc(i[0].from,i[0].to);if(t.selection.ranges.some((e=>t.sliceDoc(e.from,e.to)!=n)))return!1;let s=function(t,e){let{main:i,ranges:n}=t.selection,s=t.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new Ef(t.doc,e,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((t=>t.from==s.value.from)))continue;if(r){let e=t.wordAt(s.value.from);if(!e||e.from!=s.value.from||e.to!=s.value.to)continue}return s.value}if(i)return null;s=new Ef(t.doc,e,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(t,n);return!!s&&(e(t.update({selection:t.selection.addRange(X.range(s.from,s.to),!1),effects:Bs.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Yu{constructor(t){this.view=t;let e=this.query=t.state.field(gu).query.spec;function i(t,e,i){return Mf("button",{class:"cm-button",name:t,onclick:e,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=Mf("input",{value:e.search,placeholder:Wu(t,"Find"),"aria-label":Wu(t,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Mf("input",{value:e.replace,placeholder:Wu(t,"Replace"),"aria-label":Wu(t,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Mf("input",{type:"checkbox",name:"case",form:"",checked:e.caseSensitive,onchange:this.commit}),this.reField=Mf("input",{type:"checkbox",name:"re",form:"",checked:e.regexp,onchange:this.commit}),this.wordField=Mf("input",{type:"checkbox",name:"word",form:"",checked:e.wholeWord,onchange:this.commit}),this.dom=Mf("div",{onkeydown:t=>this.keydown(t),class:"cm-search"},[this.searchField,i("next",(()=>Su(t)),[Wu(t,"next")]),i("prev",(()=>xu(t)),[Wu(t,"previous")]),i("select",(()=>ku(t)),[Wu(t,"all")]),Mf("label",null,[this.caseField,Wu(t,"match case")]),Mf("label",null,[this.reField,Wu(t,"regexp")]),Mf("label",null,[this.wordField,Wu(t,"by word")]),...t.state.readOnly?[]:[Mf("br"),this.replaceField,i("replace",(()=>Qu(t)),[Wu(t,"replace")]),i("replaceAll",(()=>$u(t)),[Wu(t,"replace all")])],Mf("button",{name:"close",onclick:()=>Ru(t),"aria-label":Wu(t,"close"),type:"button"},["×"])])}commit(){let t=new ou({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});t.eq(this.query)||(this.query=t,this.view.dispatch({effects:pu.of(t)}))}keydown(t){ir(this.view,t,"search-panel")?t.preventDefault():13==t.keyCode&&t.target==this.searchField?(t.preventDefault(),(t.shiftKey?xu:Su)(this.view)):13==t.keyCode&&t.target==this.replaceField&&(t.preventDefault(),Qu(this.view))}update(t){for(let e of t.transactions)for(let t of e.effects)t.is(pu)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(t){this.query=t,this.searchField.value=t.search,this.replaceField.value=t.replace,this.caseField.checked=t.caseSensitive,this.reField.checked=t.regexp,this.wordField.checked=t.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(ru).top}}function Wu(t,e){return t.state.phrase(e)}const Mu=30,ju=/[\s\.,:;?!]/;function Du(t,{from:e,to:i}){let n=t.state.doc.lineAt(e),s=t.state.doc.lineAt(i).to,r=Math.max(n.from,e-Mu),o=Math.min(s,i+Mu),a=t.state.sliceDoc(r,o);if(r!=n.from)for(let t=0;t<Mu;t++)if(!ju.test(a[t+1])&&ju.test(a[t])){a=a.slice(t);break}if(o!=s)for(let t=a.length-1;t>a.length-Mu;t--)if(!ju.test(a[t-1])&&ju.test(a[t])){a=a.slice(0,t);break}return Bs.announce.of(`${t.state.phrase("current match")}. ${a} ${t.state.phrase("on line")} ${n.number}.`)}const Eu=Bs.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),qu=[gu,U.low(bu),Eu];class _u{constructor(t,e,i){this.state=t,this.pos=e,this.explicit=i,this.abortListeners=[]}tokenBefore(t){let e=hl(this.state).resolveInner(this.pos,-1);for(;e&&t.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(t){let e=this.state.doc.lineAt(this.pos),i=Math.max(e.from,this.pos-250),n=e.text.slice(i-e.from,this.pos-e.from),s=n.search(Gu(t,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(t,e){"abort"==t&&this.abortListeners&&this.abortListeners.push(e)}}function Vu(t){let e=Object.keys(t).join(""),i=/\w/.test(e);return i&&(e=e.replace(/\w/g,"")),`[${i?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function Iu(t){let e=t.map((t=>"string"==typeof t?{label:t}:t)),[i,n]=e.every((t=>/^\w+$/.test(t.label)))?[/\w*$/,/\w+$/]:function(t){let e=Object.create(null),i=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let t=1;t<n.length;t++)i[n[t]]=!0}let n=Vu(e)+Vu(i)+"*$";return[new RegExp("^"+n),new RegExp(n)]}(e);return t=>{let s=t.matchBefore(n);return s||t.explicit?{from:s?s.from:t.pos,options:e,validFor:i}:null}}class zu{constructor(t,e,i,n){this.completion=t,this.source=e,this.match=i,this.score=n}}function Bu(t){return t.selection.main.from}function Gu(t,e){var i;let{source:n}=t,s=e&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=t.flags)&&void 0!==i?i:t.ignoreCase?"i":""):t}const Lu=ht.define();const Nu=new WeakMap;function Uu(t){if(!Array.isArray(t))return t;let e=Nu.get(t);return e||Nu.set(t,e=Iu(t)),e}const Hu=ut.define(),Fu=ut.define();class Ju{constructor(t){this.pattern=t,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let e=0;e<t.length;){let i=v(t,e),n=y(i);this.chars.push(i);let s=t.slice(e,e+n),r=s.toUpperCase();this.folded.push(v(r==s?s.toLowerCase():r,0)),e+=n}this.astral=t.length!=this.chars.length}ret(t,e){return this.score=t,this.matched=e,!0}match(t){if(0==this.pattern.length)return this.ret(-100,[]);if(t.length<this.pattern.length)return!1;let{chars:e,folded:i,any:n,precise:s,byWord:r}=this;if(1==e.length){let n=v(t,0),s=y(n),r=s==t.length?0:-100;if(n==e[0]);else{if(n!=i[0])return!1;r+=-200}return this.ret(r,[0,s])}let o=t.indexOf(this.pattern);if(0==o)return this.ret(t.length==this.pattern.length?0:-100,[0,this.pattern.length]);let a=e.length,l=0;if(o<0){for(let s=0,r=Math.min(t.length,200);s<r&&l<a;){let r=v(t,s);r!=e[l]&&r!=i[l]||(n[l++]=s),s+=y(r)}if(l<a)return!1}let h=0,c=0,f=!1,u=0,d=-1,p=-1,O=/[a-z]/.test(t),g=!0;for(let n=0,l=Math.min(t.length,200),m=0;n<l&&c<a;){let l=v(t,n);o<0&&(h<a&&l==e[h]&&(s[h++]=n),u<a&&(l==e[u]||l==i[u]?(0==u&&(d=n),p=n+1,u++):u=0));let w,S=l<255?l>=48&&l<=57||l>=97&&l<=122?2:l>=65&&l<=90?1:0:(w=b(l))!=w.toLowerCase()?1:w!=w.toUpperCase()?2:0;(!n||1==S&&O||0==m&&0!=S)&&(e[c]==l||i[c]==l&&(f=!0)?r[c++]=n:r.length&&(g=!1)),m=S,n+=y(l)}return c==a&&0==r[0]&&g?this.result((f?-200:0)-100,r,t):u==a&&0==d?this.ret(-200-t.length+(p==t.length?0:-100),[0,p]):o>-1?this.ret(-700-t.length,[o,o+this.pattern.length]):u==a?this.ret(-900-t.length,[d,p]):c==a?this.result((f?-200:0)-100-700+(g?0:-1100),r,t):2!=e.length&&this.result((n[0]?-700:0)-200-1100,n,t)}result(t,e,i){let n=[],s=0;for(let t of e){let e=t+(this.astral?y(v(i,t)):1);s&&n[s-1]==t?n[s-1]=e:(n[s++]=t,n[s++]=e)}return this.ret(t-i.length,n)}}const Ku=M.define({combine:t=>Qt(t,{activateOnTyping:!0,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:ed,compareCompletions:(t,e)=>t.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(t,e)=>t&&e,closeOnBlur:(t,e)=>t&&e,icons:(t,e)=>t&&e,tooltipClass:(t,e)=>i=>td(t(i),e(i)),optionClass:(t,e)=>i=>td(t(i),e(i)),addToOptions:(t,e)=>t.concat(e)})});function td(t,e){return t?e?t+" "+e:t:e}function ed(t,e,i,n,s,r){let o,a,l=t.textDirection==ui.RTL,h=l,c=!1,f="top",u=e.left-s.left,d=s.right-e.right,p=n.right-n.left,O=n.bottom-n.top;if(h&&u<Math.min(p,d)?h=!1:!h&&d<Math.min(p,u)&&(h=!0),p<=(h?u:d))o=Math.max(s.top,Math.min(i.top,s.bottom-O))-e.top,a=Math.min(400,h?u:d);else{c=!0,a=Math.min(400,(l?e.right:s.right-e.left)-30);let t=s.bottom-e.bottom;t>=O||t>e.top?o=i.bottom-e.top:(f="bottom",o=e.bottom-i.top)}return{style:`${f}: ${o/((e.bottom-e.top)/r.offsetHeight)}px; max-width: ${a/((e.right-e.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?l?"left-narrow":"right-narrow":h?"left":"right")}}function id(t,e,i){if(t<=i)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let t=Math.floor(e/i);return{from:t*i,to:(t+1)*i}}let n=Math.floor((t-e)/i);return{from:t-(n+1)*i,to:t-n*i}}class nd{constructor(t,e,i){this.view=t,this.stateField=e,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:t=>this.placeInfo(t),key:this},this.space=null,this.currentClass="";let n=t.state.field(e),{options:s,selected:r}=n.open,o=t.state.facet(Ku);this.optionContent=function(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(t){let e=document.createElement("div");return e.classList.add("cm-completionIcon"),t.type&&e.classList.add(...t.type.split(/\s+/g).map((t=>"cm-completionIcon-"+t))),e.setAttribute("aria-hidden","true"),e},position:20}),e.push({render(t,e,i,n){let s=document.createElement("span");s.className="cm-completionLabel";let r=t.displayLabel||t.label,o=0;for(let t=0;t<n.length;){let e=n[t++],i=n[t++];e>o&&s.appendChild(document.createTextNode(r.slice(o,e)));let a=s.appendChild(document.createElement("span"));a.appendChild(document.createTextNode(r.slice(e,i))),a.className="cm-completionMatchedText",o=i}return o<r.length&&s.appendChild(document.createTextNode(r.slice(o))),s},position:50},{render(t){if(!t.detail)return null;let e=document.createElement("span");return e.className="cm-completionDetail",e.textContent=t.detail,e},position:80}),e.sort(((t,e)=>t.position-e.position)).map((t=>t.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=id(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(t.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=t.state.field(e).open;for(let e,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(e=/-(\d+)$/.exec(s.id))&&+e[1]<n.length)return this.applyCompletion(t,n[+e[1]]),void i.preventDefault()})),this.dom.addEventListener("focusout",(e=>{let i=t.state.field(this.stateField,!1);i&&i.tooltip&&t.state.facet(Ku).closeOnBlur&&e.relatedTarget!=t.contentDOM&&t.dispatch({effects:Fu.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(t,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(t,e,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(t){var e;let i=t.state.field(this.stateField),n=t.startState.field(this.stateField);if(this.updateTooltipClass(t.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=id(s.length,r,t.state.facet(Ku).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(e=n.open)||void 0===e?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(t){let e=this.tooltipClass(t);if(e!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of e.split(" "))t&&this.dom.classList.add(t);this.currentClass=e}}positioned(t){this.space=t,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let t=this.view.state.field(this.stateField),e=t.open;if((e.selected>-1&&e.selected<this.range.from||e.selected>=this.range.to)&&(this.range=id(e.options.length,e.selected,this.view.state.facet(Ku).maxRenderedOptions),this.showOptions(e.options,t.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:i}=e.options[e.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((e=>{e&&this.view.state.field(this.stateField,!1)==t&&this.addInfoPane(e,i)})).catch((t=>Ii(this.view.state,t,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(t,e){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=t.nodeType)i.appendChild(t),this.infoDestroy=null;else{let{dom:e,destroy:n}=t;i.appendChild(e),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(t){let e=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==t?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),e=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return e&&function(t,e){let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),s=i.height/t.offsetHeight;n.top<i.top?t.scrollTop-=(i.top-n.top)/s:n.bottom>i.bottom&&(t.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,e),e}measureInfo(){let t=this.dom.querySelector("[aria-selected]");if(!t||!this.info)return null;let e=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=t.getBoundingClientRect(),s=this.space;if(!s){let t=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:t.innerWidth,bottom:t.innerHeight}}return n.top>Math.min(s.bottom,e.bottom)-10||n.bottom<Math.max(s.top,e.top)+10?null:this.view.state.facet(Ku).positionInfo(this.view,e,n,i,s,this.dom)}placeInfo(t){this.info&&(t?(t.style&&(this.info.style.cssText=t.style),this.info.className="cm-tooltip cm-completionInfo "+(t.class||"")):this.info.style.cssText="top: -1e6px")}createListBox(t,e,i){const n=document.createElement("ul");n.id=e,n.setAttribute("role","listbox"),n.setAttribute("aria-expanded","true"),n.setAttribute("aria-label",this.view.state.phrase("Completions"));let s=null;for(let r=i.from;r<i.to;r++){let{completion:o,match:a}=t[r],{section:l}=o;if(l){let t="string"==typeof l?l:l.name;if(t!=s&&(r>i.from||0==i.from))if(s=t,"string"!=typeof l&&l.header)n.appendChild(l.header(l));else{n.appendChild(document.createElement("completion-section")).textContent=t}}const h=n.appendChild(document.createElement("li"));h.id=e+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let t of this.optionContent){let e=t(o,this.view.state,this.view,a);e&&h.appendChild(e)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.to<t.length&&n.classList.add("cm-completionListIncompleteBottom"),n}destroyInfo(){this.info&&(this.infoDestroy&&this.infoDestroy(),this.info.remove(),this.info=null)}destroy(){this.destroyInfo()}}function sd(t,e){return i=>new nd(i,t,e)}function rd(t){return 100*(t.boost||0)+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}class od{constructor(t,e,i,n,s,r){this.options=t,this.attrs=e,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(t,e){return t==this.selected||t>=this.options.length?this:new od(this.options,hd(e,t),this.tooltip,this.timestamp,t,this.disabled)}static build(t,e,i,n,s){let r=function(t,e){let i=[],n=null,s=t=>{i.push(t);let{section:e}=t.completion;if(e){n||(n=[]);let t="string"==typeof e?e:e.name;n.some((e=>e.name==t))||n.push("string"==typeof e?{name:t}:e)}};for(let n of t)if(n.hasResult()){let t=n.result.getMatch;if(!1===n.result.filter)for(let e of n.result.options)s(new zu(e,n.source,t?t(e):[],1e9-i.length));else{let i=new Ju(e.sliceDoc(n.from,n.to));for(let e of n.result.options)if(i.match(e.label)){let r=e.displayLabel?t?t(e,i.matched):[]:i.matched;s(new zu(e,n.source,r,i.score+(e.boost||0)))}}}if(n){let t=Object.create(null),e=0,s=(t,e)=>{var i,n;return(null!==(i=t.rank)&&void 0!==i?i:1e9)-(null!==(n=e.rank)&&void 0!==n?n:1e9)||(t.name<e.name?-1:1)};for(let i of n.sort(s))e-=1e5,t[i.name]=e;for(let e of i){let{section:i}=e.completion;i&&(e.score+=t["string"==typeof i?i:i.name])}}let r=[],o=null,a=e.facet(Ku).compareCompletions;for(let t of i.sort(((t,e)=>e.score-t.score||a(t.completion,e.completion)))){let e=t.completion;!o||o.label!=e.label||o.detail!=e.detail||null!=o.type&&null!=e.type&&o.type!=e.type||o.apply!=e.apply||o.boost!=e.boost?r.push(t):rd(t.completion)>rd(o)&&(r[r.length-1]=t),o=t.completion}return r}(t,e);if(!r.length)return n&&t.some((t=>1==t.state))?new od(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=e.facet(Ku).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let t=n.options[n.selected].completion;for(let e=0;e<r.length;e++)if(r[e].completion==t){o=e;break}}return new od(r,hd(i,o),{pos:t.reduce(((t,e)=>e.hasResult()?Math.min(t,e.from):t),1e8),create:wd,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(t){return new od(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:t.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class ad{constructor(t,e,i){this.active=t,this.id=e,this.open=i}static start(){return new ad(cd,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(t){let{state:e}=t,i=e.facet(Ku),n=(i.override||e.languageDataAt("autocomplete",Bu(e)).map(Uu)).map((e=>(this.active.find((t=>t.source==e))||new ud(e,this.active.some((t=>0!=t.state))?1:0)).update(t,i)));n.length==this.active.length&&n.every(((t,e)=>t==this.active[e]))&&(n=this.active);let s=this.open;s&&t.docChanged&&(s=s.map(t.changes)),t.selection||n.some((e=>e.hasResult()&&t.changes.touchesRange(e.from,e.to)))||!function(t,e){if(t==e)return!0;for(let i=0,n=0;;){for(;i<t.length&&!t[i].hasResult;)i++;for(;n<e.length&&!e[n].hasResult;)n++;let s=i==t.length,r=n==e.length;if(s||r)return s==r;if(t[i++].result!=e[n++].result)return!1}}(n,this.active)?s=od.build(n,e,this.id,s,i):s&&s.disabled&&!n.some((t=>1==t.state))&&(s=null),!s&&n.every((t=>1!=t.state))&&n.some((t=>t.hasResult()))&&(n=n.map((t=>t.hasResult()?new ud(t.source,0):t)));for(let e of t.effects)e.is(Od)&&(s=s&&s.setSelected(e.value,this.id));return n==this.active&&s==this.open?this:new ad(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:ld}}const ld={"aria-autocomplete":"list"};function hd(t,e){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":t};return e>-1&&(i["aria-activedescendant"]=t+"-"+e),i}const cd=[];function fd(t){return t.isUserEvent("input.type")?"input":t.isUserEvent("delete.backward")?"delete":null}class ud{constructor(t,e,i=-1){this.source=t,this.state=e,this.explicitPos=i}hasResult(){return!1}update(t,e){let i=fd(t),n=this;i?n=n.handleUserEvent(t,i,e):t.docChanged?n=n.handleChange(t):t.selection&&0!=n.state&&(n=new ud(n.source,0));for(let e of t.effects)if(e.is(Hu))n=new ud(n.source,1,e.value?Bu(t.state):-1);else if(e.is(Fu))n=new ud(n.source,0);else if(e.is(pd))for(let t of e.value)t.source==n.source&&(n=t);return n}handleUserEvent(t,e,i){return"delete"!=e&&i.activateOnTyping?new ud(this.source,1):this.map(t.changes)}handleChange(t){return t.changes.touchesRange(Bu(t.startState))?new ud(this.source,0):this.map(t.changes)}map(t){return t.empty||this.explicitPos<0?this:new ud(this.source,this.state,t.mapPos(this.explicitPos))}}class dd extends ud{constructor(t,e,i,n,s){super(t,2,e),this.result=i,this.from=n,this.to=s}hasResult(){return!0}handleUserEvent(t,e,i){var n;let s=t.changes.mapPos(this.from),r=t.changes.mapPos(this.to,1),o=Bu(t.state);if((this.explicitPos<0?o<=s:o<this.from)||o>r||"delete"==e&&Bu(t.startState)==this.from)return new ud(this.source,"input"==e&&i.activateOnTyping?1:0);let a,l=this.explicitPos<0?-1:t.changes.mapPos(this.explicitPos);return function(t,e,i,n){if(!t)return!1;let s=e.sliceDoc(i,n);return"function"==typeof t?t(s,i,n,e):Gu(t,!0).test(s)}(this.result.validFor,t.state,s,r)?new dd(this.source,l,this.result,s,r):this.result.update&&(a=this.result.update(this.result,s,r,new _u(t.state,o,l>=0)))?new dd(this.source,l,a,a.from,null!==(n=a.to)&&void 0!==n?n:Bu(t.state)):new ud(this.source,1,l)}handleChange(t){return t.changes.touchesRange(this.from,this.to)?new ud(this.source,0):this.map(t.changes)}map(t){return t.empty?this:new dd(this.source,this.explicitPos<0?-1:t.mapPos(this.explicitPos),this.result,t.mapPos(this.from),t.mapPos(this.to,1))}}const pd=ut.define({map:(t,e)=>t.map((t=>t.map(e)))}),Od=ut.define(),gd=I.define({create:()=>ad.start(),update:(t,e)=>t.update(e),provide:t=>[io.from(t,(t=>t.tooltip)),Bs.contentAttributes.from(t,(t=>t.attrs))]});function md(t,e){const i=e.completion.apply||e.completion.label;let n=t.state.field(gd).active.find((t=>t.source==e.source));return n instanceof dd&&("string"==typeof i?t.dispatch(Object.assign(Object.assign({},function(t,e,i,n){let{main:s}=t.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},t.changeByRange((a=>a!=s&&i!=n&&t.sliceDoc(a.from+r,a.from+o)!=t.sliceDoc(i,n)?{range:a}:{changes:{from:a.from+r,to:n==s.from?a.to:a.from+o,insert:e},range:X.cursor(a.from+r+e.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(t.state,i,n.from,n.to)),{annotations:Lu.of(e.completion)})):i(t,e.completion,n.from,n.to),!0)}const wd=sd(gd,md);function vd(t,e="option"){return i=>{let n=i.state.field(gd,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp<i.state.facet(Ku).interactionDelay)return!1;let s,r=1;"page"==e&&(s=ho(i,n.open.tooltip))&&(r=Math.max(2,Math.floor(s.dom.offsetHeight/s.dom.querySelector("li").offsetHeight)-1));let{length:o}=n.open.options,a=n.open.selected>-1?n.open.selected+r*(t?1:-1):t?0:o-1;return a<0?a="page"==e?0:o-1:a>=o&&(a="page"==e?o-1:0),i.dispatch({effects:Od.of(a)}),!0}}class bd{constructor(t,e){this.active=t,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}}const yd=Li.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(gd).active)1==e.state&&this.startQuery(e)}update(t){let e=t.state.field(gd);if(!t.selectionSet&&!t.docChanged&&t.startState.field(gd)==e)return;let i=t.transactions.some((t=>(t.selection||t.docChanged)&&!fd(t)));for(let e=0;e<this.running.length;e++){let n=this.running[e];if(i||n.updates.length+t.transactions.length>50&&Date.now()-n.time>1e3){for(let t of n.context.abortListeners)try{t()}catch(t){Ii(this.view.state,t)}n.context.abortListeners=null,this.running.splice(e--,1)}else n.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some((t=>t.effects.some((t=>t.is(Hu)))))&&(this.pendingStart=!0);let n=this.pendingStart?50:t.state.facet(Ku).activateOnTypingDelay;if(this.debounceUpdate=e.active.some((t=>1==t.state&&!this.running.some((e=>e.active.source==t.source))))?setTimeout((()=>this.startUpdate()),n):-1,0!=this.composing)for(let e of t.transactions)"input"==fd(e)?this.composing=2:2==this.composing&&e.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(gd);for(let t of e.active)1!=t.state||this.running.some((e=>e.active.source==t.source))||this.startQuery(t)}startQuery(t){let{state:e}=this.view,i=Bu(e),n=new _u(e,i,t.explicitPos==i),s=new bd(t,n);this.running.push(s),Promise.resolve(t.source(n)).then((t=>{s.context.aborted||(s.done=t||null,this.scheduleAccept())}),(t=>{this.view.dispatch({effects:Fu.of(null)}),Ii(this.view.state,t)}))}scheduleAccept(){this.running.every((t=>void 0!==t.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(Ku).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],i=this.view.state.facet(Ku);for(let n=0;n<this.running.length;n++){let s=this.running[n];if(void 0===s.done)continue;if(this.running.splice(n--,1),s.done){let n=new dd(s.active.source,s.active.explicitPos,s.done,s.done.from,null!==(t=s.done.to)&&void 0!==t?t:Bu(s.updates.length?s.updates[0].startState:this.view.state));for(let t of s.updates)n=n.update(t,i);if(n.hasResult()){e.push(n);continue}}let r=this.view.state.field(gd).active.find((t=>t.source==s.active.source));if(r&&1==r.state)if(null==s.done){let t=new ud(s.active.source,0);for(let e of s.updates)t=t.update(e,i);1!=t.state&&e.push(t)}else this.startQuery(r)}e.length&&this.view.dispatch({effects:pd.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(gd,!1);if(e&&e.tooltip&&this.view.state.facet(Ku).closeOnBlur){let i=e.open&&ho(this.view,e.open.tooltip);i&&i.dom.contains(t.relatedTarget)||setTimeout((()=>this.view.dispatch({effects:Fu.of(null)})),10)}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:Hu.of(!1)})),20),this.composing=0}}}),Sd=Bs.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class xd{constructor(t,e,i,n){this.field=t,this.line=e,this.from=i,this.to=n}}class kd{constructor(t,e,i){this.field=t,this.from=e,this.to=i}map(t){let e=t.mapPos(this.from,-1,x.TrackDel),i=t.mapPos(this.to,1,x.TrackDel);return null==e||null==i?null:new kd(this.field,e,i)}}class Qd{constructor(t,e){this.lines=t,this.fieldPositions=e}instantiate(t,e){let i=[],n=[e],s=t.doc.lineAt(e),r=/^\s*/.exec(s.text)[0];for(let s of this.lines){if(i.length){let i=r,o=/^\t*/.exec(s)[0].length;for(let e=0;e<o;e++)i+=t.facet(xl);n.push(e+i.length-o),s=i+s.slice(o)}i.push(s),e+=s.length+1}let o=this.fieldPositions.map((t=>new kd(t.field,n[t.line]+t.from,n[t.line]+t.to)));return{text:i,ranges:o}}static parse(t){let e,i=[],n=[],s=[];for(let r of t.split(/\r\n?|\n/)){for(;e=/[#$]\{(?:(\d+)(?::([^}]*))?|([^}]*))\}/.exec(r);){let t=e[1]?+e[1]:null,o=e[2]||e[3]||"",a=-1;for(let e=0;e<i.length;e++)(null!=t?i[e].seq==t:o&&i[e].name==o)&&(a=e);if(a<0){let e=0;for(;e<i.length&&(null==t||null!=i[e].seq&&i[e].seq<t);)e++;i.splice(e,0,{seq:t,name:o}),a=e;for(let t of s)t.field>=a&&t.field++}s.push(new xd(a,n.length,e.index,e.index+o.length)),r=r.slice(0,e.index)+o+r.slice(e.index+e[0].length)}for(let t;t=/\\([{}])/.exec(r);){r=r.slice(0,t.index)+t[1]+r.slice(t.index+t[0].length);for(let e of s)e.line==n.length&&e.from>t.index&&(e.from--,e.to--)}n.push(r)}return new Qd(n,s)}}let $d=ni.widget({widget:new class extends ei{toDOM(){let t=document.createElement("span");return t.className="cm-snippetFieldPosition",t}ignoreEvent(){return!1}}}),Pd=ni.mark({class:"cm-snippetField"});class Zd{constructor(t,e){this.ranges=t,this.active=e,this.deco=ni.set(t.map((t=>(t.from==t.to?$d:Pd).range(t.from,t.to))))}map(t){let e=[];for(let i of this.ranges){let n=i.map(t);if(!n)return null;e.push(n)}return new Zd(e,this.active)}selectionInsideField(t){return t.ranges.every((t=>this.ranges.some((e=>e.field==this.active&&e.from<=t.from&&e.to>=t.to))))}}const Cd=ut.define({map:(t,e)=>t&&t.map(e)}),Td=ut.define(),Ad=I.define({create:()=>null,update(t,e){for(let i of e.effects){if(i.is(Cd))return i.value;if(i.is(Td)&&t)return new Zd(t.ranges,i.value)}return t&&e.docChanged&&(t=t.map(e.changes)),t&&e.selection&&!t.selectionInsideField(e.selection)&&(t=null),t},provide:t=>Bs.decorations.from(t,(t=>t?t.deco:ni.none))});function Rd(t,e){return X.create(t.filter((t=>t.field==e)).map((t=>X.range(t.from,t.to))))}function Xd(e){let i=Qd.parse(e);return(e,n,s,r)=>{let{text:o,ranges:a}=i.instantiate(e.state,s),l={changes:{from:s,to:r,insert:t.of(o)},scrollIntoView:!0,annotations:n?[Lu.of(n),dt.userEvent.of("input.complete")]:void 0};if(a.length&&(l.selection=Rd(a,0)),a.some((t=>t.field>0))){let t=new Zd(a,0),i=l.effects=[Cd.of(t)];void 0===e.state.field(Ad,!1)&&i.push(ut.appendConfig.of([Ad,jd,Ed,Sd]))}e.dispatch(e.state.update(l))}}function Yd(t){return({state:e,dispatch:i})=>{let n=e.field(Ad,!1);if(!n||t<0&&0==n.active)return!1;let s=n.active+t,r=t>0&&!n.ranges.some((e=>e.field==s+t));return i(e.update({selection:Rd(n.ranges,s),effects:Cd.of(r?null:new Zd(n.ranges,s)),scrollIntoView:!0})),!0}}const Wd=[{key:"Tab",run:Yd(1),shift:Yd(-1)},{key:"Escape",run:({state:t,dispatch:e})=>!!t.field(Ad,!1)&&(e(t.update({effects:Cd.of(null)})),!0)}],Md=M.define({combine:t=>t.length?t[0]:Wd}),jd=U.highest(Ks.compute([Md],(t=>t.facet(Md))));function Dd(t,e){return Object.assign(Object.assign({},e),{apply:Xd(t)})}const Ed=Bs.domEventHandlers({mousedown(t,e){let i,n=e.state.field(Ad,!1);if(!n||null==(i=e.posAtCoords({x:t.clientX,y:t.clientY})))return!1;let s=n.ranges.find((t=>t.from<=i&&t.to>=i));return!(!s||s.field==n.active)&&(e.dispatch({selection:Rd(n.ranges,s.field),effects:Cd.of(n.ranges.some((t=>t.field>s.field))?new Zd(n.ranges,s.field):null),scrollIntoView:!0}),!0)}}),qd={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},_d=ut.define({map(t,e){let i=e.mapPos(t,-1,x.TrackAfter);return null==i?void 0:i}}),Vd=new class extends $t{};Vd.startSide=1,Vd.endSide=-1;const Id=I.define({create:()=>Tt.empty,update(t,e){if(t=t.map(e.changes),e.selection){let i=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:t=>t>=i.from&&t<=i.to})}for(let i of e.effects)i.is(_d)&&(t=t.update({add:[Vd.range(i.value,i.value+1)]}));return t}});const zd="()[]{}<>";function Bd(t){for(let e=0;e<zd.length;e+=2)if(zd.charCodeAt(e)==t)return zd.charAt(e+1);return b(t<128?t:t+1)}function Gd(t,e){return t.languageDataAt("closeBrackets",e)[0]||qd}const Ld="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),Nd=Bs.inputHandler.of(((t,e,i,n)=>{if((Ld?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let s=t.state.selection.main;if(n.length>2||2==n.length&&1==y(v(n,0))||e!=s.from||i!=s.to)return!1;let r=function(t,e){let i=Gd(t,t.selection.main.head),n=i.brackets||qd.brackets;for(let s of n){let r=Bd(v(s,0));if(e==s)return r==s?tp(t,s,n.indexOf(s+s+s)>-1,i):Jd(t,s,r,i.before||qd.before);if(e==r&&Hd(t,t.selection.main.from))return Kd(t,s,r)}return null}(t.state,n);return!!r&&(t.dispatch(r),!0)})),Ud=[{key:"Backspace",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Gd(t,t.selection.main.head).brackets||qd.brackets,n=null,s=t.changeByRange((e=>{if(e.empty){let n=function(t,e){let i=t.sliceString(e-2,e);return y(v(i,0))==i.length?i:i.slice(1)}(t.doc,e.head);for(let s of i)if(s==n&&Fd(t.doc,e.head)==Bd(v(s,0)))return{changes:{from:e.head-s.length,to:e.head+s.length},range:X.cursor(e.head-s.length)}}return{range:n=e}}));return n||e(t.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function Hd(t,e){let i=!1;return t.field(Id).between(0,t.doc.length,(t=>{t==e&&(i=!0)})),i}function Fd(t,e){let i=t.sliceString(e,e+2);return i.slice(0,y(v(i,0)))}function Jd(t,e,i,n){let s=null,r=t.changeByRange((r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:i,from:r.to}],effects:_d.of(r.to+e.length),range:X.range(r.anchor+e.length,r.head+e.length)};let o=Fd(t.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+i,from:r.head},effects:_d.of(r.head+e.length),range:X.cursor(r.head+e.length)}:{range:s=r}}));return s?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Kd(t,e,i){let n=null,s=t.changeByRange((e=>e.empty&&Fd(t.doc,e.head)==i?{changes:{from:e.head,to:e.head+i.length,insert:i},range:X.cursor(e.head+i.length)}:n={range:e}));return n?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function tp(t,e,i,n){let s=n.stringPrefixes||qd.stringPrefixes,r=null,o=t.changeByRange((n=>{if(!n.empty)return{changes:[{insert:e,from:n.from},{insert:e,from:n.to}],effects:_d.of(n.to+e.length),range:X.range(n.anchor+e.length,n.head+e.length)};let o,a=n.head,l=Fd(t.doc,a);if(l==e){if(ep(t,a))return{changes:{insert:e+e,from:a},effects:_d.of(a+e.length),range:X.cursor(a+e.length)};if(Hd(t,a)){let n=i&&t.sliceDoc(a,a+3*e.length)==e+e+e?e+e+e:e;return{changes:{from:a,to:a+n.length,insert:n},range:X.cursor(a+n.length)}}}else{if(i&&t.sliceDoc(a-2*e.length,a)==e+e&&(o=ip(t,a-2*e.length,s))>-1&&ep(t,o))return{changes:{insert:e+e+e+e,from:a},effects:_d.of(a+e.length),range:X.cursor(a+e.length)};if(t.charCategorizer(a)(l)!=bt.Word&&ip(t,a,s)>-1&&!function(t,e,i,n){let s=hl(t).resolveInner(e,-1),r=n.reduce(((t,e)=>Math.max(t,e.length)),0);for(let o=0;o<5;o++){let o=t.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),a=o.indexOf(i);if(!a||a>-1&&n.indexOf(o.slice(0,a))>-1){let e=s.firstChild;for(;e&&e.from==s.from&&e.to-e.from>i.length+a;){if(t.sliceDoc(e.to-i.length,e.to)==i)return!1;e=e.firstChild}return!0}let l=s.to==e&&s.parent;if(!l)break;s=l}return!1}(t,a,e,s))return{changes:{insert:e+e,from:a},effects:_d.of(a+e.length),range:X.cursor(a+e.length)}}return{range:r=n}}));return r?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function ep(t,e){let i=hl(t).resolveInner(e+1);return i.parent&&i.from==e}function ip(t,e,i){let n=t.charCategorizer(e);if(n(t.sliceDoc(e-1,e))!=bt.Word)return e;for(let s of i){let i=e-s.length;if(t.sliceDoc(i,e)==s&&n(t.sliceDoc(i-1,i))!=bt.Word)return i}return-1}function np(t={}){return[gd,Ku.of(t),yd,rp,Sd]}const sp=[{key:"Ctrl-Space",run:t=>!!t.state.field(gd,!1)&&(t.dispatch({effects:Hu.of(!0)}),!0)},{key:"Escape",run:t=>{let e=t.state.field(gd,!1);return!(!e||!e.active.some((t=>0!=t.state)))&&(t.dispatch({effects:Fu.of(null)}),!0)}},{key:"ArrowDown",run:vd(!0)},{key:"ArrowUp",run:vd(!1)},{key:"PageDown",run:vd(!0,"page")},{key:"PageUp",run:vd(!1,"page")},{key:"Enter",run:t=>{let e=t.state.field(gd,!1);return!(t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestamp<t.state.facet(Ku).interactionDelay)&&md(t,e.open.options[e.open.selected])}}],rp=U.highest(Ks.computeN([Ku],(t=>t.facet(Ku).defaultKeymap?[sp]:[])));class op{constructor(t,e,i){this.from=t,this.to=e,this.diagnostic=i}}class ap{constructor(t,e,i){this.diagnostics=t,this.panel=e,this.selected=i}static init(t,e,i){let n=t,s=i.facet(wp).markerFilter;s&&(n=s(n,i));let r=ni.set(n.map((t=>t.from==t.to||t.from==t.to-1&&i.doc.lineAt(t.from).to==t.from?ni.widget({widget:new yp(t),diagnostic:t}).range(t.from):ni.mark({attributes:{class:"cm-lintRange cm-lintRange-"+t.severity+(t.markClass?" "+t.markClass:"")},diagnostic:t,inclusive:!0}).range(t.from,t.to))),!0);return new ap(r,e,lp(r))}}function lp(t,e=null,i=0){let n=null;return t.between(i,1e9,((t,i,{spec:s})=>{if(!e||s.diagnostic==e)return n=new op(t,i,s.diagnostic),!1})),n}const hp=ut.define(),cp=ut.define(),fp=ut.define(),up=I.define({create:()=>new ap(ni.none,null,null),update(t,e){if(e.docChanged){let i=t.diagnostics.map(e.changes),n=null;if(t.selected){let s=e.changes.mapPos(t.selected.from,1);n=lp(i,t.selected.diagnostic,s)||lp(i,null,s)}t=new ap(i,t.panel,n)}for(let i of e.effects)i.is(hp)?t=ap.init(i.value,t.panel,e.state):i.is(cp)?t=new ap(t.diagnostics,i.value?xp.open:null,t.selected):i.is(fp)&&(t=new ap(t.diagnostics,t.panel,i.value));return t},provide:t=>[wo.from(t,(t=>t.panel)),Bs.decorations.from(t,(t=>t.diagnostics))]}),dp=ni.mark({class:"cm-lintRange cm-lintRange-active",inclusive:!0});function pp(t,e,i){let{diagnostics:n}=t.state.field(up),s=[],r=2e8,o=0;n.between(e-(i<0?1:0),e+(i>0?1:0),((t,n,{spec:a})=>{e>=t&&e<=n&&(t==n||(e>t||i>0)&&(e<n||i<0))&&(s.push(a.diagnostic),r=Math.min(t,r),o=Math.max(n,o))}));let a=t.state.facet(wp).tooltipFilter;return a&&(s=a(s,t.state)),s.length?{pos:r,end:o,above:t.state.doc.lineAt(r).to<o,create:()=>({dom:Op(t,s)})}:null}function Op(t,e){return Mf("ul",{class:"cm-tooltip-lint"},e.map((e=>bp(t,e,!1))))}const gp=t=>{let e=t.state.field(up,!1);return!(!e||!e.panel)&&(t.dispatch({effects:cp.of(!1)}),!0)},mp=[{key:"Mod-Shift-m",run:t=>{let e=t.state.field(up,!1);var i,n;e&&e.panel||t.dispatch({effects:(i=t.state,n=[cp.of(!0)],i.field(up,!1)?n:n.concat(ut.appendConfig.of($p)))});let s=po(t,xp.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:t=>{let e=t.state.field(up,!1);if(!e)return!1;let i=t.state.selection.main,n=e.diagnostics.iter(i.to+1);return!(!n.value&&(n=e.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to))&&(t.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),!0)}}],wp=M.define({combine:t=>Object.assign({sources:t.map((t=>t.source)).filter((t=>null!=t))},Qt(t.map((t=>t.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null},{needsRefresh:(t,e)=>t?e?i=>t(i)||e(i):t:e}))});function vp(t){let e=[];if(t)t:for(let{name:i}of t){for(let t=0;t<i.length;t++){let n=i[t];if(/[a-zA-Z]/.test(n)&&!e.some((t=>t.toLowerCase()==n.toLowerCase()))){e.push(n);continue t}}e.push("")}return e}function bp(t,e,i){var n;let s=i?vp(e.actions):[];return Mf("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},Mf("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage():e.message),null===(n=e.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=lp(t.state.field(up).diagnostics,e);s&&i.apply(t,s.from,s.to)},{name:a}=i,l=s[n]?a.indexOf(s[n]):-1,h=l<0?a:[a.slice(0,l),Mf("u",a.slice(l,l+1)),a.slice(l+1)];return Mf("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${a}${l<0?"":` (access key "${s[n]})"`}.`},h)})),e.source&&Mf("div",{class:"cm-diagnosticSource"},e.source))}class yp extends ei{constructor(t){super(),this.diagnostic=t}eq(t){return t.diagnostic==this.diagnostic}toDOM(){return Mf("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class Sp{constructor(t,e){this.diagnostic=e,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=bp(t,e,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class xp{constructor(t){this.view=t,this.items=[];this.list=Mf("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:e=>{if(27==e.keyCode)gp(this.view),this.view.focus();else if(38==e.keyCode||33==e.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==e.keyCode||34==e.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==e.keyCode)this.moveSelection(0);else if(35==e.keyCode)this.moveSelection(this.items.length-1);else if(13==e.keyCode)this.view.focus();else{if(!(e.keyCode>=65&&e.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=vp(i.actions);for(let s=0;s<n.length;s++)if(n[s].toUpperCase().charCodeAt(0)==e.keyCode){let e=lp(this.view.state.field(up).diagnostics,i);e&&i.actions[s].apply(t,e.from,e.to)}}}e.preventDefault()},onclick:t=>{for(let e=0;e<this.items.length;e++)this.items[e].dom.contains(t.target)&&this.moveSelection(e)}}),this.dom=Mf("div",{class:"cm-panel-lint"},this.list,Mf("button",{type:"button",name:"close","aria-label":this.view.state.phrase("close"),onclick:()=>gp(this.view)},"×")),this.update()}get selectedIndex(){let t=this.view.state.field(up).selected;if(!t)return-1;for(let e=0;e<this.items.length;e++)if(this.items[e].diagnostic==t.diagnostic)return e;return-1}update(){let{diagnostics:t,selected:e}=this.view.state.field(up),i=0,n=!1,s=null;for(t.between(0,this.view.state.doc.length,((t,r,{spec:o})=>{let a,l=-1;for(let t=i;t<this.items.length;t++)if(this.items[t].diagnostic==o.diagnostic){l=t;break}l<0?(a=new Sp(this.view,o.diagnostic),this.items.splice(i,0,a),n=!0):(a=this.items[l],l>i&&(this.items.splice(i,l-i),n=!0)),e&&a.diagnostic==e.diagnostic?a.dom.hasAttribute("aria-selected")||(a.dom.setAttribute("aria-selected","true"),s=a):a.dom.hasAttribute("aria-selected")&&a.dom.removeAttribute("aria-selected"),i++}));i<this.items.length&&!(1==this.items.length&&this.items[0].diagnostic.from<0);)n=!0,this.items.pop();0==this.items.length&&(this.items.push(new Sp(this.view,{from:-1,to:-1,severity:"info",message:this.view.state.phrase("No diagnostics")})),n=!0),s?(this.list.setAttribute("aria-activedescendant",s.id),this.view.requestMeasure({key:this,read:()=>({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:t,panel:e})=>{let i=e.height/this.list.offsetHeight;t.top<e.top?this.list.scrollTop-=(e.top-t.top)/i:t.bottom>e.bottom&&(this.list.scrollTop+=(t.bottom-e.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let t=this.list.firstChild;function e(){let e=t;t=e.nextSibling,e.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;t!=i.dom;)e();t=i.dom.nextSibling}else this.list.insertBefore(i.dom,t);for(;t;)e()}moveSelection(t){if(this.selectedIndex<0)return;let e=lp(this.view.state.field(up).diagnostics,this.items[t].diagnostic);e&&this.view.dispatch({selection:{anchor:e.from,head:e.to},scrollIntoView:!0,effects:fp.of(e)})}static open(t){return new xp(t)}}function kp(t){return function(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" ${e}>${encodeURIComponent(t)}</svg>')`}(`<path d="m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0" stroke="${t}" fill="none" stroke-width=".7"/>`,'width="6" height="3"')}const Qp=Bs.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:kp("#d11")},".cm-lintRange-warning":{backgroundImage:kp("orange")},".cm-lintRange-info":{backgroundImage:kp("#999")},".cm-lintRange-hint":{backgroundImage:kp("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),$p=[up,Bs.decorations.compute([up],(t=>{let{selected:e,panel:i}=t.field(up);return e&&i&&e.from!=e.to?ni.set([dp.range(e.from,e.to)]):ni.none})),lo(pp,{hideOn:function(t,e){let i=t.startState.doc.lineAt(e.pos);return!(!t.effects.some((t=>t.is(hp)))&&!t.changes.touchesRange(i.from,i.to))}}),Qp],Pp=(()=>[jo(),_o(),Rr(),xc(),dh(),pr(),kr(),kt.allowMultipleSelections.of(!0),Dl(),vh(Sh,{fallback:!0}),Rh(),[Nd,Id],np(),zr(),Lr(),jr(),Kf(),Ks.of([...Ud,...Wf,...Xu,...qc,...sh,...sp,...mp])])(),Zp=(()=>[Rr(),xc(),pr(),vh(Sh,{fallback:!0}),Ks.of([...Wf,...qc])])();var Cp=Object.freeze({__proto__:null,EditorView:Bs,basicSetup:Pp,minimalSetup:Zp});class Tp{constructor(t,e,i,n,s,r,o,a,l,h=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=a,this.curContext=l,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((t,e)=>e%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new Tp(t,[],e,i,i,0,[],0,n?new Ap(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=65535&t,{parser:s}=this.p,r=s.dynamicPrecedence(n);if(r&&(this.score+=r),0==i)return this.pushState(s.getGoto(this.state,n,!0),this.reducePos),n<s.minRepeatTerm&&this.storeNode(n,this.reducePos,this.reducePos,4,!0),void this.reduceContext(n,this.reducePos);let o=this.stack.length-3*(i-1)-(262144&t?6:0),a=o?this.stack[o-2]:this.p.ranges[0].from,l=this.reducePos-a;l>=2e3&&!(null===(e=this.p.parser.nodeSet.types[n])||void 0===e?void 0:e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSize<l&&(this.p.bigReductionCount=1,this.p.lastBigReductionStart=a,this.p.lastBigReductionSize=l));let h=o?this.stack[o-1]:0,c=this.bufferBase+this.buffer.length-h;if(n<s.minRepeatTerm||131072&t){let t=s.stateFlag(this.state,1)?this.pos:this.reducePos;this.storeNode(n,a,t,c+4,!0)}if(262144&t)this.state=this.stack[o];else{let t=this.stack[o-3];this.state=s.getGoto(t,n,!0)}for(;this.stack.length>o;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,s=!1){if(0==t&&(!this.stack.length||this.stack[this.stack.length-1]<this.buffer.length+this.bufferBase)){let t=this,n=this.buffer.length;if(0==n&&t.parent&&(n=t.bufferBase-t.parent.bufferBase,t=t.parent),n>0&&0==t.buffer[n-4]&&t.buffer[n-1]>-1){if(e==i)return;if(t.buffer[n-2]>=e)return void(t.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4])for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4);this.buffer[s]=t,this.buffer[s+1]=e,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(t,e,i,n)}shift(t,e,i,n){if(131072&t)this.pushState(65535&t,this.pos);else if(0==(262144&t)){let s=t,{parser:r}=this.p;(n>this.pos||e<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(e,i),e<=r.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(t,e,i,n){65536&t?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new Tp(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Rp(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(0==i)return!1;if(0==(65536&i))return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s<e.length;s+=2)(n=e[s+1])!=this.state&&this.p.parser.hasAction(n,t)&&i.push(e[s],n);if(this.stack.length<120)for(let t=0;i.length<8&&t<e.length;t+=2){let n=e[t+1];i.some(((t,e)=>1&e&&t==n))||i.push(e[t],n)}e=i}let i=[];for(let t=0;t<e.length&&i.length<4;t+=2){let n=e[t+1];if(n==this.state)continue;let s=this.split();s.pushState(n,this.pos),s.storeNode(0,s.pos,s.pos,4,!0),s.shiftContext(e[t],this.pos),s.reducePos=this.pos,s.score-=200,i.push(s)}return i}forceReduce(){let{parser:t}=this.p,e=t.stateSlot(this.state,5);if(0==(65536&e))return!1;if(!t.validAction(this.state,e)){let i=e>>19,n=65535&e,s=this.stack.length-3*i;if(s<0||t.getGoto(this.stack[s],n,!1)<0){let t=this.findForcedReduction();if(null==t)return!1;e=t}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,s)=>{if(!e.includes(n))return e.push(n),t.allActions(n,(e=>{if(393216&e);else if(65536&e){let i=(e>>19)-s;if(i>1){let n=65535&e,s=this.stack.length-3*i;if(s>=0&&t.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let t=i(e,s+1);if(null!=t)return t}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:t}=this.p;return 65535==t.data[t.stateSlot(this.state,1)]&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;e<this.stack.length;e+=3)if(this.stack[e]!=t.stack[e])return!1;return!0}get parser(){return this.p.parser}dialectEnabled(t){return this.p.parser.dialect.flags[t]}shiftContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.shift(this.curContext.context,t,this,this.p.stream.reset(e)))}reduceContext(t,e){this.curContext&&this.updateContext(this.curContext.tracker.reduce(this.curContext.context,t,this,this.p.stream.reset(e)))}emitContext(){let t=this.buffer.length-1;(t<0||-3!=this.buffer[t])&&this.buffer.push(this.curContext.hash,this.pos,this.pos,-3)}emitLookAhead(){let t=this.buffer.length-1;(t<0||-4!=this.buffer[t])&&this.buffer.push(this.lookAhead,this.pos,this.pos,-4)}updateContext(t){if(t!=this.curContext.context){let e=new Ap(this.curContext.tracker,t);e.hash!=this.curContext.hash&&this.emitContext(),this.curContext=e}}setLookAhead(t){t>this.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class Ap{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}}class Rp{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=65535&t,i=t>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}}class Xp{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,0==this.index&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new Xp(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;null!=t&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Xp(this.stack,this.pos,this.index)}}function Yp(t,e=Uint16Array){if("string"!=typeof t)return t;let i=null;for(let n=0,s=0;n<t.length;){let r=0;for(;;){let e=t.charCodeAt(n++),i=!1;if(126==e){r=65535;break}e>=92&&e--,e>=34&&e--;let s=e-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new e(r)}return i}class Wp{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Mp=new Wp;class jp{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Mp,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,s=this.pos+t;for(;s<i.from;){if(!n)return null;let t=this.ranges[--n];s-=i.from-t.to,i=t}for(;e<0?s>i.to:s>=i.to;){if(n==this.ranges.length-1)return null;let t=this.ranges[++n];s+=t.from-i.to,i=t}return s}clipPos(t){if(t>=this.range.from&&t<this.range.to)return t;for(let e of this.ranges)if(e.to>t)return Math.max(t,e.from);return this.end}peek(t){let e,i,n=this.chunkOff+t;if(n>=0&&n<this.chunk.length)e=this.pos+t,i=this.chunk.charCodeAt(n);else{let n=this.resolveOffset(t,1);if(null==n)return-1;if(e=n,e>=this.chunk2Pos&&e<this.chunk2Pos+this.chunk2.length)i=this.chunk2.charCodeAt(e-this.chunk2Pos);else{let t=this.rangeIndex,n=this.range;for(;n.to<=e;)n=this.ranges[++t];this.chunk2=this.input.chunk(this.chunk2Pos=e),e+this.chunk2.length>n.to&&(this.chunk2=this.chunk2.slice(0,n.to-e)),i=this.chunk2.charCodeAt(0)}}return e>=this.token.lookAhead&&(this.token.lookAhead=e+1),i}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(null==i||i<this.token.start)throw new RangeError("Token end out of bounds");this.token.value=t,this.token.end=i}acceptTokenTo(t,e){this.token.value=t,this.token.end=e}getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chunk2.length){let{chunk:t,chunkPos:e}=this;this.chunk=this.chunk2,this.chunkPos=this.chunk2Pos,this.chunk2=t,this.chunk2Pos=e,this.chunkOff=this.pos-this.chunkPos}else{this.chunk2=this.chunk,this.chunk2Pos=this.chunkPos;let t=this.input.chunk(this.pos),e=this.pos+t.length;this.chunk=e>this.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Mp,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t<this.range.from;)this.range=this.ranges[--this.rangeIndex];for(;t>=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t<this.chunkPos+this.chunk.length?this.chunkOff=t-this.chunkPos:(this.chunk="",this.chunkOff=0),this.readNext()}return this}read(t,e){if(t>=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}}class Dp{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;_p(this.data,t,e,this.id,i.data,i.tokenPrecTable)}}Dp.prototype.contextual=Dp.prototype.fallback=Dp.prototype.extend=!1;class Ep{constructor(t,e,i){this.precTable=e,this.elseToken=i,this.data="string"==typeof t?Yp(t):t}token(t,e){let i=t.pos,n=0;for(;;){let i=t.next<0,s=t.resolveOffset(1,1);if(_p(this.data,t,e,0,this.data,this.precTable),t.token.value>-1)break;if(null==this.elseToken)return;if(i||n++,null==s)break;t.reset(s,t.token)}n&&(t.reset(i,t.token),t.acceptToken(this.elseToken,n))}}Ep.prototype.contextual=Dp.prototype.fallback=Dp.prototype.extend=!1;class qp{constructor(t,e={}){this.token=t,this.contextual=!!e.contextual,this.fallback=!!e.fallback,this.extend=!!e.extend}}function _p(t,e,i,n,s,r){let o=0,a=1<<n,{dialect:l}=i.p.parser;t:for(;0!=(a&t[o]);){let i=t[o+1];for(let n=o+3;n<i;n+=2)if((t[n+1]&a)>0){let i=t[n];if(l.allows(i)&&(-1==e.token.value||e.token.value==i||Ip(i,e.token.value,s,r))){e.acceptToken(i);break}}let n=e.next,h=0,c=t[o+2];if(!(e.next<0&&c>h&&65535==t[i+3*c-3])){for(;h<c;){let s=h+c>>1,r=i+s+(s<<1),a=t[r],l=t[r+1]||65536;if(n<a)c=s;else{if(!(n>=l)){o=t[r+2],e.advance();continue t}h=s+1}}break}o=t[i+3*c-1]}}function Vp(t,e,i){for(let n,s=e;65535!=(n=t[s]);s++)if(n==i)return s-e;return-1}function Ip(t,e,i,n){let s=Vp(i,n,e);return s<0||Vp(i,n,t)<s}const zp="undefined"!=typeof process&&process.env&&/\bparse\b/.test(process.env.LOG);let Bp=null;function Gp(t,e,i){let n=t.cursor(sa.IncludeAnonymous);for(n.moveTo(e);;)if(!(i<0?n.childBefore(e):n.childAfter(e)))for(;;){if((i<0?n.to<e:n.from>e)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(t.length,Math.max(n.from+1,e+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:t.length}}class Lp{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Gp(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Gp(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(t<this.nextStart)return null;for(;this.fragment&&this.safeTo<=t;)this.nextFragment();if(!this.fragment)return null;for(;;){let e=this.trees.length-1;if(e<0)return this.nextFragment(),null;let i=this.trees[e],n=this.index[e];if(n==i.children.length){this.trees.pop(),this.start.pop(),this.index.pop();continue}let s=i.children[n],r=this.start[e]+i.positions[n];if(r>t)return this.nextStart=r,null;if(s instanceof ra){if(r==t){if(r<this.safeFrom)return null;let t=r+s.length;if(t<=this.safeTo){let e=s.prop(Fo.lookAhead);if(!e||t+e<this.fragment.to)return s}}this.index[e]++,r+s.length>=Math.max(this.safeFrom,t)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[e]++,this.nextStart=r+s.length}}}class Np{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map((t=>new Wp))}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:s}=n,r=n.stateSlot(t.state,3),o=t.curContext?t.curContext.hash:0,a=0;for(let n=0;n<s.length;n++){if(0==(1<<n&r))continue;let l=s[n],h=this.tokens[n];if((!i||l.fallback)&&((l.contextual||h.start!=t.pos||h.mask!=r||h.context!=o)&&(this.updateCachedToken(h,l,t),h.mask=r,h.context=o),h.lookAhead>h.end+25&&(a=Math.max(h.lookAhead,a)),0!=h.value)){let n=e;if(h.extended>-1&&(e=this.addActions(t,h.extended,h.end,e)),e=this.addActions(t,h.value,h.end,e),!l.extend&&(i=h,e>n))break}}for(;this.actions.length>e;)this.actions.pop();return a&&t.setLookAhead(a),i||t.pos!=this.stream.end||(i=new Wp,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Wp,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:e}=i.p;for(let n=0;n<e.specialized.length;n++)if(e.specialized[n]==t.value){let s=e.specializers[n](this.stream.read(t.start,t.end),i);if(s>=0&&i.p.parser.dialect.allows(s>>1)){0==(1&s)?t.value=s>>1:t.extended=s>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let e=0;e<n;e+=3)if(this.actions[e]==t)return n;return this.actions[n++]=t,this.actions[n++]=e,this.actions[n++]=i,n}addActions(t,e,i,n){let{state:s}=t,{parser:r}=t.p,{data:o}=r;for(let t=0;t<2;t++)for(let a=r.stateSlot(s,t?2:1);;a+=3){if(65535==o[a]){if(1!=o[a+1]){0==n&&2==o[a+1]&&(n=this.putAction(tO(o,a+2),e,i,n));break}a=tO(o,a+2)}o[a]==e&&(n=this.putAction(tO(o,a+1),e,i,n))}return n}}class Up{constructor(t,e,i,n){this.parser=t,this.input=e,this.ranges=n,this.recovering=0,this.nextStackID=9812,this.minStackPos=0,this.reused=[],this.stoppedAt=null,this.lastBigReductionStart=-1,this.lastBigReductionSize=0,this.bigReductionCount=0,this.stream=new jp(e,n),this.tokens=new Np(t,this.stream),this.topTerm=t.top[1];let{from:s}=n[0];this.stacks=[Tp.start(this,t.top[0],s)],this.fragments=i.length&&this.stream.end-s>4*t.bufferLength?new Lp(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t,e,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[t]=i;for(;t.forceReduce()&&t.stack.length&&t.stack[t.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;r<i.length;r++){let o=i[r];for(;;){if(this.tokens.mainToken=null,o.pos>n)s.push(o);else{if(this.advanceStack(o,s,i))continue;{t||(t=[],e=[]),t.push(o);let i=this.tokens.getMainToken(o);e.push(i.value,i.end)}}break}}if(!s.length){let e=t&&function(t){let e=null;for(let i of t){let t=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=t&&i.pos>t)&&i.p.parser.stateFlag(i.state,2)&&(!e||e.score<i.score)&&(e=i)}return e}(t);if(e)return zp&&console.log("Finish with "+this.stackID(e)),this.stackToTree(e);if(this.parser.strict)throw zp&&t&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+n);this.recovering||(this.recovering=5)}if(this.recovering&&t){let i=null!=this.stoppedAt&&t[0].pos>this.stoppedAt?t[0]:this.runRecovery(t,e,s);if(i)return zp&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let t=1==this.recovering?1:3*this.recovering;if(s.length>t)for(s.sort(((t,e)=>e.score-t.score));s.length>t;)s.pop();s.some((t=>t.reducePos>n))&&this.recovering--}else if(s.length>1){t:for(let t=0;t<s.length-1;t++){let e=s[t];for(let i=t+1;i<s.length;i++){let n=s[i];if(e.sameState(n)||e.buffer.length>500&&n.buffer.length>500){if(!((e.score-n.score||e.buffer.length-n.buffer.length)>0)){s.splice(t--,1);continue t}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let t=1;t<s.length;t++)s[t].pos<this.minStackPos&&(this.minStackPos=s[t].pos);return null}stopAt(t){if(null!=this.stoppedAt&&this.stoppedAt<t)throw new RangeError("Can't move stoppedAt forward");this.stoppedAt=t}advanceStack(t,e,i){let n=t.pos,{parser:s}=this,r=zp?this.stackID(t)+" -> ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let e=t.curContext&&t.curContext.tracker.strict,i=e?t.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(t.state,o.type.id):-1;if(n>-1&&o.length&&(!e||(o.prop(Fo.contextHash)||0)==i))return t.useNode(o,n),zp&&console.log(r+this.stackID(t)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof ra)||0==o.children.length||o.positions[0]>0)break;let a=o.children[0];if(!(a instanceof ra&&0==o.positions[0]))break;o=a}}let o=s.stateSlot(t.state,4);if(o>0)return t.reduce(o),zp&&console.log(r+this.stackID(t)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let a=this.tokens.getActions(t);for(let o=0;o<a.length;){let l=a[o++],h=a[o++],c=a[o++],f=o==a.length||!i,u=f?t:t.split(),d=this.tokens.mainToken;if(u.apply(l,h,d?d.start:u.pos,c),zp&&console.log(r+this.stackID(u)+` (via ${0==(65536&l)?"shift":`reduce of ${s.getName(65535&l)}`} for ${s.getName(h)} @ ${n}${u==t?"":", split"})`),f)return!0;u.pos>n?e.push(u):i.push(u)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Hp(t,e),!0}}runRecovery(t,e,i){let n=null,s=!1;for(let r=0;r<t.length;r++){let o=t[r],a=e[r<<1],l=e[1+(r<<1)],h=zp?this.stackID(o)+" -> ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),zp&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),f=h;for(let t=0;c.forceReduce()&&t<10;t++){if(zp&&console.log(f+this.stackID(c)+" (via force-reduce)"),this.advanceFully(c,i))break;zp&&(f=this.stackID(c)+" -> ")}for(let t of o.recoverByInsert(a))zp&&console.log(h+this.stackID(t)+" (via recover-insert)"),this.advanceFully(t,i);this.stream.end>o.pos?(l==o.pos&&(l++,a=0),o.recoverByDelete(a,l),zp&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(a)})`),Hp(o,i)):(!n||n.score<o.score)&&(n=o)}return n}stackToTree(t){return t.close(),ra.build({buffer:Xp.create(t),nodeSet:this.parser.nodeSet,topID:this.topTerm,maxBufferLength:this.parser.bufferLength,reused:this.reused,start:this.ranges[0].from,length:t.pos-this.ranges[0].from,minRepeatType:this.parser.minRepeatTerm})}stackID(t){let e=(Bp||(Bp=new WeakMap)).get(t);return e||Bp.set(t,e=String.fromCodePoint(this.nextStackID++)),e+t}}function Hp(t,e){for(let i=0;i<e.length;i++){let n=e[i];if(n.pos==t.pos&&n.sameState(t))return void(e[i].score<t.score&&(e[i]=t))}e.push(t)}class Fp{constructor(t,e,i){this.source=t,this.flags=e,this.disabled=i}allows(t){return!this.disabled||0==this.disabled[t]}}const Jp=t=>t;class Kp extends Qa{constructor(t){if(super(),this.wrappers=[],14!=t.version)throw new RangeError(`Parser version (${t.version}) doesn't match runtime version (14)`);let e=t.nodeNames.split(" ");this.minRepeatTerm=e.length;for(let i=0;i<t.repeatNodeCount;i++)e.push("");let i=Object.keys(t.topRules).map((e=>t.topRules[e][1])),n=[];for(let t=0;t<e.length;t++)n.push([]);function s(t,e,i){n[t].push([e,e.deserialize(String(i))])}if(t.nodeProps)for(let e of t.nodeProps){let t=e[0];"string"==typeof t&&(t=Fo[t]);for(let i=1;i<e.length;){let n=e[i++];if(n>=0)s(n,t,e[i++]);else{let r=e[i+-n];for(let o=-n;o>0;o--)s(e[i++],t,r);i++}}}this.nodeSet=new ea(e.map(((e,s)=>ta.define({name:s>=this.minRepeatTerm?void 0:e,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:t.skippedNodes&&t.skippedNodes.indexOf(s)>-1})))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=No;let r=Yp(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let t=0;t<this.specializerSpecs.length;t++)this.specialized[t]=this.specializerSpecs[t].term;this.specializers=this.specializerSpecs.map(eO),this.states=Yp(t.states,Uint32Array),this.data=Yp(t.stateData),this.goto=Yp(t.goto),this.maxTerm=t.maxTerm,this.tokenizers=t.tokenizers.map((t=>"number"==typeof t?new Dp(r,t):t)),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new Up(this,t,e,i);for(let s of this.wrappers)n=s(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let s=n[e+1];;){let e=n[s++],r=1&e,o=n[s++];if(r&&i)return o;for(let i=s+(e>>1);s<i;s++)if(n[s]==t)return o;if(r)return-1}}hasAction(t,e){let i=this.data;for(let n=0;n<2;n++)for(let s,r=this.stateSlot(t,n?2:1);;r+=3){if(65535==(s=i[r])){if(1!=i[r+1]){if(2==i[r+1])return tO(i,r+2);break}s=i[r=tO(i,r+2)]}if(s==e||0==s)return tO(i,r+1)}return 0}stateSlot(t,e){return this.states[6*t+e]}stateFlag(t,e){return(this.stateSlot(t,0)&e)>0}validAction(t,e){return!!this.allActions(t,(t=>t==e||null))}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let i=this.stateSlot(t,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=tO(this.data,i+2)}n=e(tO(this.data,i+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=tO(this.data,i+2)}if(0==(1&this.data[i+2])){let t=this.data[i+1];e.some(((e,i)=>1&i&&e==t))||e.push(this.data[i],t)}}return e}configure(t){let e=Object.assign(Object.create(Kp.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map((e=>{let i=t.tokenizers.find((t=>t.from==e));return i?i.to:e}))),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=t.specializers.find((t=>t.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return e.specializers[n]=eO(r),r}))),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),null!=t.strict&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),null!=t.bufferLength&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return null==e?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map((()=>!1));if(t)for(let n of t.split(" ")){let t=e.indexOf(n);t>=0&&(i[t]=!0)}let n=null;for(let t=0;t<e.length;t++)if(!i[t])for(let i,s=this.dialects[e[t]];65535!=(i=this.data[s++]);)(n||(n=new Uint8Array(this.maxTerm+1)))[i]=1;return new Fp(t,i,n)}static deserialize(t){return new Kp(t)}}function tO(t,e){return t[e]|t[e+1]<<16}function eO(t){if(t.external){let e=t.extend?1:0;return(i,n)=>t.external(i,n)<<1|e}return t.get}const iO=[9,10,11,12,13,32,133,160,5760,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8232,8233,8239,8287,12288],nO=new class{constructor(t){this.start=t.start,this.shift=t.shift||Jp,this.reduce=t.reduce||Jp,this.reuse=t.reuse||Jp,this.hash=t.hash||(()=>0),this.strict=!1!==t.strict}}({start:!1,shift:(t,e)=>4==e||5==e||312==e?t:313==e,strict:!1}),sO=new qp(((t,e)=>{let{next:i}=t;(125==i||-1==i||e.context)&&t.acceptToken(310)}),{contextual:!0,fallback:!0}),rO=new qp(((t,e)=>{let i,{next:n}=t;iO.indexOf(n)>-1||(47!=n||47!=(i=t.peek(1))&&42!=i)&&(125==n||59==n||-1==n||e.context||t.acceptToken(309))}),{contextual:!0}),oO=new qp(((t,e)=>{let{next:i}=t;if((43==i||45==i)&&(t.advance(),i==t.next)){t.advance();let i=!e.context&&e.canShift(1);t.acceptToken(i?1:2)}}),{contextual:!0});function aO(t,e){return t>=65&&t<=90||t>=97&&t<=122||95==t||t>=192||!e&&t>=48&&t<=57}const lO=new qp(((t,e)=>{if(60!=t.next||!e.dialectEnabled(0))return;if(t.advance(),47==t.next)return;let i=0;for(;iO.indexOf(t.next)>-1;)t.advance(),i++;if(aO(t.next,!0)){for(t.advance(),i++;aO(t.next,!1);)t.advance(),i++;for(;iO.indexOf(t.next)>-1;)t.advance(),i++;if(44==t.next)return;for(let e=0;;e++){if(7==e){if(!aO(t.next,!0))return;break}if(t.next!="extends".charCodeAt(e))break;t.advance(),i++}}t.acceptToken(3,-i)})),hO=Aa({"get set async static":Ka.modifier,"for while do if else switch try catch finally return throw break continue default case":Ka.controlKeyword,"in of await yield void typeof delete instanceof":Ka.operatorKeyword,"let var const using function class extends":Ka.definitionKeyword,"import export from":Ka.moduleKeyword,"with debugger as new":Ka.keyword,TemplateString:Ka.special(Ka.string),super:Ka.atom,BooleanLiteral:Ka.bool,this:Ka.self,null:Ka.null,Star:Ka.modifier,VariableName:Ka.variableName,"CallExpression/VariableName TaggedTemplateExpression/VariableName":Ka.function(Ka.variableName),VariableDefinition:Ka.definition(Ka.variableName),Label:Ka.labelName,PropertyName:Ka.propertyName,PrivatePropertyName:Ka.special(Ka.propertyName),"CallExpression/MemberExpression/PropertyName":Ka.function(Ka.propertyName),"FunctionDeclaration/VariableDefinition":Ka.function(Ka.definition(Ka.variableName)),"ClassDeclaration/VariableDefinition":Ka.definition(Ka.className),PropertyDefinition:Ka.definition(Ka.propertyName),PrivatePropertyDefinition:Ka.definition(Ka.special(Ka.propertyName)),UpdateOp:Ka.updateOperator,"LineComment Hashbang":Ka.lineComment,BlockComment:Ka.blockComment,Number:Ka.number,String:Ka.string,Escape:Ka.escape,ArithOp:Ka.arithmeticOperator,LogicOp:Ka.logicOperator,BitOp:Ka.bitwiseOperator,CompareOp:Ka.compareOperator,RegExp:Ka.regexp,Equals:Ka.definitionOperator,Arrow:Ka.function(Ka.punctuation),": Spread":Ka.punctuation,"( )":Ka.paren,"[ ]":Ka.squareBracket,"{ }":Ka.brace,"InterpolationStart InterpolationEnd":Ka.special(Ka.brace),".":Ka.derefOperator,", ;":Ka.separator,"@":Ka.meta,TypeName:Ka.typeName,TypeDefinition:Ka.definition(Ka.typeName),"type enum interface implements namespace module declare":Ka.definitionKeyword,"abstract global Privacy readonly override":Ka.modifier,"is keyof unique infer":Ka.operatorKeyword,JSXAttributeValue:Ka.attributeValue,JSXText:Ka.content,"JSXStartTag JSXStartCloseTag JSXSelfCloseEndTag JSXEndTag":Ka.angleBracket,"JSXIdentifier JSXNameSpacedName":Ka.tagName,"JSXAttribute/JSXIdentifier JSXAttribute/JSXNameSpacedName":Ka.attributeName,"JSXBuiltin/JSXIdentifier":Ka.standard(Ka.tagName)}),cO={__proto__:null,export:18,as:23,from:31,default:34,async:39,function:40,extends:52,this:56,true:64,false:64,null:76,void:80,typeof:84,super:102,new:136,delete:152,yield:161,await:165,class:170,public:227,private:227,protected:227,readonly:229,instanceof:248,satisfies:251,in:252,const:254,import:286,keyof:339,unique:343,infer:349,is:385,abstract:405,implements:407,type:409,let:412,var:414,using:417,interface:423,enum:427,namespace:433,module:435,declare:439,global:443,for:462,of:471,while:474,with:478,do:482,if:486,else:488,switch:492,case:498,try:504,catch:508,finally:512,return:516,throw:520,break:524,continue:528,debugger:532},fO={__proto__:null,async:123,get:125,set:127,declare:187,public:189,private:189,protected:189,static:191,abstract:193,override:195,readonly:201,accessor:203,new:389},uO={__proto__:null,"<":143},dO=Kp.deserialize({version:14,states:"$<UO%TQ^OOO%[Q^OOO'_Q`OOP(lOWOOO*zQ08SO'#ChO+RO!bO'#CiO+aO#tO'#CiO+oO?MpO'#D^O.QQ^O'#DdO.bQ^O'#DoO%[Q^O'#DyO0fQ^O'#EROOQ07b'#EZ'#EZO1PQWO'#EWOOQO'#El'#ElOOQO'#Ie'#IeO1XQWO'#GmO1dQWO'#EkO1iQWO'#EkO3kQ08SO'#JiO6[Q08SO'#JjO6xQWO'#FZO6}Q&jO'#FqOOQ07b'#Fc'#FcO7YO,YO'#FcO7hQ7[O'#FxO9UQWO'#FwOOQ07b'#Jj'#JjOOQ07`'#Ji'#JiO9ZQWO'#GqOOQU'#KU'#KUO9fQWO'#IRO9kQ07hO'#ISOOQU'#JW'#JWOOQU'#IW'#IWQ`Q^OOO`Q^OOO%[Q^O'#DqO9sQ^O'#D}O9zQ^O'#EPO9aQWO'#GmO:RQ7[O'#CnO:aQWO'#EjO:lQWO'#EuO:qQ7[O'#FbO;`QWO'#GmOOQO'#KV'#KVO;eQWO'#KVO;sQWO'#GuO;sQWO'#GvO;sQWO'#GxO9aQWO'#G{O<jQWO'#HOO>RQWO'#CdO>cQWO'#H[O>kQWO'#HbO>kQWO'#HdO`Q^O'#HfO>kQWO'#HhO>kQWO'#HkO>pQWO'#HqO>uQ07iO'#HwO%[Q^O'#HyO?QQ07iO'#H{O?]Q07iO'#H}O9kQ07hO'#IPO?hQ08SO'#ChO@jQ`O'#DiQOQWOOO%[Q^O'#EPOAQQWO'#ESO:RQ7[O'#EjOA]QWO'#EjOAhQpO'#FbOOQU'#Cf'#CfOOQ07`'#Dn'#DnOOQ07`'#Jm'#JmO%[Q^O'#JmOOQO'#Jq'#JqOOQO'#Ib'#IbOBhQ`O'#EcOOQ07`'#Eb'#EbOCdQ07pO'#EcOCnQ`O'#EVOOQO'#Jp'#JpODSQ`O'#JqOEaQ`O'#EVOCnQ`O'#EcPEnO!0LbO'#CaPOOO)CDu)CDuOOOO'#IX'#IXOEyO!bO,59TOOQ07b,59T,59TOOOO'#IY'#IYOFXO#tO,59TO%[Q^O'#D`OOOO'#I['#I[OFgO?MpO,59xOOQ07b,59x,59xOFuQ^O'#I]OGYQWO'#JkOI[QrO'#JkO+}Q^O'#JkOIcQWO,5:OOIyQWO'#ElOJWQWO'#JyOJcQWO'#JxOJcQWO'#JxOJkQWO,5;YOJpQWO'#JwOOQ07f,5:Z,5:ZOJwQ^O,5:ZOLxQ08SO,5:eOMiQWO,5:mONSQ07hO'#JvONZQWO'#JuO9ZQWO'#JuONoQWO'#JuONwQWO,5;XON|QWO'#JuO!#UQrO'#JjOOQ07b'#Ch'#ChO%[Q^O'#ERO!#tQpO,5:rOOQO'#Jr'#JrOOQO-E<c-E<cO9aQWO,5=XO!$[QWO,5=XO!$aQ^O,5;VO!&dQ7[O'#EgO!'}QWO,5;VO!)mQ7[O'#DsO!)tQ^O'#DxO!*OQ`O,5;`O!*WQ`O,5;`O%[Q^O,5;`OOQU'#FR'#FROOQU'#FT'#FTO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aO%[Q^O,5;aOOQU'#FX'#FXO!*fQ^O,5;rOOQ07b,5;w,5;wOOQ07b,5;x,5;xO!,iQWO,5;xOOQ07b,5;y,5;yO%[Q^O'#IiO!,qQ07hO,5<eO!&dQ7[O,5;aO!-`Q7[O,5;aO%[Q^O,5;uO!-gQ&jO'#FgO!.dQ&jO'#J}O!.OQ&jO'#J}O!.kQ&jO'#J}OOQO'#J}'#J}O!/PQ&jO,5<POOOS,5<],5<]O!/bQ^O'#FsOOOS'#Ih'#IhO7YO,YO,5;}O!/iQ&jO'#FuOOQ07b,5;},5;}O!0YQMhO'#CuOOQ07b'#Cy'#CyO!0mQWO'#CyO!0rO?MpO'#C}O!1`Q7[O,5<bO!1gQWO,5<dO!3SQ!LQO'#GSO!3aQWO'#GTO!3fQWO'#GTO!3kQ!LQO'#GXO!4jQ`O'#G]OOQO'#Gh'#GhO!(SQ7[O'#GgOOQO'#Gj'#GjO!(SQ7[O'#GiO!5]QMhO'#JdOOQ07b'#Jd'#JdO!5gQWO'#JcO!5uQWO'#JbO!5}QWO'#CtOOQ07b'#Cw'#CwOOQ07b'#DR'#DROOQ07b'#DT'#DTO1SQWO'#DVO!(SQ7[O'#FzO!(SQ7[O'#F|O!6VQWO'#GOO!6[QWO'#GPO!3fQWO'#GVO!(SQ7[O'#G[O!6aQWO'#EmO!7OQWO,5<cOOQ07`'#Cq'#CqO!7WQWO'#EnO!8QQ`O'#EoOOQ07`'#Jw'#JwO!8XQ07hO'#KWO9kQ07hO,5=]O`Q^O,5>mOOQU'#J`'#J`OOQU,5>n,5>nOOQU-E<U-E<UO!:ZQ08SO,5:]O!<wQ08SO,5:iO%[Q^O,5:iO!?bQ08SO,5:kOOQO,5@q,5@qO!@RQ7[O,5=XO!@aQ07hO'#JaO9UQWO'#JaO!@rQ07hO,59YO!@}Q`O,59YO!AVQ7[O,59YO:RQ7[O,59YO!AbQWO,5;VO!AjQWO'#HZO!BOQWO'#KZO%[Q^O,5;zO!7{Q`O,5;|O!BWQWO,5=tO!B]QWO,5=tO!BbQWO,5=tO9kQ07hO,5=tO;sQWO,5=dOOQO'#Cu'#CuO!BpQ`O,5=aO!BxQ7[O,5=bO!CTQWO,5=dO!CYQpO,5=gO!CbQWO'#KVO>pQWO'#HQO9aQWO'#HSO!CgQWO'#HSO:RQ7[O'#HUO!ClQWO'#HUOOQU,5=j,5=jO!CqQWO'#HVO!DSQWO'#CnO!DXQWO,59OO!DcQWO,59OO!FhQ^O,59OOOQU,59O,59OO!FxQ07hO,59OO%[Q^O,59OO!ITQ^O'#H^OOQU'#H_'#H_OOQU'#H`'#H`O`Q^O,5=vO!IkQWO,5=vO`Q^O,5=|O`Q^O,5>OO!IpQWO,5>QO`Q^O,5>SO!IuQWO,5>VO!IzQ^O,5>]OOQU,5>c,5>cO%[Q^O,5>cO9kQ07hO,5>eOOQU,5>g,5>gO!NUQWO,5>gOOQU,5>i,5>iO!NUQWO,5>iOOQU,5>k,5>kO!NZQ`O'#D[O%[Q^O'#JmO!NxQ`O'#JmO# gQ`O'#DjO# xQ`O'#DjO#$ZQ^O'#DjO#$bQWO'#JlO#$jQWO,5:TO#$oQWO'#EpO#$}QWO'#JzO#%VQWO,5;ZO#%[Q`O'#DjO#%iQ`O'#EUOOQ07b,5:n,5:nO%[Q^O,5:nO#%pQWO,5:nO>pQWO,5;UO!@}Q`O,5;UO!AVQ7[O,5;UO:RQ7[O,5;UO#%xQWO,5@XO#%}Q$ISO,5:rOOQO-E<`-E<`O#'TQ07pO,5:}OCnQ`O,5:qO#'_Q`O,5:qOCnQ`O,5:}O!@rQ07hO,5:qOOQ07`'#Ef'#EfOOQO,5:},5:}O%[Q^O,5:}O#'lQ07hO,5:}O#'wQ07hO,5:}O!@}Q`O,5:qOOQO,5;T,5;TO#(VQ07hO,5:}POOO'#IV'#IVP#(kO!0LbO,58{POOO,58{,58{OOOO-E<V-E<VOOQ07b1G.o1G.oOOOO-E<W-E<WO#(vQpO,59zOOOO-E<Y-E<YOOQ07b1G/d1G/dO#({QrO,5>wO+}Q^O,5>wOOQO,5>},5>}O#)VQ^O'#I]OOQO-E<Z-E<ZO#)dQWO,5@VO#)lQrO,5@VO#)sQWO,5@dOOQ07b1G/j1G/jO%[Q^O,5@eO#){QWO'#IcOOQO-E<a-E<aO#)sQWO,5@dOOQ07`1G0t1G0tOOQ07f1G/u1G/uOOQ07f1G0X1G0XO%[Q^O,5@bO#*aQ07hO,5@bO#*rQ07hO,5@bO#*yQWO,5@aO9ZQWO,5@aO#+RQWO,5@aO#+aQWO'#IfO#*yQWO,5@aOOQ07`1G0s1G0sO!*OQ`O,5:tO!*ZQ`O,5:tOOQO,5:v,5:vO#,RQWO,5:vO#,ZQ7[O1G2sO9aQWO1G2sOOQ07b1G0q1G0qO#,iQ08SO1G0qO#-nQ08QO,5;ROOQ07b'#GR'#GRO#.[Q08SO'#JdO!$aQ^O1G0qO#0dQ7[O'#JnO#0nQWO,5:_O#0sQrO'#JoO%[Q^O'#JoO#0}QWO,5:dOOQ07b'#D['#D[OOQ07b1G0z1G0zO%[Q^O1G0zOOQ07b1G1d1G1dO#1SQWO1G0zO#3kQ08SO1G0{O#3rQ08SO1G0{O#6]Q08SO1G0{O#6dQ08SO1G0{O#8nQ08SO1G0{O#9UQ08SO1G0{O#<OQ08SO1G0{O#<VQ08SO1G0{O#>jQ08SO1G0{O#>wQ08SO1G0{O#@uQ08SO1G0{O#CuQ(CYO'#ChO#EsQ(CYO1G1^O#EzQ(CYO'#JjO!,lQWO1G1dO#F[Q08SO,5?TOOQ07`-E<g-E<gO#GOQ08SO1G0{OOQ07b1G0{1G0{O#IZQ08SO1G1aO#I}Q&jO,5<TO#JVQ&jO,5<UO#J_Q&jO'#FlO#JvQWO'#FkOOQO'#KO'#KOOOQO'#Ig'#IgO#J{Q&jO1G1kOOQ07b1G1k1G1kOOOS1G1v1G1vO#K^Q(CYO'#JiO#KhQWO,5<_O!*fQ^O,5<_OOOS-E<f-E<fOOQ07b1G1i1G1iO#KmQ`O'#J}OOQ07b,5<a,5<aO#KuQ`O,5<aOOQ07b,59e,59eO!&dQ7[O'#DPOOOO'#IZ'#IZO#KzO?MpO,59iOOQ07b,59i,59iO%[Q^O1G1|O!6[QWO'#IkO#LVQ7[O,5<uOOQ07b,5<r,5<rO!(SQ7[O'#InO#LuQ7[O,5=RO!(SQ7[O'#IpO#MhQ7[O,5=TO!&dQ7[O,5=VOOQO1G2O1G2OO#MrQpO'#CqO#NVQpO,5<nO#N^QWO'#KRO9aQWO'#KRO#NlQWO,5<pO!(SQ7[O,5<oO#NqQWO'#GUO#N|QWO,5<oO$ RQpO'#GRO$ `QpO'#KSO$ jQWO'#KSO!&dQ7[O'#KSO$ oQWO,5<sO$ tQ`O'#G^O!4eQ`O'#G^O$!VQWO'#G`O$![QWO'#GbO!3fQWO'#GeO$!aQ07hO'#ImO$!lQ`O,5<wOOQ07f,5<w,5<wO$!sQ`O'#G^O$#RQ`O'#G_O$#ZQ`O'#G_O$#`Q7[O,5=RO$#pQ7[O,5=TOOQ07b,5=W,5=WO!(SQ7[O,5?}O!(SQ7[O,5?}O$$QQWO'#IrO$$]QWO,5?|O$$eQWO,59`O$%UQ7[O,59qOOQ07b,59q,59qO$%wQ7[O,5<fO$&jQ7[O,5<hO@bQWO,5<jOOQ07b,5<k,5<kO$&tQWO,5<qO$&yQ7[O,5<vO$'ZQWO'#JuO!$aQ^O1G1}O$'`QWO1G1}O9ZQWO'#JxO9ZQWO'#EpO%[Q^O'#EpO9ZQWO'#ItO$'eQ07hO,5@rOOQU1G2w1G2wOOQU1G4X1G4XOOQ07b1G/w1G/wO!,iQWO1G/wO$)jQ08SO1G0TOOQU1G2s1G2sO!&dQ7[O1G2sO%[Q^O1G2sO#,^QWO1G2sO$+nQ7[O'#EgOOQ07`,5?{,5?{O$+xQ07hO,5?{OOQU1G.t1G.tO!@rQ07hO1G.tO!@}Q`O1G.tO!AVQ7[O1G.tO$,ZQWO1G0qO$,`QWO'#ChO$,kQWO'#K[O$,sQWO,5=uO$,xQWO'#K[O$,}QWO'#K[O$-]QWO'#IzO$-kQWO,5@uO$-sQrO1G1fOOQ07b1G1h1G1hO9aQWO1G3`O@bQWO1G3`O$-zQWO1G3`O$.PQWO1G3`OOQU1G3`1G3`O!CTQWO1G3OO!&dQ7[O1G2{O$.UQWO1G2{OOQU1G2|1G2|O!&dQ7[O1G2|O$.ZQWO1G2|O$.cQ`O'#GzOOQU1G3O1G3OO!4eQ`O'#IvO!CYQpO1G3ROOQU1G3R1G3ROOQU,5=l,5=lO$.kQ7[O,5=nO9aQWO,5=nO$![QWO,5=pO9UQWO,5=pO!@}Q`O,5=pO!AVQ7[O,5=pO:RQ7[O,5=pO$.yQWO'#KYO$/UQWO,5=qOOQU1G.j1G.jO$/ZQ07hO1G.jO@bQWO1G.jO$/fQWO1G.jO9kQ07hO1G.jO$1kQrO,5@wO$1{QWO,5@wO9ZQWO,5@wO$2WQ^O,5=xO$2_QWO,5=xOOQU1G3b1G3bO`Q^O1G3bOOQU1G3h1G3hOOQU1G3j1G3jO>kQWO1G3lO$2dQ^O1G3nO$6hQ^O'#HmOOQU1G3q1G3qO$6uQWO'#HsO>pQWO'#HuOOQU1G3w1G3wO$6}Q^O1G3wO9kQ07hO1G3}OOQU1G4P1G4POOQ07`'#GY'#GYO9kQ07hO1G4RO9kQ07hO1G4TO$;UQWO,5@XO!*fQ^O,5;[O9ZQWO,5;[O>pQWO,5:UO!*fQ^O,5:UO!@}Q`O,5:UO$;ZQ(CYO,5:UOOQO,5;[,5;[O$;eQ`O'#I^O$;{QWO,5@WOOQ07b1G/o1G/oO$<TQ`O'#IdO$<_QWO,5@fOOQ07`1G0u1G0uO# xQ`O,5:UOOQO'#Ia'#IaO$<gQ`O,5:pOOQ07f,5:p,5:pO#%sQWO1G0YOOQ07b1G0Y1G0YO%[Q^O1G0YOOQ07b1G0p1G0pO>pQWO1G0pO!@}Q`O1G0pO!AVQ7[O1G0pOOQ07`1G5s1G5sO!@rQ07hO1G0]OOQO1G0i1G0iO%[Q^O1G0iO$<nQ07hO1G0iO$<yQ07hO1G0iO!@}Q`O1G0]OCnQ`O1G0]O$=XQ07hO1G0iOOQO1G0]1G0]O$=mQ08SO1G0iPOOO-E<T-E<TPOOO1G.g1G.gOOOO1G/f1G/fO$=wQpO,5<eO$>PQrO1G4cOOQO1G4i1G4iO%[Q^O,5>wO$>ZQWO1G5qO$>cQWO1G6OO$>kQrO1G6PO9ZQWO,5>}O$>uQ08SO1G5|O%[Q^O1G5|O$?VQ07hO1G5|O$?hQWO1G5{O$?hQWO1G5{O9ZQWO1G5{O$?pQWO,5?QO9ZQWO,5?QOOQO,5?Q,5?QO$@UQWO,5?QO$'ZQWO,5?QOOQO-E<d-E<dOOQO1G0`1G0`OOQO1G0b1G0bO!,lQWO1G0bOOQU7+(_7+(_O!&dQ7[O7+(_O%[Q^O7+(_O$@dQWO7+(_O$@oQ7[O7+(_O$@}Q08SO,5=RO$CYQ08SO,5=TO$EeQ08SO,5=RO$GvQ08SO,5=TO$JXQ08SO,59qO$LaQ08SO,5<fO$NlQ08SO,5<hO%!wQ08SO,5<vOOQ07b7+&]7+&]O%%YQ08SO7+&]O%%|Q7[O'#I_O%&WQWO,5@YOOQ07b1G/y1G/yO%&`Q^O'#I`O%&mQWO,5@ZO%&uQrO,5@ZOOQ07b1G0O1G0OO%'PQWO7+&fOOQ07b7+&f7+&fO%'UQ(CYO,5:eO%[Q^O7+&xO%'`Q(CYO,5:]O%'mQ(CYO,5:iO%'wQ(CYO,5:kOOQ07b7+'O7+'OOOQO1G1o1G1oOOQO1G1p1G1pO%(RQtO,5<WO!*fQ^O,5<VOOQO-E<e-E<eOOQ07b7+'V7+'VOOOS7+'b7+'bOOOS1G1y1G1yO%(^QWO1G1yOOQ07b1G1{1G1{O%(cQpO,59kOOOO-E<X-E<XOOQ07b1G/T1G/TO%(jQ08SO7+'hOOQ07b,5?V,5?VO%)^QpO,5?VOOQ07b1G2a1G2aP!&dQ7[O'#IkPOQ07b-E<i-E<iO%)|Q7[O,5?YOOQ07b-E<l-E<lO%*oQ7[O,5?[OOQ07b-E<n-E<nO%*yQpO1G2qOOQ07b1G2Y1G2YO%+QQWO'#IjO%+`QWO,5@mO%+`QWO,5@mO%+hQWO,5@mO%+sQWO,5@mOOQO1G2[1G2[O%,RQ7[O1G2ZO!(SQ7[O1G2ZO%,cQ!LQO'#IlO%,sQWO,5@nO!&dQ7[O,5@nO%,{QpO,5@nOOQ07b1G2_1G2_OOQ07`,5<x,5<xOOQ07`,5<y,5<yO$'ZQWO,5<yOC_QWO,5<yO!@}Q`O,5<xOOQO'#Ga'#GaO%-VQWO,5<zOOQ07`,5<|,5<|O$'ZQWO,5=POOQO,5?X,5?XOOQO-E<k-E<kOOQ07f1G2c1G2cO!4eQ`O,5<xO%-_QWO,5<yO$!VQWO,5<zO!4eQ`O,5<yO!(SQ7[O'#InO%.RQ7[O1G2mO!(SQ7[O'#IpO%.tQ7[O1G2oO%/OQ7[O1G5iO%/YQ7[O1G5iOOQO,5?^,5?^OOQO-E<p-E<pOOQO1G.z1G.zO!7{Q`O,59sO%[Q^O,59sO%/gQWO1G2UO!(SQ7[O1G2]O%/lQ08SO7+'iOOQ07b7+'i7+'iO!$aQ^O7+'iO%0`QWO,5;[OOQ07`,5?`,5?`OOQ07`-E<r-E<rOOQ07b7+%c7+%cO%0eQpO'#KTO#%sQWO7+(_O%0oQrO7+(_O$@gQWO7+(_O%0vQ08QO'#ChO%1ZQ08QO,5<}O%1{QWO,5<}OOQ07`1G5g1G5gOOQU7+$`7+$`O!@rQ07hO7+$`O!@}Q`O7+$`O!$aQ^O7+&]O%2QQWO'#IyO%2iQWO,5@vOOQO1G3a1G3aO9aQWO,5@vO%2iQWO,5@vO%2qQWO,5@vOOQO,5?f,5?fOOQO-E<x-E<xOOQ07b7+'Q7+'QO%2vQWO7+(zO9kQ07hO7+(zO9aQWO7+(zO@bQWO7+(zOOQU7+(j7+(jO%2{Q08QO7+(gO!&dQ7[O7+(gO%3VQpO7+(hOOQU7+(h7+(hO!&dQ7[O7+(hO%3^QWO'#KXO%3iQWO,5=fOOQO,5?b,5?bOOQO-E<t-E<tOOQU7+(m7+(mO%4xQ`O'#HTOOQU1G3Y1G3YO!&dQ7[O1G3YO%[Q^O1G3YO%5PQWO1G3YO%5[Q7[O1G3YO9kQ07hO1G3[O$![QWO1G3[O9UQWO1G3[O!@}Q`O1G3[O!AVQ7[O1G3[O%5jQWO'#IxO%6OQWO,5@tO%6WQ`O,5@tOOQ07`1G3]1G3]OOQU7+$U7+$UO@bQWO7+$UO9kQ07hO7+$UO%6cQWO7+$UO%[Q^O1G6cO%[Q^O1G6dO%6hQ07hO1G6cO%6rQ^O1G3dO%6yQWO1G3dO%7OQ^O1G3dOOQU7+(|7+(|O9kQ07hO7+)WO`Q^O7+)YOOQU'#K_'#K_OOQU'#I{'#I{O%7VQ^O,5>XOOQU,5>X,5>XO%[Q^O'#HnO%7dQWO'#HpOOQU,5>_,5>_O9ZQWO,5>_OOQU,5>a,5>aOOQU7+)c7+)cOOQU7+)i7+)iOOQU7+)m7+)mOOQU7+)o7+)oO%7iQ`O1G5sO%7}Q(CYO1G0vO%8XQWO1G0vOOQO1G/p1G/pO%8dQ(CYO1G/pO>pQWO1G/pO!*fQ^O'#DjOOQO,5>x,5>xOOQO-E<[-E<[OOQO,5?O,5?OOOQO-E<b-E<bO!@}Q`O1G/pOOQO-E<_-E<_OOQ07f1G0[1G0[OOQ07b7+%t7+%tO#%sQWO7+%tOOQ07b7+&[7+&[O>pQWO7+&[O!@}Q`O7+&[OOQO7+%w7+%wO$=mQ08SO7+&TOOQO7+&T7+&TO%[Q^O7+&TO%8nQ07hO7+&TO!@rQ07hO7+%wO!@}Q`O7+%wO%8yQ07hO7+&TO%9XQ08SO7++hO%[Q^O7++hO%9iQWO7++gO%9iQWO7++gOOQO1G4l1G4lO9ZQWO1G4lO%9qQWO1G4lOOQO7+%|7+%|O#%sQWO<<KyO%0oQrO<<KyO%:PQWO<<KyOOQU<<Ky<<KyO!&dQ7[O<<KyO%[Q^O<<KyO%:XQWO<<KyO%:dQ08SO,5?YO%<oQ08SO,5?[O%>zQ08SO1G2ZO%A]Q08SO1G2mO%ChQ08SO1G2oO%EsQ7[O,5>yOOQO-E<]-E<]O%E}QrO,5>zO%[Q^O,5>zOOQO-E<^-E<^O%FXQWO1G5uOOQ07b<<JQ<<JQO%FaQ(CYO1G0qO%HkQ(CYO1G0{O%HrQ(CYO1G0{O%JvQ(CYO1G0{O%J}Q(CYO1G0{O%LrQ(CYO1G0{O%MYQ(CYO1G0{O& mQ(CYO1G0{O& tQ(CYO1G0{O&#rQ(CYO1G0{O&$PQ(CYO1G0{O&%}Q(CYO1G0{O&&bQ08SO<<JdO&'gQ(CYO1G0{O&)]Q(CYO'#JdO&+`Q(CYO1G1aO&+mQ(CYO1G0TO!*fQ^O'#FnOOQO'#KP'#KPOOQO1G1r1G1rO&+wQWO1G1qO&+|Q(CYO,5?TOOOS7+'e7+'eOOOO1G/V1G/VOOQ07b1G4q1G4qO!(SQ7[O7+(]O&,WQWO,5?UO9aQWO,5?UOOQO-E<h-E<hO&,fQWO1G6XO&,fQWO1G6XO&,nQWO1G6XO&,yQ7[O7+'uO&-ZQpO,5?WO&-eQWO,5?WO!&dQ7[O,5?WOOQO-E<j-E<jO&-jQpO1G6YO&-tQWO1G6YOOQ07`1G2e1G2eO$'ZQWO1G2eOOQ07`1G2d1G2dO&-|QWO1G2fO!&dQ7[O1G2fOOQ07`1G2k1G2kO!@}Q`O1G2dOC_QWO1G2eO&.RQWO1G2fO&.ZQWO1G2eO&.}Q7[O,5?YOOQ07b-E<m-E<mO&/pQ7[O,5?[OOQ07b-E<o-E<oO!(SQ7[O7++TOOQ07b1G/_1G/_O&/zQWO1G/_OOQ07b7+'p7+'pO&0PQ7[O7+'wO&0aQ08SO<<KTOOQ07b<<KT<<KTO&1TQWO1G0vO!&dQ7[O'#IsO&1YQWO,5@oO!&dQ7[O1G2iOOQU<<Gz<<GzO!@rQ07hO<<GzO&1bQ08SO<<IwOOQ07b<<Iw<<IwOOQO,5?e,5?eO&2UQWO,5?eO&2ZQWO,5?eOOQO-E<w-E<wO&2iQWO1G6bO&2iQWO1G6bO9aQWO1G6bO@bQWO<<LfOOQU<<Lf<<LfO&2qQWO<<LfO9kQ07hO<<LfOOQU<<LR<<LRO%2{Q08QO<<LROOQU<<LS<<LSO%3VQpO<<LSO&2vQ`O'#IuO&3RQWO,5@sO!*fQ^O,5@sOOQU1G3Q1G3QO&3ZQ^O'#JmOOQO'#Iw'#IwO9kQ07hO'#IwO&3eQ`O,5=oOOQU,5=o,5=oO&3lQ`O'#EcO&4QQWO7+(tO&4VQWO7+(tOOQU7+(t7+(tO!&dQ7[O7+(tO%[Q^O7+(tO&4_QWO7+(tOOQU7+(v7+(vO9kQ07hO7+(vO$![QWO7+(vO9UQWO7+(vO!@}Q`O7+(vO&4jQWO,5?dOOQO-E<v-E<vOOQO'#HW'#HWO&4uQWO1G6`O9kQ07hO<<GpOOQU<<Gp<<GpO@bQWO<<GpO&4}QWO7++}O&5SQWO7+,OO%[Q^O7++}O%[Q^O7+,OOOQU7+)O7+)OO&5XQWO7+)OO&5^Q^O7+)OO&5eQWO7+)OOOQU<<Lr<<LrOOQU<<Lt<<LtOOQU-E<y-E<yOOQU1G3s1G3sO&5jQWO,5>YOOQU,5>[,5>[O&5oQWO1G3yO9ZQWO7+&bO!*fQ^O7+&bOOQO7+%[7+%[O&5tQ(CYO1G6PO>pQWO7+%[OOQ07b<<I`<<I`OOQ07b<<Iv<<IvO>pQWO<<IvOOQO<<Io<<IoO$=mQ08SO<<IoO%[Q^O<<IoOOQO<<Ic<<IcO!@rQ07hO<<IcO&6OQ07hO<<IoO&6ZQ08SO<= SO&6kQWO<= ROOQO7+*W7+*WO9ZQWO7+*WOOQUANAeANAeO&6sQWOANAeO!&dQ7[OANAeO#%sQWOANAeO%0oQrOANAeO%[Q^OANAeO&6{Q08SO7+'uO&9^Q08SO,5?YO&;iQ08SO,5?[O&=tQ08SO7+'wO&@VQrO1G4fO&@aQ(CYO7+&]O&BeQ(CYO,5=RO&DlQ(CYO,5=TO&D|Q(CYO,5=RO&E^Q(CYO,5=TO&EnQ(CYO,59qO&GqQ(CYO,5<fO&ItQ(CYO,5<hO&KwQ(CYO,5<vO&MmQ(CYO7+'hO&MzQ(CYO7+'iO&NXQWO,5<YOOQO7+']7+']O&N^Q7[O<<KwOOQO1G4p1G4pO&NeQWO1G4pO&NpQWO1G4pO' OQWO7++sO' OQWO7++sO!&dQ7[O1G4rO' WQpO1G4rO' bQWO7++tOOQ07`7+(P7+(PO$'ZQWO7+(QO' jQpO7+(QOOQ07`7+(O7+(OO$'ZQWO7+(PO' qQWO7+(QO!&dQ7[O7+(QOC_QWO7+(PO' vQ7[O<<NoOOQ07b7+$y7+$yO'!QQpO,5?_OOQO-E<q-E<qO'![Q08QO7+(TOOQUAN=fAN=fO9aQWO1G5POOQO1G5P1G5PO'!lQWO1G5PO'!qQWO7++|O'!qQWO7++|O9kQ07hOANBQO@bQWOANBQOOQUANBQANBQOOQUANAmANAmOOQUANAnANAnO'!yQWO,5?aOOQO-E<s-E<sO'#UQ(CYO1G6_O'%fQrO'#ChOOQO,5?c,5?cOOQO-E<u-E<uOOQU1G3Z1G3ZO&3ZQ^O,5<zOOQU<<L`<<L`O!&dQ7[O<<L`O&4QQWO<<L`O'%pQWO<<L`O%[Q^O<<L`OOQU<<Lb<<LbO9kQ07hO<<LbO$![QWO<<LbO9UQWO<<LbO'%xQ`O1G5OO'&TQWO7++zOOQUAN=[AN=[O9kQ07hOAN=[OOQU<= i<= iOOQU<= j<= jO'&]QWO<= iO'&bQWO<= jOOQU<<Lj<<LjO'&gQWO<<LjO'&lQ^O<<LjOOQU1G3t1G3tO>pQWO7+)eO'&sQWO<<I|O''OQ(CYO<<I|OOQO<<Hv<<HvOOQ07bAN?bAN?bOOQOAN?ZAN?ZO$=mQ08SOAN?ZOOQOAN>}AN>}O%[Q^OAN?ZOOQO<<Mr<<MrOOQUG27PG27PO!&dQ7[OG27PO#%sQWOG27PO''YQWOG27PO%0oQrOG27PO''bQ(CYO<<JdO''oQ(CYO1G2ZO')eQ(CYO,5?YO'+hQ(CYO,5?[O'-kQ(CYO1G2mO'/nQ(CYO1G2oO'1qQ(CYO<<KTO'2OQ(CYO<<IwOOQO1G1t1G1tO!(SQ7[OANAcOOQO7+*[7+*[O'2]QWO7+*[O'2hQWO<= _O'2pQpO7+*^OOQ07`<<Kl<<KlO$'ZQWO<<KlOOQ07`<<Kk<<KkO'2zQpO<<KlO$'ZQWO<<KkOOQO7+*k7+*kO9aQWO7+*kO'3RQWO<= hOOQUG27lG27lO9kQ07hOG27lO!*fQ^O1G4{O'3ZQWO7++yO&4QQWOANAzOOQUANAzANAzO!&dQ7[OANAzO'3cQWOANAzOOQUANA|ANA|O9kQ07hOANA|O$![QWOANA|OOQO'#HX'#HXOOQO7+*j7+*jOOQUG22vG22vOOQUANETANETOOQUANEUANEUOOQUANBUANBUO'3kQWOANBUOOQU<<MP<<MPO!*fQ^OAN?hOOQOG24uG24uO$=mQ08SOG24uO#%sQWOLD,kOOQULD,kLD,kO!&dQ7[OLD,kO'3pQWOLD,kO'3xQ(CYO7+'uO'5nQ(CYO,5?YO'7qQ(CYO,5?[O'9tQ(CYO7+'wO';jQ7[OG26}OOQO<<Mv<<MvOOQ07`ANAWANAWO$'ZQWOANAWOOQ07`ANAVANAVOOQO<<NV<<NVOOQULD-WLD-WO';zQ(CYO7+*gOOQUG27fG27fO&4QQWOG27fO!&dQ7[OG27fOOQUG27hG27hO9kQ07hOG27hOOQUG27pG27pO'<UQ(CYOG25SOOQOLD*aLD*aOOQU!$(!V!$(!VO#%sQWO!$(!VO!&dQ7[O!$(!VO'<`Q08SOG26}OOQ07`G26rG26rOOQULD-QLD-QO&4QQWOLD-QOOQULD-SLD-SOOQU!)9Eq!)9EqO#%sQWO!)9EqOOQU!$(!l!$(!lOOQU!.K;]!.K;]O'>qQ(CYOG26}O!*fQ^O'#DyO1PQWO'#EWO'@gQrO'#JiO!*fQ^O'#DqO'@nQ^O'#D}O'@uQrO'#ChO'C]QrO'#ChO!*fQ^O'#EPO'CmQ^O,5;VO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O,5;aO!*fQ^O'#IiO'EpQWO,5<eO'ExQ7[O,5;aO'GcQ7[O,5;aO!*fQ^O,5;uO!&dQ7[O'#GgO'ExQ7[O'#GgO!&dQ7[O'#GiO'ExQ7[O'#GiO1SQWO'#DVO1SQWO'#DVO!&dQ7[O'#FzO'ExQ7[O'#FzO!&dQ7[O'#F|O'ExQ7[O'#F|O!&dQ7[O'#G[O'ExQ7[O'#G[O!*fQ^O,5:iO!*fQ^O,5@eO'CmQ^O1G0qO'GjQ(CYO'#ChO!*fQ^O1G1|O!&dQ7[O'#InO'ExQ7[O'#InO!&dQ7[O'#IpO'ExQ7[O'#IpO!&dQ7[O,5<oO'ExQ7[O,5<oO'CmQ^O1G1}O!*fQ^O7+&xO!&dQ7[O1G2ZO'ExQ7[O1G2ZO!&dQ7[O'#InO'ExQ7[O'#InO!&dQ7[O'#IpO'ExQ7[O'#IpO!&dQ7[O1G2]O'ExQ7[O1G2]O'CmQ^O7+'iO'CmQ^O7+&]O!&dQ7[OANAcO'ExQ7[OANAcO'GtQWO'#EkO'GyQWO'#EkO'HRQWO'#FZO'HWQWO'#EuO'H]QWO'#JyO'HhQWO'#JwO'HsQWO,5;VO'HxQ7[O,5<bO'IPQWO'#GTO'IUQWO'#GTO'IZQWO,5<cO'IcQWO,5;VO'IkQ(CYO1G1^O'IrQWO,5<oO'IwQWO,5<oO'I|QWO,5<qO'JRQWO,5<qO'JWQWO1G1}O'J]QWO1G0qO'JbQ7[O<<KwO'JiQ7[O<<KwO7hQ7[O'#FxO9UQWO'#FwOA]QWO'#EjO!*fQ^O,5;rO!3fQWO'#GTO!3fQWO'#GTO!3fQWO'#GVO!3fQWO'#GVO!(SQ7[O7+(]O!(SQ7[O7+(]O%*yQpO1G2qO%*yQpO1G2qO!&dQ7[O,5=VO!&dQ7[O,5=V",stateData:"'Km~O'tOS'uOSSOS'vRQ~OPYOQYORfOX!VO`qOczOdyOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![XO!fuO!kZO!nYO!oYO!pYO!rvO!twO!wxO!{]O#s!PO$T|O%b}O%d!QO%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO%s!UO&P!WO&V!XO&X!YO&Z!ZO&]![O&`!]O&f!^O&l!_O&n!`O&p!aO&r!bO&t!cO'{SO'}TO(QUO(XVO(g[O(tiO~OVtO~P`OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~O`!vOo!nO!P!oO!_!xO!`!uO!a!uO!{:dO#P!pO#Q!pO#R!wO#S!pO#T!pO#W!yO#X!yO'|!lO'}TO(QUO([!mO(g!sO~O'v!zO~OP[XZ[X`[Xn[X|[X}[X!P[X!Y[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X'r[X(X[X(h[X(o[X(p[X~O!d$|X~P(qO^!|O'}#OO(O!|O(P#OO~O^#PO(P#OO(Q#OO(R#PO~Ot#RO!R#SO(Y#SO(Z#UO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{:hO'}TO(QUO(XVO(g[O(tiO~O!X#YO!Y#VO!V(_P!V(lP~P+}O!Z#bO~P`OPYOQYORfOc!jOd!iOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'}TO(QUO(XVO(g[O(tiO~Ol#lO!X#hO!{]O#e#kO#f#hO'{:iO!j(iP~P.iO!k#nO'{#mO~O!w#rO!{]O%b#sO~O#g#tO~O!d#uO#g#tO~OP$]OZ$dOn$QO|#yO}#zO!P#{O!Y$aO!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O`(]X'r(]X'p(]X!j(]X!V(]X![(]X%c(]X!d(]X~P1qO#[$eO$O$eOP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#r(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X![(^X%c(^X~O`(^X!i(^X'r(^X'p(^X!V(^X!j(^Xr(^X!d(^X~P4XO#[$eO~O$Y$gO$[$fO$c$lO~ORfO![$mO$f$nO$h$pO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz%ZO!P${O![$|O!f%`O!k$xO#f%aO$T%^O$o%[O$q%]O$t%_O'{$rO'}TO(QUO(X$uO(o$}O(p%POf(UP~O!k%bO~O!P%eO![%fO'{%dO~O!d%jO~O`%kO'r%kO~O'|!lO~P%[O%h%rO~P%[Og%VO!k%bO'{%dO'|!lO~Od%yO!k%bO'{%dO~O#r$SO~O|&OO![%{O!k%}O%d&RO'{%dO'|!lO'}TO(QUO_(}P~O!w#rO~O%m&TO!P(yX![(yX'{(yX~O'{&UO~O!t&ZO#s!PO%d!QO%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO~Oc&`Od&_O!w&]O%b&^O%u&[O~P;xOc&cOdyO![&bO!t&ZO!wxO!{]O#s!PO%b}O%f!OO%g!OO%h!OO%k!RO%m!SO%p!TO%q!TO%s!UO~Oa&fO#[&iO%d&dO'|!lO~P<}O!k&jO!t&nO~O!k#nO~O![XO~O`%kO'q&vO'r%kO~O`%kO'q&yO'r%kO~O`%kO'q&{O'r%kO~O'p[X!V[Xr[X!j[X&T[X![[X%c[X!d[X~P(qO!_'YO!`'RO!a'RO'|!lO'}TO(QUO~Oo'PO!P'OO!X'SO([&}O!Z(`P!Z(nP~P@UOj']O!['ZO'{%dO~Od'bO!k%bO'{%dO~O|&OO!k%}O~Oo!nO!P!oO!{:dO#P!pO#Q!pO#S!pO#T!pO'|!lO'}TO(QUO([!mO(g!sO~O!_'hO!`'gO!a'gO#R!pO#W'iO#X'iO~PApO`%kOg%VO!d#uO!k%bO'r%kO(h'kO~O!o'oO#['mO~PCOOo!nO!P!oO'}TO(QUO([!mO(g!sO~O![XOo(eX!P(eX!_(eX!`(eX!a(eX!{(eX#P(eX#Q(eX#R(eX#S(eX#T(eX#W(eX#X(eX'|(eX'}(eX(Q(eX([(eX(g(eX~O!`'gO!a'gO'|!lO~PCnO'w'sO'x'sO'y'uO~O^!|O'}'wO(O!|O(P'wO~O^#PO(P'wO(Q'wO(R#PO~Ot#RO!R#SO(Y#SO(Z'{O~O!X'}O!V'PX!V'VX!Y'PX!Y'VX~P+}O!Y(PO!V(_X~OP$]OZ$dOn$QO|#yO}#zO!P#{O!Y(PO!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O!V(_X~PGbO!V(UO~O!V(kX!Y(kX!d(kX!j(kX(h(kX~O#[(kX#g#`X!Z(kX~PIhO#[(VO!V(mX!Y(mX~O!Y(WO!V(lX~O!V(ZO~O#[$eO~PIhO!Z([O~P`O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!maZ!man!ma!Y!ma!h!ma!o!ma#j!ma#k!ma#l!ma#m!ma#n!ma#o!ma#p!ma#q!ma#r!ma#t!ma#v!ma#x!ma#y!ma(h!ma(o!ma(p!ma~O`!ma'r!ma'p!ma!V!ma!j!mar!ma![!ma%c!ma!d!ma~PKOO!j(]O~O!d#uO#[(^O(h'kO!Y(jX`(jX'r(jX~O!j(jX~PMnO!P%eO![%fO!{]O#e(cO#f(bO'{%dO~O!Y(dO!j(iX~O!j(fO~O!P%eO![%fO#f(bO'{%dO~OP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!i(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#r(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X~O!d#uO!j(^X~P! [O|(gO}(hO!i#wO!k#xO!{!za!P!za~O!w!za%b!za![!za#e!za#f!za'{!za~P!#`O!w(lO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![XO!fuO!kZO!nYO!oYO!pYO!rvO!t!gO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~O#g(rO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz%ZO!P${O![$|O!f%`O!k$xO#f%aO$T%^O$o%[O$q%]O$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~Of(bP~P!(SO!X(vO!j(cP~P%[O([(xO(g[O~O!P(zO!k#xO([(xO(g[O~OP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![!eO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'{)YO'}TO(QUO(XVO(g[O(t<YO~O})]O!k#xO~O!Y$aO`$ma'r$ma'p$ma!j$ma!V$ma![$ma%c$ma!d$ma~O#s)aO~P!&dO|)dO!d)cO![$ZX$W$ZX$Y$ZX$[$ZX$c$ZX~O!d)cO![(qX$W(qX$Y(qX$[(qX$c(qX~O|)dO~P!.OO|)dO![(qX$W(qX$Y(qX$[(qX$c(qX~O![)fO$W)jO$Y)eO$[)eO$c)kO~O!X)nO~P!*fO$Y$gO$[$fO$c)rO~Oj$uX|$uX!P$uX!i$uX(o$uX(p$uX~OfiXf$uXjiX!YiX#[iX~P!/tOo)tO~Ot)uO(Y)vO(Z)xO~Oj*RO|)zO!P){O(o$}O(p%PO~Of)yO~P!0}Of*SO~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'}TO(QUO(X$uO(o$}O(p%PO~O!X*WO'{*TO!j(uP~P!1lO#g*YO~O!k*ZO~O!X*`O'{*]O!V(vP~P!1lOn*lO!P*dO!_*jO!`*cO!a*cO!k*ZO#W*kO%Y*fO'|!lO([!mO~O!Z*iO~P!3xO!i#wOj(WX|(WX!P(WX(o(WX(p(WX!Y(WX#[(WX~Of(WX#|(WX~P!4qOj*qO#[*pOf(VX!Y(VX~O!Y*rOf(UX~O'{&UOf(UP~O!k*yO~O'{(pO~Ol*}O!P%eO!X#hO![%fO!{]O#e#kO#f#hO'{%dO!j(iP~O!d#uO#g+OO~O!P%eO!X+QO!Y(WO![%fO'{%dO!V(lP~Oo'VO!P+SO!X+RO'}TO(QUO([(xO~O!Z(nP~P!7lO!Y+TO`(zX'r(zX~OP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO#y$YO(XVO(h$ZO(o#|O(p#}O~O`!ea!Y!ea'r!ea'p!ea!V!ea!j!ear!ea![!ea%c!ea!d!ea~P!8dO|#yO}#zO!P#{O!i#wO!k#xO(XVOP!qaZ!qan!qa!Y!qa!h!qa!o!qa#j!qa#k!qa#l!qa#m!qa#n!qa#o!qa#p!qa#q!qa#r!qa#t!qa#v!qa#x!qa#y!qa(h!qa(o!qa(p!qa~O`!qa'r!qa'p!qa!V!qa!j!qar!qa![!qa%c!qa!d!qa~P!:}O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!saZ!san!sa!Y!sa!h!sa!o!sa#j!sa#k!sa#l!sa#m!sa#n!sa#o!sa#p!sa#q!sa#r!sa#t!sa#v!sa#x!sa#y!sa(h!sa(o!sa(p!sa~O`!sa'r!sa'p!sa!V!sa!j!sar!sa![!sa%c!sa!d!sa~P!=hOg%VOj+^O!['ZO%c+]O~O!d+`O`(TX![(TX'r(TX!Y(TX~O`%kO![XO'r%kO~Og%VO!k%bO~Og%VO!k%bO'{%dO~O!d#uO#g(rO~Oa+kO%d+lO'{+hO'}TO(QUO!Z)OP~O!Y+mO_(}X~OZ+qO~O_+rO~O![%{O'{%dO'|!lO_(}P~Og%VO#[+wO~Og%VOj+zO![$|O~O![+|O~O|,OO![XO~O%h%rO~O!w,TO~Od,YO~Oa,ZO'{#mO'}TO(QUO!Z(|P~Od%yO~O%d!QO'{&UO~P<}OZ,`O_,_O~OPYOQYORfOczOdyOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO!fuO!kZO!nYO!oYO!pYO!rvO!wxO!{]O%b}O'}TO(QUO(XVO(g[O(tiO~O![!eO!t!gO$T!kO'{!dO~P!DkO_,_O`%kO'r%kO~OPYOQYORfOc!jOd!iOlkOnYOokOpkOvkOxYOzYO!PWO!TkO!UkO![!eO!fuO!kZO!nYO!oYO!pYO!rvO!w!hO$T!kO'{!dO'}TO(QUO(XVO(g[O(tiO~O`,eO!twO#s!OO%f!OO%g!OO%h!OO~P!GTO!k&jO~O&V,kO~O![,mO~O&h,oO&j,pOP&eaQ&eaR&eaX&ea`&eac&ead&eal&ean&eao&eap&eav&eax&eaz&ea!P&ea!T&ea!U&ea![&ea!f&ea!k&ea!n&ea!o&ea!p&ea!r&ea!t&ea!w&ea!{&ea#s&ea$T&ea%b&ea%d&ea%f&ea%g&ea%h&ea%k&ea%m&ea%p&ea%q&ea%s&ea&P&ea&V&ea&X&ea&Z&ea&]&ea&`&ea&f&ea&l&ea&n&ea&p&ea&r&ea&t&ea'p&ea'{&ea'}&ea(Q&ea(X&ea(g&ea(t&ea!Z&ea&^&eaa&ea&c&ea~O'{,uO~Og!bX!Y!OX!Y!bX!Z!OX!Z!bX!d!OX!d!bX!k!bX#[!OX~O!d,zO#[,yOg(aX!Y#dX!Y(aX!Z#dX!Z(aX!d(aX!k(aX~Og%VO!d,|O!k%bO!Y!^X!Z!^X~Oo!nO!P!oO'}TO(QUO([!mO~OP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![!eO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'}TO(QUO(XVO(g[O(t<YO~O'{;]O~P#!ZO!Y-QO!Z(`X~O!Z-SO~O!d,zO#[,yO!Y#dX!Z#dX~O!Y-TO!Z(nX~O!Z-VO~O!`-WO!a-WO'|!lO~P# xO!Z-ZO~P'_Oj-^O!['ZO~O!V-cO~Oo!za!_!za!`!za!a!za#P!za#Q!za#R!za#S!za#T!za#W!za#X!za'|!za'}!za(Q!za([!za(g!za~P!#`O!o-hO#[-fO~PCOO!`-jO!a-jO'|!lO~PCnO`%kO#[-fO'r%kO~O`%kO!d#uO#[-fO'r%kO~O`%kO!d#uO!o-hO#[-fO'r%kO(h'kO~O'w'sO'x'sO'y-oO~Or-pO~O!V'Pa!Y'Pa~P!8dO!X-tO!V'PX!Y'PX~P%[O!Y(PO!V(_a~O!V(_a~PGbO!Y(WO!V(la~O!P%eO!X-xO![%fO'{%dO!V'VX!Y'VX~O#[-zO!Y(ja!j(ja`(ja'r(ja~O!d#uO~P#*aO!Y(dO!j(ia~O!P%eO![%fO#f.OO'{%dO~Ol.TO!P%eO!X.QO![%fO!{]O#e.SO#f.QO'{%dO!Y'YX!j'YX~O}.XO!k#xO~Og%VOj.[O!['ZO%c.ZO~O`#_i!Y#_i'r#_i'p#_i!V#_i!j#_ir#_i![#_i%c#_i!d#_i~P!8dOj<fO|)zO!P){O(o$}O(p%PO~O#g#Za`#Za#[#Za'r#Za!Y#Za!j#Za![#Za!V#Za~P#-]O#g(WXP(WXZ(WX`(WXn(WX}(WX!h(WX!k(WX!o(WX#j(WX#k(WX#l(WX#m(WX#n(WX#o(WX#p(WX#q(WX#r(WX#t(WX#v(WX#x(WX#y(WX'r(WX(X(WX(h(WX!j(WX!V(WX'p(WXr(WX![(WX%c(WX!d(WX~P!4qO!Y.iOf(bX~P!0}Of.kO~O!Y.lO!j(cX~P!8dO!j.oO~O!V.qO~OP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O(XVOZ#ii`#iin#ii!Y#ii!h#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#j#ii~P#1XO#j$OO~P#1XOP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO(XVOZ#ii`#ii!Y#ii!h#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~On#ii~P#3yOn$QO~P#3yOP$]On$QO|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO(XVO`#ii!Y#ii#t#ii#v#ii#x#ii#y#ii'r#ii(h#ii(o#ii(p#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~OZ#ii!h#ii#o#ii#p#ii#q#ii#r#ii~P#6kOZ$dO!h$SO#o$SO#p$SO#q$cO#r$SO~P#6kOP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO(XVO(p#}O`#ii!Y#ii#x#ii#y#ii'r#ii(h#ii(o#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#v$VO~P#9lO#v#ii~P#9lOP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO(XVO`#ii!Y#ii#x#ii#y#ii'r#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~O#v#ii(o#ii(p#ii~P#<^O#v$VO(o#|O(p#}O~P#<^OP$]OZ$dOn$QO|#yO}#zO!P#{O!h$SO!i#wO!k#xO!o$]O#j$OO#k$PO#l$PO#m$PO#n$RO#o$SO#p$SO#q$cO#r$SO#t$TO#v$VO#x$XO(XVO(o#|O(p#}O~O`#ii!Y#ii#y#ii'r#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~P#?UOP[XZ[Xn[X|[X}[X!P[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X!Y[X!Z[X~O#|[X~P#AoOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO#v:sO#x:uO#y:vO(XVO(h$ZO(o#|O(p#}O~O#|.sO~P#C|O#[:{O$O:{O#|(^X!Z(^X~P! [O`']a!Y']a'r']a'p']a!j']a!V']ar']a![']a%c']a!d']a~P!8dOP#iiZ#ii`#iin#ii}#ii!Y#ii!h#ii!i#ii!k#ii!o#ii#j#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii'r#ii(X#ii(h#ii'p#ii!V#ii!j#iir#ii![#ii%c#ii!d#ii~P#-]O`#}i!Y#}i'r#}i'p#}i!V#}i!j#}ir#}i![#}i%c#}i!d#}i~P!8dO$Y.xO$[.xO~O$Y.yO$[.yO~O!d)cO#[.zO![$`X$W$`X$Y$`X$[$`X$c$`X~O!X.{O~O![)fO$W.}O$Y)eO$[)eO$c/OO~O!Y:wO!Z(]X~P#C|O!Z/PO~O!d)cO$c(qX~O$c/RO~Ot)uO(Y)vO(Z/UO~O!V/YO~P!&dO(o$}Oj%Za|%Za!P%Za(p%Za!Y%Za#[%Za~Of%Za#|%Za~P#L^O(p%POj%]a|%]a!P%]a(o%]a!Y%]a#[%]a~Of%]a#|%]a~P#MPO!YeX!deX!jeX!j$uX(heX~P!/tO!j/bO~P#-]O!Y/cO!d#uO(h'kO!j(uX~O!j/hO~O!X*WO'{%dO!j(uP~O#g/jO~O!V$uX!Y$uX!d$|X~P!/tO!Y/kO!V(vX~P#-]O!d/mO~O!V/oO~Og%VOn/sO!d#uO!k%bO(h'kO~O'{/uO~O!d+`O~O`%kO!Y/yO'r%kO~O!Z/{O~P!3xO!`/|O!a/|O'|!lO([!mO~O!P0OO([!mO~O#W0PO~Of%Za!Y%Za#[%Za#|%Za~P!0}Of%]a!Y%]a#[%]a#|%]a~P!0}O'{&UOf'fX!Y'fX~O!Y*rOf(Ua~Of0YO~O|0ZO}0ZO!P0[Ojya(oya(pya!Yya#[ya~Ofya#|ya~P$$jO|)zO!P){Oj$na(o$na(p$na!Y$na#[$na~Of$na#|$na~P$%`O|)zO!P){Oj$pa(o$pa(p$pa!Y$pa#[$pa~Of$pa#|$pa~P$&RO#g0^O~Of%Oa!Y%Oa#[%Oa#|%Oa~P!0}O!d#uO~O#g0aO~O!Y+TO`(za'r(za~O|#yO}#zO!P#{O!i#wO!k#xO(XVOP!qiZ!qin!qi!Y!qi!h!qi!o!qi#j!qi#k!qi#l!qi#m!qi#n!qi#o!qi#p!qi#q!qi#r!qi#t!qi#v!qi#x!qi#y!qi(h!qi(o!qi(p!qi~O`!qi'r!qi'p!qi!V!qi!j!qir!qi![!qi%c!qi!d!qi~P$'pOg%VOn$tOo$sOp$sOv%XOx%YOz;QO!P${O![$|O!f<`O!k$xO#f;WO$T%^O$o;SO$q;UO$t%_O'}TO(QUO(X$uO(o$}O(p%PO~Ol0kO'{0jO~P$*ZO!d+`O`(Ta![(Ta'r(Ta!Y(Ta~O#g0qO~OZ[X!YeX!ZeX~O!Y0rO!Z)OX~O!Z0tO~OZ0uO~Oa0wO'{+hO'}TO(QUO~O![%{O'{%dO_'nX!Y'nX~O!Y+mO_(}a~O!j0zO~P!8dOZ0}O~O_1OO~O#[1RO~Oj1UO![$|O~O([(xO!Z({P~Og%VOj1_O![1[O%c1^O~OZ1iO!Y1gO!Z(|X~O!Z1jO~O_1lO`%kO'r%kO~O'{#mO'}TO(QUO~O#[$eO$O$eOP(^XZ(^Xn(^X|(^X}(^X!P(^X!Y(^X!h(^X!k(^X!o(^X#j(^X#k(^X#l(^X#m(^X#n(^X#o(^X#p(^X#q(^X#t(^X#v(^X#x(^X#y(^X(X(^X(h(^X(o(^X(p(^X~O#r1oO&T1pO`(^X!i(^X~P$/qO#[$eO#r1oO&T1pO~O`1rO~P%[O`1tO~O&^1wOP&[iQ&[iR&[iX&[i`&[ic&[id&[il&[in&[io&[ip&[iv&[ix&[iz&[i!P&[i!T&[i!U&[i![&[i!f&[i!k&[i!n&[i!o&[i!p&[i!r&[i!t&[i!w&[i!{&[i#s&[i$T&[i%b&[i%d&[i%f&[i%g&[i%h&[i%k&[i%m&[i%p&[i%q&[i%s&[i&P&[i&V&[i&X&[i&Z&[i&]&[i&`&[i&f&[i&l&[i&n&[i&p&[i&r&[i&t&[i'p&[i'{&[i'}&[i(Q&[i(X&[i(g&[i(t&[i!Z&[ia&[i&c&[i~Oa1}O!Z1{O&c1|O~P`O![XO!k2PO~O&j,pOP&eiQ&eiR&eiX&ei`&eic&eid&eil&ein&eio&eip&eiv&eix&eiz&ei!P&ei!T&ei!U&ei![&ei!f&ei!k&ei!n&ei!o&ei!p&ei!r&ei!t&ei!w&ei!{&ei#s&ei$T&ei%b&ei%d&ei%f&ei%g&ei%h&ei%k&ei%m&ei%p&ei%q&ei%s&ei&P&ei&V&ei&X&ei&Z&ei&]&ei&`&ei&f&ei&l&ei&n&ei&p&ei&r&ei&t&ei'p&ei'{&ei'}&ei(Q&ei(X&ei(g&ei(t&ei!Z&ei&^&eia&ei&c&ei~O!V2VO~O!Y!^a!Z!^a~P#C|Oo!nO!P!oO!X2]O([!mO!Y'QX!Z'QX~P@UO!Y-QO!Z(`a~O!Y'WX!Z'WX~P!7lO!Y-TO!Z(na~O!Z2dO~P'_O`%kO#[2mO'r%kO~O`%kO!d#uO#[2mO'r%kO~O`%kO!d#uO!o2qO#[2mO'r%kO(h'kO~O`%kO'r%kO~P!8dO!Y$aOr$ma~O!V'Pi!Y'Pi~P!8dO!Y(PO!V(_i~O!Y(WO!V(li~O!V(mi!Y(mi~P!8dO!Y(ji!j(ji`(ji'r(ji~P!8dO#[2sO!Y(ji!j(ji`(ji'r(ji~O!Y(dO!j(ii~O!P%eO![%fO!{]O#e2xO#f2wO'{%dO~O!P%eO![%fO#f2wO'{%dO~Oj3PO!['ZO%c3OO~Og%VOj3PO!['ZO%c3OO~O#g%ZaP%ZaZ%Za`%Zan%Za}%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za'r%Za(X%Za(h%Za!j%Za!V%Za'p%Zar%Za![%Za%c%Za!d%Za~P#L^O#g%]aP%]aZ%]a`%]an%]a}%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a'r%]a(X%]a(h%]a!j%]a!V%]a'p%]ar%]a![%]a%c%]a!d%]a~P#MPO#g%ZaP%ZaZ%Za`%Zan%Za}%Za!Y%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za'r%Za(X%Za(h%Za!j%Za!V%Za'p%Za#[%Zar%Za![%Za%c%Za!d%Za~P#-]O#g%]aP%]aZ%]a`%]an%]a}%]a!Y%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a'r%]a(X%]a(h%]a!j%]a!V%]a'p%]a#[%]ar%]a![%]a%c%]a!d%]a~P#-]O#gyaPyaZya`yanya!hya!iya!kya!oya#jya#kya#lya#mya#nya#oya#pya#qya#rya#tya#vya#xya#yya'rya(Xya(hya!jya!Vya'pyarya![ya%cya!dya~P$$jO#g$naP$naZ$na`$nan$na}$na!h$na!i$na!k$na!o$na#j$na#k$na#l$na#m$na#n$na#o$na#p$na#q$na#r$na#t$na#v$na#x$na#y$na'r$na(X$na(h$na!j$na!V$na'p$nar$na![$na%c$na!d$na~P$%`O#g$paP$paZ$pa`$pan$pa}$pa!h$pa!i$pa!k$pa!o$pa#j$pa#k$pa#l$pa#m$pa#n$pa#o$pa#p$pa#q$pa#r$pa#t$pa#v$pa#x$pa#y$pa'r$pa(X$pa(h$pa!j$pa!V$pa'p$par$pa![$pa%c$pa!d$pa~P$&RO#g%OaP%OaZ%Oa`%Oan%Oa}%Oa!Y%Oa!h%Oa!i%Oa!k%Oa!o%Oa#j%Oa#k%Oa#l%Oa#m%Oa#n%Oa#o%Oa#p%Oa#q%Oa#r%Oa#t%Oa#v%Oa#x%Oa#y%Oa'r%Oa(X%Oa(h%Oa!j%Oa!V%Oa'p%Oa#[%Oar%Oa![%Oa%c%Oa!d%Oa~P#-]O`#_q!Y#_q'r#_q'p#_q!V#_q!j#_qr#_q![#_q%c#_q!d#_q~P!8dOf'RX!Y'RX~P!(SO!Y.iOf(ba~O!X3ZO!Y'SX!j'SX~P%[O!Y.lO!j(ca~O!Y.lO!j(ca~P!8dO!V3^O~O#|!ma!Z!ma~PKOO#|!ea!Y!ea!Z!ea~P#C|O#|!qa!Z!qa~P!:}O#|!sa!Z!sa~P!=hORfO![3pO$a3qO~O!Z3uO~Or3vO~P#-]O`$jq!Y$jq'r$jq'p$jq!V$jq!j$jqr$jq![$jq%c$jq!d$jq~P!8dO!V3wO~P#-]O|)zO!P){O(p%POj'ba(o'ba!Y'ba#['ba~Of'ba#|'ba~P%)eO|)zO!P){Oj'da(o'da(p'da!Y'da#['da~Of'da#|'da~P%*WO(h$ZO~P#-]O!X3zO'{%dO!Y'^X!j'^X~O!Y/cO!j(ua~O!Y/cO!d#uO!j(ua~O!Y/cO!d#uO(h'kO!j(ua~Of$wi!Y$wi#[$wi#|$wi~P!0}O!X4SO'{*]O!V'`X!Y'`X~P!1lO!Y/kO!V(va~O!Y/kO!V(va~P#-]O!d#uO#r4[O~On4_O!d#uO(h'kO~O(o$}Oj%Zi|%Zi!P%Zi(p%Zi!Y%Zi#[%Zi~Of%Zi#|%Zi~P%-jO(p%POj%]i|%]i!P%]i(o%]i!Y%]i#[%]i~Of%]i#|%]i~P%.]Of(Vi!Y(Vi~P!0}O#[4fOf(Vi!Y(Vi~P!0}O!j4iO~O`$kq!Y$kq'r$kq'p$kq!V$kq!j$kqr$kq![$kq%c$kq!d$kq~P!8dO!V4mO~O!Y4nO![(wX~P#-]O!i#wO~P4XO`$uX![$uX%W[X'r$uX!Y$uX~P!/tO%W4pO`kXjkX|kX!PkX![kX'rkX(okX(pkX!YkX~O%W4pO~Oa4vO%d4wO'{+hO'}TO(QUO!Y'mX!Z'mX~O!Y0rO!Z)Oa~OZ4{O~O_4|O~O`%kO'r%kO~P#-]O![$|O~P#-]O!Y5UO#[5WO!Z({X~O!Z5XO~Oo!nO!P5YO!_!xO!`!uO!a!uO!{:dO#P!pO#Q!pO#R!pO#S!pO#T!pO#W5_O#X!yO'|!lO'}TO(QUO([!mO(g!sO~O!Z5^O~P%3nOj5dO![1[O%c5cO~Og%VOj5dO![1[O%c5cO~Oa5kO'{#mO'}TO(QUO!Y'lX!Z'lX~O!Y1gO!Z(|a~O'}TO(QUO([5mO~O_5qO~O#r5tO&T5uO~PMnO!j5vO~P%[O`5xO~O`5xO~P%[Oa1}O!Z5}O&c1|O~P`O!d6PO~O!d6ROg(ai!Y(ai!Z(ai!d(ai!k(ai~O!Y#di!Z#di~P#C|O#[6SO!Y#di!Z#di~O!Y!^i!Z!^i~P#C|O`%kO#[6]O'r%kO~O`%kO!d#uO#[6]O'r%kO~O!Y(jq!j(jq`(jq'r(jq~P!8dO!Y(dO!j(iq~O!P%eO![%fO#f6dO'{%dO~O!['ZO%c6gO~Oj6jO!['ZO%c6gO~O#g'baP'baZ'ba`'ban'ba}'ba!h'ba!i'ba!k'ba!o'ba#j'ba#k'ba#l'ba#m'ba#n'ba#o'ba#p'ba#q'ba#r'ba#t'ba#v'ba#x'ba#y'ba'r'ba(X'ba(h'ba!j'ba!V'ba'p'bar'ba!['ba%c'ba!d'ba~P%)eO#g'daP'daZ'da`'dan'da}'da!h'da!i'da!k'da!o'da#j'da#k'da#l'da#m'da#n'da#o'da#p'da#q'da#r'da#t'da#v'da#x'da#y'da'r'da(X'da(h'da!j'da!V'da'p'dar'da!['da%c'da!d'da~P%*WO#g$wiP$wiZ$wi`$win$wi}$wi!Y$wi!h$wi!i$wi!k$wi!o$wi#j$wi#k$wi#l$wi#m$wi#n$wi#o$wi#p$wi#q$wi#r$wi#t$wi#v$wi#x$wi#y$wi'r$wi(X$wi(h$wi!j$wi!V$wi'p$wi#[$wir$wi![$wi%c$wi!d$wi~P#-]O#g%ZiP%ZiZ%Zi`%Zin%Zi}%Zi!h%Zi!i%Zi!k%Zi!o%Zi#j%Zi#k%Zi#l%Zi#m%Zi#n%Zi#o%Zi#p%Zi#q%Zi#r%Zi#t%Zi#v%Zi#x%Zi#y%Zi'r%Zi(X%Zi(h%Zi!j%Zi!V%Zi'p%Zir%Zi![%Zi%c%Zi!d%Zi~P%-jO#g%]iP%]iZ%]i`%]in%]i}%]i!h%]i!i%]i!k%]i!o%]i#j%]i#k%]i#l%]i#m%]i#n%]i#o%]i#p%]i#q%]i#r%]i#t%]i#v%]i#x%]i#y%]i'r%]i(X%]i(h%]i!j%]i!V%]i'p%]ir%]i![%]i%c%]i!d%]i~P%.]Of'Ra!Y'Ra~P!0}O!Y'Sa!j'Sa~P!8dO!Y.lO!j(ci~O#|#_i!Y#_i!Z#_i~P#C|OP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O(XVOZ#iin#ii!h#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~O#j#ii~P%FnO#j:lO~P%FnOP$]O|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO(XVOZ#ii!h#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~On#ii~P%HyOn:nO~P%HyOP$]On:nO|#yO}#zO!P#{O!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO(XVO#t#ii#v#ii#x#ii#y#ii#|#ii(h#ii(o#ii(p#ii!Y#ii!Z#ii~OZ#ii!h#ii#o#ii#p#ii#q#ii#r#ii~P%KUOZ:zO!h:pO#o:pO#p:pO#q:yO#r:pO~P%KUOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO(XVO(p#}O#x#ii#y#ii#|#ii(h#ii(o#ii!Y#ii!Z#ii~O#v:sO~P%MpO#v#ii~P%MpOP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO(XVO#x#ii#y#ii#|#ii(h#ii!Y#ii!Z#ii~O#v#ii(o#ii(p#ii~P& {O#v:sO(o#|O(p#}O~P& {OP$]OZ:zOn:nO|#yO}#zO!P#{O!h:pO!i#wO!k#xO!o$]O#j:lO#k:mO#l:mO#m:mO#n:oO#o:pO#p:pO#q:yO#r:pO#t:qO#v:sO#x:uO(XVO(o#|O(p#}O~O#y#ii#|#ii(h#ii!Y#ii!Z#ii~P&$^O`#zy!Y#zy'r#zy'p#zy!V#zy!j#zyr#zy![#zy%c#zy!d#zy~P!8dOj<gO|)zO!P){O(o$}O(p%PO~OP#iiZ#iin#ii}#ii!h#ii!i#ii!k#ii!o#ii#j#ii#k#ii#l#ii#m#ii#n#ii#o#ii#p#ii#q#ii#r#ii#t#ii#v#ii#x#ii#y#ii#|#ii(X#ii(h#ii!Y#ii!Z#ii~P&'UO!i#wOP(WXZ(WXj(WXn(WX|(WX}(WX!P(WX!h(WX!k(WX!o(WX#j(WX#k(WX#l(WX#m(WX#n(WX#o(WX#p(WX#q(WX#r(WX#t(WX#v(WX#x(WX#y(WX#|(WX(X(WX(h(WX(o(WX(p(WX!Y(WX!Z(WX~O#|#}i!Y#}i!Z#}i~P#C|O#|!qi!Z!qi~P$'pO!Z6|O~O!Y']a!Z']a~P#C|O!d#uO(h'kO!Y'^a!j'^a~O!Y/cO!j(ui~O!Y/cO!d#uO!j(ui~Of$wq!Y$wq#[$wq#|$wq~P!0}O!V'`a!Y'`a~P#-]O!d7TO~O!Y/kO!V(vi~P#-]O!Y/kO!V(vi~O!V7XO~O!d#uO#r7^O~On7_O!d#uO(h'kO~O|)zO!P){O(p%POj'ca(o'ca!Y'ca#['ca~Of'ca#|'ca~P&.fO|)zO!P){Oj'ea(o'ea(p'ea!Y'ea#['ea~Of'ea#|'ea~P&/XO!V7aO~Of$yq!Y$yq#[$yq#|$yq~P!0}O`$ky!Y$ky'r$ky'p$ky!V$ky!j$kyr$ky![$ky%c$ky!d$ky~P!8dO!d6RO~O!Y4nO![(wa~O`#_y!Y#_y'r#_y'p#_y!V#_y!j#_yr#_y![#_y%c#_y!d#_y~P!8dOZ7fO~Oa7hO'{+hO'}TO(QUO~O!Y0rO!Z)Oi~O_7lO~O([(xO!Y'iX!Z'iX~O!Y5UO!Z({a~OlkO'{7sO~P.iO!Z7vO~P%3nOo!nO!P7wO'}TO(QUO([!mO(g!sO~O![1[O~O![1[O%c7yO~Oj7|O![1[O%c7yO~OZ8RO!Y'la!Z'la~O!Y1gO!Z(|i~O!j8VO~O!j8WO~O!j8ZO~O!j8ZO~P%[O`8]O~O!d8^O~O!j8_O~O!Y(mi!Z(mi~P#C|O`%kO#[8gO'r%kO~O!Y(jy!j(jy`(jy'r(jy~P!8dO!Y(dO!j(iy~O!['ZO%c8jO~O#g$wqP$wqZ$wq`$wqn$wq}$wq!Y$wq!h$wq!i$wq!k$wq!o$wq#j$wq#k$wq#l$wq#m$wq#n$wq#o$wq#p$wq#q$wq#r$wq#t$wq#v$wq#x$wq#y$wq'r$wq(X$wq(h$wq!j$wq!V$wq'p$wq#[$wqr$wq![$wq%c$wq!d$wq~P#-]O#g'caP'caZ'ca`'can'ca}'ca!h'ca!i'ca!k'ca!o'ca#j'ca#k'ca#l'ca#m'ca#n'ca#o'ca#p'ca#q'ca#r'ca#t'ca#v'ca#x'ca#y'ca'r'ca(X'ca(h'ca!j'ca!V'ca'p'car'ca!['ca%c'ca!d'ca~P&.fO#g'eaP'eaZ'ea`'ean'ea}'ea!h'ea!i'ea!k'ea!o'ea#j'ea#k'ea#l'ea#m'ea#n'ea#o'ea#p'ea#q'ea#r'ea#t'ea#v'ea#x'ea#y'ea'r'ea(X'ea(h'ea!j'ea!V'ea'p'ear'ea!['ea%c'ea!d'ea~P&/XO#g$yqP$yqZ$yq`$yqn$yq}$yq!Y$yq!h$yq!i$yq!k$yq!o$yq#j$yq#k$yq#l$yq#m$yq#n$yq#o$yq#p$yq#q$yq#r$yq#t$yq#v$yq#x$yq#y$yq'r$yq(X$yq(h$yq!j$yq!V$yq'p$yq#[$yqr$yq![$yq%c$yq!d$yq~P#-]O!Y'Si!j'Si~P!8dO#|#_q!Y#_q!Z#_q~P#C|O(o$}OP%ZaZ%Zan%Za}%Za!h%Za!i%Za!k%Za!o%Za#j%Za#k%Za#l%Za#m%Za#n%Za#o%Za#p%Za#q%Za#r%Za#t%Za#v%Za#x%Za#y%Za#|%Za(X%Za(h%Za!Y%Za!Z%Za~Oj%Za|%Za!P%Za(p%Za~P&@nO(p%POP%]aZ%]an%]a}%]a!h%]a!i%]a!k%]a!o%]a#j%]a#k%]a#l%]a#m%]a#n%]a#o%]a#p%]a#q%]a#r%]a#t%]a#v%]a#x%]a#y%]a#|%]a(X%]a(h%]a!Y%]a!Z%]a~Oj%]a|%]a!P%]a(o%]a~P&BuOj<gO|)zO!P){O(p%PO~P&@nOj<gO|)zO!P){O(o$}O~P&BuO|0ZO}0ZO!P0[OPyaZyajyanya!hya!iya!kya!oya#jya#kya#lya#mya#nya#oya#pya#qya#rya#tya#vya#xya#yya#|ya(Xya(hya(oya(pya!Yya!Zya~O|)zO!P){OP$naZ$naj$nan$na}$na!h$na!i$na!k$na!o$na#j$na#k$na#l$na#m$na#n$na#o$na#p$na#q$na#r$na#t$na#v$na#x$na#y$na#|$na(X$na(h$na(o$na(p$na!Y$na!Z$na~O|)zO!P){OP$paZ$paj$pan$pa}$pa!h$pa!i$pa!k$pa!o$pa#j$pa#k$pa#l$pa#m$pa#n$pa#o$pa#p$pa#q$pa#r$pa#t$pa#v$pa#x$pa#y$pa#|$pa(X$pa(h$pa(o$pa(p$pa!Y$pa!Z$pa~OP%OaZ%Oan%Oa}%Oa!h%Oa!i%Oa!k%Oa!o%Oa#j%Oa#k%Oa#l%Oa#m%Oa#n%Oa#o%Oa#p%Oa#q%Oa#r%Oa#t%Oa#v%Oa#x%Oa#y%Oa#|%Oa(X%Oa(h%Oa!Y%Oa!Z%Oa~P&'UO#|$jq!Y$jq!Z$jq~P#C|O#|$kq!Y$kq!Z$kq~P#C|O!Z8vO~O#|8wO~P!0}O!d#uO!Y'^i!j'^i~O!d#uO(h'kO!Y'^i!j'^i~O!Y/cO!j(uq~O!V'`i!Y'`i~P#-]O!Y/kO!V(vq~O!V8}O~P#-]O!V8}O~Of(Vy!Y(Vy~P!0}O!Y'ga!['ga~P#-]O`%Vq![%Vq'r%Vq!Y%Vq~P#-]OZ9SO~O!Y0rO!Z)Oq~O#[9WO!Y'ia!Z'ia~O!Y5UO!Z({i~P#C|OP[XZ[Xn[X|[X}[X!P[X!V[X!Y[X!h[X!i[X!k[X!o[X#[[X#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X~O!d%TX#r%TX~P'#`O![1[O%c9[O~O'}TO(QUO([9aO~O!Y1gO!Z(|q~O!j9dO~O!j9eO~O!j9fO~O!j9fO~P%[O#[9iO!Y#dy!Z#dy~O!Y#dy!Z#dy~P#C|O!['ZO%c9nO~O#|#zy!Y#zy!Z#zy~P#C|OP$wiZ$win$wi}$wi!h$wi!i$wi!k$wi!o$wi#j$wi#k$wi#l$wi#m$wi#n$wi#o$wi#p$wi#q$wi#r$wi#t$wi#v$wi#x$wi#y$wi#|$wi(X$wi(h$wi!Y$wi!Z$wi~P&'UO|)zO!P){O(p%POP'baZ'baj'ban'ba}'ba!h'ba!i'ba!k'ba!o'ba#j'ba#k'ba#l'ba#m'ba#n'ba#o'ba#p'ba#q'ba#r'ba#t'ba#v'ba#x'ba#y'ba#|'ba(X'ba(h'ba(o'ba!Y'ba!Z'ba~O|)zO!P){OP'daZ'daj'dan'da}'da!h'da!i'da!k'da!o'da#j'da#k'da#l'da#m'da#n'da#o'da#p'da#q'da#r'da#t'da#v'da#x'da#y'da#|'da(X'da(h'da(o'da(p'da!Y'da!Z'da~O(o$}OP%ZiZ%Zij%Zin%Zi|%Zi}%Zi!P%Zi!h%Zi!i%Zi!k%Zi!o%Zi#j%Zi#k%Zi#l%Zi#m%Zi#n%Zi#o%Zi#p%Zi#q%Zi#r%Zi#t%Zi#v%Zi#x%Zi#y%Zi#|%Zi(X%Zi(h%Zi(p%Zi!Y%Zi!Z%Zi~O(p%POP%]iZ%]ij%]in%]i|%]i}%]i!P%]i!h%]i!i%]i!k%]i!o%]i#j%]i#k%]i#l%]i#m%]i#n%]i#o%]i#p%]i#q%]i#r%]i#t%]i#v%]i#x%]i#y%]i#|%]i(X%]i(h%]i(o%]i!Y%]i!Z%]i~O#|$ky!Y$ky!Z$ky~P#C|O#|#_y!Y#_y!Z#_y~P#C|O!d#uO!Y'^q!j'^q~O!Y/cO!j(uy~O!V'`q!Y'`q~P#-]O!V9wO~P#-]O!Y0rO!Z)Oy~O!Y5UO!Z({q~O![1[O%c:OO~O!j:RO~O!['ZO%c:WO~OP$wqZ$wqn$wq}$wq!h$wq!i$wq!k$wq!o$wq#j$wq#k$wq#l$wq#m$wq#n$wq#o$wq#p$wq#q$wq#r$wq#t$wq#v$wq#x$wq#y$wq#|$wq(X$wq(h$wq!Y$wq!Z$wq~P&'UO|)zO!P){O(p%POP'caZ'caj'can'ca}'ca!h'ca!i'ca!k'ca!o'ca#j'ca#k'ca#l'ca#m'ca#n'ca#o'ca#p'ca#q'ca#r'ca#t'ca#v'ca#x'ca#y'ca#|'ca(X'ca(h'ca(o'ca!Y'ca!Z'ca~O|)zO!P){OP'eaZ'eaj'ean'ea}'ea!h'ea!i'ea!k'ea!o'ea#j'ea#k'ea#l'ea#m'ea#n'ea#o'ea#p'ea#q'ea#r'ea#t'ea#v'ea#x'ea#y'ea#|'ea(X'ea(h'ea(o'ea(p'ea!Y'ea!Z'ea~OP$yqZ$yqn$yq}$yq!h$yq!i$yq!k$yq!o$yq#j$yq#k$yq#l$yq#m$yq#n$yq#o$yq#p$yq#q$yq#r$yq#t$yq#v$yq#x$yq#y$yq#|$yq(X$yq(h$yq!Y$yq!Z$yq~P&'UOf%_!Z!Y%_!Z#[%_!Z#|%_!Z~P!0}O!Y'iq!Z'iq~P#C|O!Y#d!Z!Z#d!Z~P#C|O#g%_!ZP%_!ZZ%_!Z`%_!Zn%_!Z}%_!Z!Y%_!Z!h%_!Z!i%_!Z!k%_!Z!o%_!Z#j%_!Z#k%_!Z#l%_!Z#m%_!Z#n%_!Z#o%_!Z#p%_!Z#q%_!Z#r%_!Z#t%_!Z#v%_!Z#x%_!Z#y%_!Z'r%_!Z(X%_!Z(h%_!Z!j%_!Z!V%_!Z'p%_!Z#[%_!Zr%_!Z![%_!Z%c%_!Z!d%_!Z~P#-]OP%_!ZZ%_!Zn%_!Z}%_!Z!h%_!Z!i%_!Z!k%_!Z!o%_!Z#j%_!Z#k%_!Z#l%_!Z#m%_!Z#n%_!Z#o%_!Z#p%_!Z#q%_!Z#r%_!Z#t%_!Z#v%_!Z#x%_!Z#y%_!Z#|%_!Z(X%_!Z(h%_!Z!Y%_!Z!Z%_!Z~P&'UOr(]X~P1qO'|!lO~P!*fO!VeX!YeX#[eX~P'#`OP[XZ[Xn[X|[X}[X!P[X!Y[X!YeX!h[X!i[X!k[X!o[X#[[X#[eX#geX#j[X#k[X#l[X#m[X#n[X#o[X#p[X#q[X#r[X#t[X#v[X#x[X#y[X$O[X(X[X(h[X(o[X(p[X~O!deX!j[X!jeX(heX~P'ASOP:cOQ:cORfOc<[Od!iOlkOn:cOokOpkOvkOx:cOz:cO!PWO!TkO!UkO![XO!f:fO!kZO!n:cO!o:cO!p:cO!r:gO!t:jO!w!hO$T!kO'{)YO'}TO(QUO(XVO(g[O(t<YO~O!Y:wO!Z$ma~Og%VOl%WOn$tOo$sOp$sOv%XOx%YOz;RO!P${O![$|O!f<aO!k$xO#f;XO$T%^O$o;TO$q;VO$t%_O'{(pO'}TO(QUO(X$uO(o$}O(p%PO~O#s)aO~P'ExO!Z[X!ZeX~P'ASO#g:kO~O!d#uO#g:kO~O#[:{O~O#r:pO~O#[;ZO!Y(mX!Z(mX~O#[:{O!Y(kX!Z(kX~O#g;[O~Of;^O~P!0}O#g;cO~O#g;dO~O!d#uO#g;eO~O!d#uO#g;[O~O#|;fO~P#C|O#g;gO~O#g;hO~O#g;mO~O#g;nO~O#g;oO~O#g;pO~O#|;qO~P!0}O#|;rO~P!0}O!i#P#Q#S#T#W#e#f#q(t$o$q$t%W%b%c%d%k%m%p%q%s%u~'vS#k!U't'|#lo#j#mn|'u$Y'u'{$[([~",goto:"$2p)SPPPPP)TPP)WP)iP*x.|PPPP5pPP6WPP<S?gP?zP?zPPP?zPAxP?zP?zP?zPA|PPBRPBlPGdPPPGhPPPPGhJiPPPJoKjPGhPMxPPPP!!WGhPPPGhPGhP!$fGhP!'z!(|!)VP!)y!)}!)yPPPPP!-Y!(|PP!-v!.pP!1dGhGh!1i!4s!9Y!9Y!=OPPP!=VGhPPPPPPPPPPP!@dP!AqPPGh!CSPGhPGhGhGhGhPGh!DfP!GnP!JrP!Jv!KQ!KU!KUP!GkP!KY!KYP!N^P!NbGhGh!Nh##k?zP?zP?z?zP#$v?z?z#'O?z#)k?z#+m?z?z#,[#.f#.f#.j#.r#.f#.zP#.fP?z#/d?z#3R?z?z5pPPP#6vPPP#7a#7aP#7aP#7w#7aPP#7}P#7tP#7t#8b#7t#8|#9S5m)W#9V)WP#9^#9^#9^P)WP)WP)WP)WPP)WP#9d#9gP#9g)WP#9kP#9nP)WP)WP)WP)WP)WP)W)WPP#9t#9z#:V#:]#:c#:i#:o#:}#;T#;Z#;e#;k#;u#<U#<[#<|#=`#=f#=l#=z#>a#@O#@^#@d#Ax#BW#Cr#DQ#DW#D^#Dd#Dn#Dt#Dz#EU#Eh#EnPPPPPPPPPP#EtPPPPPPP#Fi#Ip#KP#KW#K`PPPP$!d$%Z$+r$+u$+x$,q$,t$,w$-O$-WPP$-^$-b$.Y$/X$/]$/qPP$/u$/{$0PP$0S$0W$0Z$1P$1h$2P$2T$2W$2Z$2a$2d$2h$2lR!{RoqOXst!Z#c%j&m&o&p&r,h,m1w1zY!uQ'Z-Y1[5]Q%pvQ%xyQ&P|Q&e!VS'R!e-QQ'a!iS'g!r!xS*c$|*hQ+f%yQ+s&RQ,X&_Q-W'YQ-b'bQ-j'hQ/|*jQ1f,YR;Y:g%OdOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S,e,h,m-^-f-t-z.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3Z5Y5d5t5u5x6]7w7|8]8gS#p]:d!r)[$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q*u%ZQ+k%{Q,Z&bQ,b&jQ.c;QQ0h+^Q0l+`Q0w+lQ1n,`Q2{.[Q4v0rQ5k1gQ6i3PQ6u;RQ7h4wR8m6j&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]t!nQ!r!u!x!y'R'Y'Z'g'h'i-Q-W-Y-j1[5]5_$v$si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gQ&S|Q'P!eS'V%f-TQ+k%{Q,Z&bQ0]*yQ0w+lQ0|+rQ1m,_Q1n,`Q4v0rQ5P1OQ5k1gQ5n1iQ5o1lQ7h4wQ7k4|Q8U5qQ9V7lR9b8RrnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zR,]&f&v^OPXYstuvwz!Z!`!g!j!o#R#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O']'m(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<[<][#[WZ#V#Y'S'}!S%gm#g#h#k%b%e(W(b(c(d+Q+R+T,d,z-x.O.P.Q.S2P2w2x6R6dQ%sxQ%wyS%||&RQ&Y!TQ'^!hQ'`!iQ(k#rS*V$x*ZS+e%x%yQ+i%{Q,S&]Q,W&_S-a'a'bQ.^(lQ/g*WQ0p+fQ0v+lQ0x+mQ0{+qQ1a,TS1e,X,YQ2i-bQ3y/cQ4u0rQ4y0uQ5O0}Q5j1fQ7Q3zQ7g4wQ7j4{Q9R7fR9y9S!O$zi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c!S%uy!i!t%w%x%y'Q'`'a'b'f'p*b+e+f,}-a-b-i/t0p2b2i2p4^Q+_%sQ+x&VQ+{&WQ,V&_Q.](kQ1`,SU1d,W,X,YQ3Q.^Q5e1aS5i1e1fQ8Q5j#W<^#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<go<_:y:z:};P;T;V;X;`;b;d;h;j;l;n;rW%Ti%V*r<YS&V!Q&dQ&W!RQ&X!SR+v&T$w%Si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gT)v$u)wV*v%Z;Q;RU'V!e%f-TS(y#y#zQ+p&OS.V(g(hQ1V+|Q4g0ZR7p5U&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]$i$`c#X#d%n%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.t.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PT#SV#T&}kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q'T!eR2^-Qv!nQ!e!r!u!x!y'R'Y'Z'g'h'i-Q-W-Y-j1[5]5_S*b$|*hS/t*c*jQ/}*kQ1X,OQ4^/|R4a0PnqOXst!Z#c%j&m&o&p&r,h,m1w1zQ&t!^Q'q!wS(m#t:kQ+c%vQ,Q&YQ,R&[Q-_'_Q-l'jS.g(r;[S0`+O;eQ0n+dQ1Z,PQ2O,oQ2Q,pQ2Y,{Q2g-`Q2j-dS4l0a;oQ4q0oS4t0q;pQ6T2[Q6X2hQ6^2oQ7e4rQ8b6VQ8c6YQ8f6_R9h8_$d$_c#X#d%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PS(j#o'dU*o%R(q3mS+Y%n.tQ2|0hQ6f2{Q8l6iR9o8m$d$^c#X#d%o%q'|(S(n(u(})O)P)Q)R)S)T)U)V)W)X)Z)^)b)l+Z+o-O-m-r-w-y.h.n.r.u.v/V0_2W2Z2k2r3Y3_3`3a3b3c3d3e3f3g3h3i3j3k3n3o3t4k4s6U6[6a6o6p6y6z7r8a8e8n8t8u9k9{:S:e<PS(i#o'dS({#z$_S+X%n.tS.W(h(jQ.w)]Q0e+YR2y.X&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]S#p]:dQ&o!XQ&p!YQ&r![Q&s!]R1v,kQ'[!hQ+[%sQ-]'^S.Y(k+_Q2e-[W2}.].^0g0iQ6W2fU6e2z2|3QS8i6f6hS9m8k8lS:U9l9oQ:^:VR:a:_U!vQ'Z-YT5Z1[5]!Q_OXZ`st!V!Z#c#g%b%j&d&f&m&o&p&r(d,h,m.P1w1z]!pQ!r'Z-Y1[5]T#p]:d%Y{OPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gS(y#y#zS.V(g(h!s;v$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Y!tQ'Z-Y1[5]Q'f!rS'p!u!xS'r!y5_S-i'g'hQ-k'iR2p-jQ'o!tS(`#f1qS-h'f'rQ/f*VQ/r*bQ2q-kQ4O/gS4X/s/}Q7P3yS7[4_4aQ8y7QR9Q7_Q#vbQ'n!tS(_#f1qS(a#l*}Q+P%cQ+a%tQ+g%zU-g'f'o'rQ-{(`Q/e*VQ/q*bQ/w*eQ0m+bQ1b,US2n-h-kQ2v.TS3}/f/gS4W/r/}Q4Z/vQ4]/xQ5g1cQ6`2qQ7O3yQ7S4OS7W4X4aQ7]4`Q8O5hS8x7P7QQ8|7XQ9O7[Q9_8PQ9u8yQ9v8}Q9x9QQ:Q9`Q:Y9wQ;y;tQ<U;}R<V<OV!vQ'Z-Y%YaOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gS#vz!j!r;s$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]R;y<[%YbOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gQ%cj!S%ty!i!t%w%x%y'Q'`'a'b'f'p*b+e+f,}-a-b-i/t0p2b2i2p4^S%zz!jQ+b%uQ,U&_W1c,V,W,X,YU5h1d1e1fS8P5i5jQ9`8Q!r;t$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q;}<ZR<O<[$|eOPXYstuvw!Z!`!g!o#R#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8gY#aWZ#V#Y'}!S%gm#g#h#k%b%e(W(b(c(d+Q+R+T,d,z-x.O.P.Q.S2P2w2x6R6dQ,c&j!p;u$[$m)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]R;x'SS'W!e%fR2`-T%OdOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S,e,h,m-^-f-t-z.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3Z5Y5d5t5u5x6]7w7|8]8g!r)[$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]Q,b&jQ0h+^Q2{.[Q6i3PR8m6j!b$Uc#X%n'|(S(n(u)W)X)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:e!P:r)Z)l-O.t2W2Z3_3i3j3n3t6U6p6y6z7r8a8n8t8u9{:S<P!f$Wc#X%n'|(S(n(u)T)U)W)X)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:e!T:t)Z)l-O.t2W2Z3_3f3g3i3j3n3t6U6p6y6z7r8a8n8t8u9{:S<P!^$[c#X%n'|(S(n(u)^)b+o-m-r-w-y.h.n/V0_2k2r3Y3k4k4s6[6a6o8e9k:eQ3x/az<])Z)l-O.t2W2Z3_3n3t6U6p6y6z7r8a8n8t8u9{:S<PQ<b<dR<c<e&|kOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]S$nh$oR3q.z'TgOPWXYZhstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m$o%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.z.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]T$jf$pQ$hfS)e$k)iR)q$pT$if$pT)g$k)i'ThOPWXYZhstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$[$a$e$m$o%j%p%}&f&i&j&m&o&p&r&v'O'S']'m'}(P(V(^(r(v(z)n)y+O+S+^,e,h,m,y,|-^-f-t-z.[.l.s.z.{0[0a0q1_1o1p1r1t1w1z1|2]2m2s3P3Z3p5W5Y5d5t5u5x6S6]6j7w7|8]8g9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]T$nh$oQ$qhR)p$o%YjOPWXYZstuvw!Z!`!g!o#R#V#Y#c#n#t#x#{$O$P$Q$R$S$T$U$V$W$X$Y$a$e%j%p%}&f&i&j&m&o&p&r&v'O']'m'}(P(V(^(r(v(z)y+O+S+^,e,h,m-^-f-t-z.[.l.s0[0a0q1_1o1p1r1t1w1z1|2m2s3P3Z5Y5d5t5u5x6]6j7w7|8]8g!s<Z$[$m'S)n,y,|.{2]3p5W6S9W9i:c:f:g:j:k:l:m:n:o:p:q:r:s:t:u:v:w:{;Y;Z;[;^;e;f;o;p<]#clOPXZst!Z!`!o#R#c#n#{$m%j&f&i&j&m&o&p&r&v'O'](z)n+S+^,e,h,m-^.[.{0[1_1o1p1r1t1w1z1|3P3p5Y5d5t5u5x6j7w7|8]!O%Ri#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c#W(q#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gQ*z%_Q/W)zo3m:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!O$yi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cQ*[$zS*e$|*hQ*{%`Q/x*f#W;{#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn;|:y:z:};P;T;V;X;`;b;d;h;j;l;n;rQ<Q<^Q<R<_Q<S<`R<T<a!O%Ri#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<c#W(q#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<go3m:y:z:};P;T;V;X;`;b;d;h;j;l;n;rnoOXst!Z#c%j&m&o&p&r,h,m1w1zQ*_${Q,v&yQ,w&{R4R/k$v%Si#u#w$c$d$x${%O%Q%[%]%a)u){)}*P*R*Y*`*p*q+]+`+w+z.Z.i/Z/j/k/m0Q0S0^1R1U1^3O3x4S4[4f4n4p5c6g7T7^7y8j8w9[9n:O:W:y:z:|:};O;P;S;T;U;V;W;X;_;`;a;b;c;d;g;h;i;j;k;l;m;n;q;r<Y<b<c<f<gQ+y&WQ1T+{Q5S1SR7o5TT*g$|*hS*g$|*hT5[1[5]S/v*d5YT4`0O7wQ+a%tQ/w*eQ0m+bQ1b,UQ5g1cQ8O5hQ9_8PR:Q9`!O%Oi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cr)}$v(s*O*n*|/i0U0V3W4P4j6}7`9t;z<W<XS0Q*m0R#W:|#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn:}:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!^;_(o)`*U*^._.b.f/S/X/a/n0f1Q1S3T4Q4U5R5T6k6n7U7Y7b7d8{9P:X<d<e`;`3l6q6t6x8o9p9s:bS;i.a3UT;j6s8r!O%Qi#w%O%Q%[%]%a)}*P*Y*p*q.i/j0Q0S0^3x4f8w<Y<b<cv*P$v(s*Q*m*|/]/i0U0V3W4P4b4j6}7`9t;z<W<XS0S*n0T#W;O#u$c$d$x${)u){*R*`+]+`+w+z.Z/Z/k/m1R1U1^3O4S4[4n4p5c6g7T7^7y8j9[9n:O:W:|;O;S;U;W;_;a;c;g;i;k;m;q<f<gn;P:y:z:};P;T;V;X;`;b;d;h;j;l;n;r!b;a(o)`*U*^.`.a.f/S/X/a/n0f1Q1S3R3T4Q4U5R5T6k6l6n7U7Y7b7d8{9P:X<d<ed;b3l6r6s6x8o8p9p9q9s:bS;k.b3VT;l6t8srnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zQ&a!UR,e&jrnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zR&a!UQ+}&XR1P+vsnOXst!V!Z#c%j&d&m&o&p&r,h,m1w1zQ1],SS5b1`1aU7x5`5a5eS9Z7z7{S9|9Y9]Q:Z9}R:`:[Q&h!VR,^&dR5n1iS%||&RR0x+mQ&m!WR,h&nR,n&sT1x,m1zR,r&tQ,q&tR2R,rQ't!zR-n'tSsOtQ#cXT%ms#cQ!}TR'v!}Q#QUR'x#QQ)w$uR/T)wQ#TVR'z#TQ#WWU(Q#W(R-uQ(R#XR-u(SQ-R'TR2_-RQ.j(sR3X.jQ.m(uS3[.m3]R3].nQ-Y'ZR2c-YY!rQ'Z-Y1[5]R'e!rS#^W%eU(X#^(Y-vQ(Y#_R-v(TQ-U'WR2a-Ut`OXst!V!Z#c%j&d&f&m&o&p&r,h,m1w1zS#gZ%bU#q`#g.PR.P(dQ(e#iQ-|(aW.U(e-|2t6bQ2t-}R6b2uQ)i$kR.|)iQ$ohR)o$oQ$bcU)_$b-q:xQ-q:eR:x)lQ/d*VW3{/d3|7R8zU3|/e/f/gS7R3}4OR8z7S$X)|$v(o(s)`*U*^*m*n*w*x*|.a.b.d.e.f/S/X/]/_/a/i/n0U0V0f1Q1S3R3S3T3W3l4P4Q4U4b4d4j5R5T6k6l6m6n6s6t6v6w6x6}7U7Y7`7b7d8o8p8q8{9P9p9q9r9s9t:X:b;z<W<X<d<eQ/l*^U4T/l4V7VQ4V/nR7V4UQ*h$|R/z*hr*O$v(s*m*n*|/i0U0V3W4P4j6}7`9t;z<W<X!^._(o)`*U*^.a.b.f/S/X/a/n0f1Q1S3T4Q4U5R5T6k6n7U7Y7b7d8{9P:X<d<eU/^*O._6qa6q3l6s6t6x8o9p9s:bQ0R*mQ3U.aU4c0R3U8rR8r6sv*Q$v(s*m*n*|/]/i0U0V3W4P4b4j6}7`9t;z<W<X!b.`(o)`*U*^.a.b.f/S/X/a/n0f1Q1S3R3T4Q4U5R5T6k6l6n7U7Y7b7d8{9P:X<d<eU/`*Q.`6re6r3l6s6t6x8o8p9p9q9s:bQ0T*nQ3V.bU4e0T3V8sR8s6tQ*s%UR0X*sQ4o0fR7c4oQ+U%hR0d+UQ5V1VS7q5V9XR9X7rQ,P&YR1Y,PQ5]1[R7u5]Q1h,ZS5l1h8SR8S5nQ0s+iW4x0s4z7i9TQ4z0vQ7i4yR9T7jQ+n%|R0y+nQ1z,mR5|1zYrOXst#cQ&q!ZQ+W%jQ,g&mQ,i&oQ,j&pQ,l&rQ1u,hS1x,m1zR5{1wQ%lpQ&u!_Q&x!aQ&z!bQ&|!cQ'l!tQ+V%iQ+c%vQ+u&SQ,]&hQ,t&wW-e'f'n'o'rQ-l'jQ/y*gQ0n+dS1k,^,aQ2S,sQ2T,vQ2U,wQ2j-dW2l-g-h-k-mQ4q0oQ4}0|Q5Q1QQ5f1bQ5p1mQ5z1vU6Z2k2n2qQ6^2oQ7e4rQ7m5PQ7n5RQ7t5[Q7}5gQ8T5oS8d6[6`Q8f6_Q9U7kQ9^8OQ9c8UQ9j8eQ9z9VQ:P9_Q:T9kR:]:QQ%vyQ'_!iQ'j!tU+d%w%x%yQ,{'QU-`'`'a'bS-d'f'pQ/p*bS0o+e+fQ2[,}S2h-a-bQ2o-iQ4Y/tQ4r0pQ6V2bQ6Y2iQ6_2pR7Z4^S$wi<YR*t%VU%Ui%V<YR0W*rQ$viS(o#u+`Q(s#wS)`$c$dQ*U$xQ*^${Q*m%OQ*n%QQ*w%[Q*x%]Q*|%aQ.a:|Q.b;OQ.d;SQ.e;UQ.f;WQ/S)uS/X){/ZQ/])}Q/_*PQ/a*RQ/i*YQ/n*`Q0U*pQ0V*qh0f+].Z1^3O5c6g7y8j9[9n:O:WQ1Q+wQ1S+zQ3R;_Q3S;aQ3T;cQ3W.iS3l:y:zQ4P/jQ4Q/kQ4U/mQ4b0QQ4d0SQ4j0^Q5R1RQ5T1UQ6k;gQ6l;iQ6m;kQ6n;mQ6s:}Q6t;PQ6v;TQ6w;VQ6x;XQ6}3xQ7U4SQ7Y4[Q7`4fQ7b4nQ7d4pQ8o;dQ8p;`Q8q;bQ8{7TQ9P7^Q9p;hQ9q;jQ9r;lQ9s;nQ9t8wQ:X;qQ:b;rQ;z<YQ<W<bQ<X<cQ<d<fR<e<gnpOXst!Z#c%j&m&o&p&r,h,m1w1zQ!fPS#eZ#nQ&w!`U'c!o5Y7wQ'y#RQ(|#{Q)m$mS,a&f&iQ,f&jQ,s&vQ,x'OQ-[']Q.p(zQ/Q)nQ0b+SQ0i+^Q1s,eQ2f-^Q2|.[Q3s.{Q4h0[Q5a1_Q5r1oQ5s1pQ5w1rQ5y1tQ6O1|Q6f3PQ6{3pQ7{5dQ8X5tQ8Y5uQ8[5xQ8l6jQ9]7|R9g8]#WcOPXZst!Z!`!o#c#n#{%j&f&i&j&m&o&p&r&v'O'](z+S+^,e,h,m-^.[0[1_1o1p1r1t1w1z1|3P5Y5d5t5u5x6j7w7|8]Q#XWQ#dYQ%nuQ%ovS%qw!gS'|#V(PQ(S#YQ(n#tQ(u#xQ(}$OQ)O$PQ)P$QQ)Q$RQ)R$SQ)S$TQ)T$UQ)U$VQ)V$WQ)W$XQ)X$YQ)Z$[Q)^$aQ)b$eW)l$m)n.{3pQ+Z%pQ+o%}S-O'S2]Q-m'mS-r'}-tQ-w(VQ-y(^Q.h(rQ.n(vQ.r:cQ.t:fQ.u:gQ.v:jQ/V)yQ0_+OQ2W,yQ2Z,|Q2k-fQ2r-zQ3Y.lQ3_:kQ3`:lQ3a:mQ3b:nQ3c:oQ3d:pQ3e:qQ3f:rQ3g:sQ3h:tQ3i:uQ3j:vQ3k.sQ3n:{Q3o;YQ3t:wQ4k0aQ4s0qQ6U;ZQ6[2mQ6a2sQ6o3ZQ6p;[Q6y;^Q6z;eQ7r5WQ8a6SQ8e6]Q8n;fQ8t;oQ8u;pQ9k8gQ9{9WQ:S9iQ:e#RR<P<]R#ZWR'U!eY!tQ'Z-Y1[5]S'Q!e-QQ'f!rS'p!u!xS'r!y5_S,}'R'YS-i'g'hQ-k'iQ2b-WR2p-jR(t#wR(w#xQ!fQT-X'Z-Y]!qQ!r'Z-Y1[5]Q#o]R'd:dT#jZ%bS#iZ%bS%hm,dU(a#g#h#kS-}(b(cQ.R(dQ0c+TQ2u.OU2v.P.Q.SS6c2w2xR8h6d`#]W#V#Y%e'}(W+Q-xr#fZm#g#h#k%b(b(c(d+T.O.P.Q.S2w2x6dQ1q,dQ2X,zQ6Q2PQ8`6RT;w'S+RT#`W%eS#_W%eS(O#V(WS(T#Y+QS-P'S+RT-s'}-xT'X!e%fQ$kfR)s$pT)h$k)iR3r.zT*X$x*ZR*a${Q0g+]Q2z.ZQ5`1^Q6h3OQ7z5cQ8k6gQ9Y7yQ9l8jQ9}9[Q:V9nQ:[:OR:_:WnqOXst!Z#c%j&m&o&p&r,h,m1w1zQ&g!VR,]&dtmOXst!U!V!Z#c%j&d&m&o&p&r,h,m1w1zR,d&jT%im,dR1W+|R,[&bQ&Q|R+t&RR+j%{T&k!W&nT&l!W&nT1y,m1z",nodeNames:"⚠ ArithOp ArithOp JSXStartTag LineComment BlockComment Script Hashbang ExportDeclaration export Star as VariableName String Escape from ; default FunctionDeclaration async function VariableDefinition > < TypeParamList TypeDefinition extends ThisType this LiteralType ArithOp Number BooleanLiteral TemplateType InterpolationEnd Interpolation InterpolationStart NullType null VoidType void TypeofType typeof MemberExpression . ?. PropertyName [ TemplateString Escape Interpolation super RegExp ] ArrayExpression Spread , } { ObjectExpression Property async get set PropertyDefinition Block : NewExpression new TypeArgList CompareOp < ) ( ArgList UnaryExpression delete LogicOp BitOp YieldExpression yield AwaitExpression await ParenthesizedExpression ClassExpression class ClassBody MethodDeclaration Decorator @ MemberExpression PrivatePropertyName CallExpression declare Privacy static abstract override PrivatePropertyDefinition PropertyDeclaration readonly accessor Optional TypeAnnotation Equals StaticBlock FunctionExpression ArrowFunction ParamList ParamList ArrayPattern ObjectPattern PatternProperty Privacy readonly Arrow MemberExpression BinaryExpression ArithOp ArithOp ArithOp ArithOp BitOp CompareOp instanceof satisfies in const CompareOp BitOp BitOp BitOp LogicOp LogicOp ConditionalExpression LogicOp LogicOp AssignmentExpression UpdateOp PostfixExpression CallExpression TaggedTemplateExpression DynamicImport import ImportMeta JSXElement JSXSelfCloseEndTag JSXSelfClosingTag JSXIdentifier JSXBuiltin JSXIdentifier JSXNamespacedName JSXMemberExpression JSXSpreadAttribute JSXAttribute JSXAttributeValue JSXEscape JSXEndTag JSXOpenTag JSXFragmentTag JSXText JSXEscape JSXStartCloseTag JSXCloseTag PrefixCast ArrowFunction TypeParamList SequenceExpression KeyofType keyof UniqueType unique ImportType InferredType infer TypeName ParenthesizedType FunctionSignature ParamList NewSignature IndexedType TupleType Label ArrayType ReadonlyType ObjectType MethodType PropertyType IndexSignature PropertyDefinition CallSignature TypePredicate is NewSignature new UnionType LogicOp IntersectionType LogicOp ConditionalType ParameterizedType ClassDeclaration abstract implements type VariableDeclaration let var using TypeAliasDeclaration InterfaceDeclaration interface EnumDeclaration enum EnumBody NamespaceDeclaration namespace module AmbientDeclaration declare GlobalDeclaration global ClassDeclaration ClassBody AmbientFunctionDeclaration ExportGroup VariableName VariableName ImportDeclaration ImportGroup ForStatement for ForSpec ForInSpec ForOfSpec of WhileStatement while WithStatement with DoStatement do IfStatement if else SwitchStatement switch SwitchBody CaseLabel case DefaultLabel TryStatement try CatchClause catch FinallyClause finally ReturnStatement return ThrowStatement throw BreakStatement break ContinueStatement continue DebuggerStatement debugger LabeledStatement ExpressionStatement SingleExpression SingleClassItem",maxTerm:371,context:nO,nodeProps:[["isolate",-8,4,5,13,33,35,48,50,52,""],["group",-26,8,16,18,65,201,205,209,210,212,215,218,228,230,236,238,240,242,245,251,257,259,261,263,265,267,268,"Statement",-32,12,13,28,31,32,38,48,51,52,54,59,67,75,79,81,83,84,106,107,116,117,134,137,139,140,141,142,144,145,164,165,167,"Expression",-23,27,29,33,37,39,41,168,170,172,173,175,176,177,179,180,181,183,184,185,195,197,199,200,"Type",-3,87,99,105,"ClassItem"],["openedBy",22,"<",34,"InterpolationStart",53,"[",57,"{",72,"(",157,"JSXStartCloseTag"],["closedBy",23,">",36,"InterpolationEnd",47,"]",58,"}",73,")",162,"JSXEndTag"]],propSources:[hO],skippedNodes:[0,4,5,271],repeatNodeCount:37,tokenData:"$Fj(CSR!bOX%ZXY+gYZ-yZ[+g[]%Z]^.c^p%Zpq+gqr/mrs3cst:_tuEruvJSvwLkwx! Yxy!'iyz!(sz{!)}{|!,q|}!.O}!O!,q!O!P!/Y!P!Q!9j!Q!R#8g!R![#:v![!]#Gv!]!^#IS!^!_#J^!_!`#Ns!`!a$#_!a!b$(l!b!c$,k!c!}Er!}#O$-u#O#P$/P#P#Q$4h#Q#R$5r#R#SEr#S#T$7P#T#o$8Z#o#p$<k#p#q$=a#q#r$>q#r#s$?}#s$f%Z$f$g+g$g#BYEr#BY#BZ$AX#BZ$ISEr$IS$I_$AX$I_$I|Er$I|$I}$Dd$I}$JO$Dd$JO$JTEr$JT$JU$AX$JU$KVEr$KV$KW$AX$KW&FUEr&FU&FV$AX&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$AX?HUOEr(n%d_$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&j&hT$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c&j&zP;=`<%l&c'|'U]$f&j(R!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!b(SU(R!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!b(iP;=`<%l'}'|(oP;=`<%l&}'[(y]$f&j(OpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rp)wU(OpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)rp*^P;=`<%l)r'[*dP;=`<%l(r#S*nX(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g#S+^P;=`<%l*g(n+dP;=`<%l%Z(CS+rq$f&j(Op(R!b't(;dOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p$f%Z$f$g+g$g#BY%Z#BY#BZ+g#BZ$IS%Z$IS$I_+g$I_$JT%Z$JT$JU+g$JU$KV%Z$KV$KW+g$KW&FU%Z&FU&FV+g&FV;'S%Z;'S;=`+a<%l?HT%Z?HT?HU+g?HUO%Z(CS.ST(P#S$f&j'u(;dO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c(CS.n_$f&j(Op(R!b'u(;dOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#`/x`$f&j!o$Ip(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S1V`#t$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`2X!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S2d_#t$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/|3l_'}$(n$f&j(R!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k(^4r_$f&j(R!bOY4kYZ5qZr4krs7nsw4kwx5qx!^4k!^!_8p!_#O4k#O#P5q#P#o4k#o#p8p#p;'S4k;'S;=`:X<%lO4k&z5vX$f&jOr5qrs6cs!^5q!^!_6y!_#o5q#o#p6y#p;'S5q;'S;=`7h<%lO5q&z6jT$a`$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c`6|TOr6yrs7]s;'S6y;'S;=`7b<%lO6y`7bO$a``7eP;=`<%l6y&z7kP;=`<%l5q(^7w]$a`$f&j(R!bOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!r8uZ(R!bOY8pYZ6yZr8prs9hsw8pwx6yx#O8p#O#P6y#P;'S8p;'S;=`:R<%lO8p!r9oU$a`(R!bOY'}Zw'}x#O'}#P;'S'};'S;=`(f<%lO'}!r:UP;=`<%l8p(^:[P;=`<%l4k#%|:hh$f&j(Op(R!bOY%ZYZ&cZq%Zqr<Srs&}st%ZtuCruw%Zwx(rx!^%Z!^!_*g!_!c%Z!c!}Cr!}#O%Z#O#P&c#P#R%Z#R#SCr#S#T%Z#T#oCr#o#p*g#p$g%Z$g;'SCr;'S;=`El<%lOCr(r<__VS$f&j(Op(R!bOY<SYZ&cZr<Srs=^sw<Swx@nx!^<S!^!_Bm!_#O<S#O#P>`#P#o<S#o#pBm#p;'S<S;'S;=`Cl<%lO<S(Q=g]VS$f&j(R!bOY=^YZ&cZw=^wx>`x!^=^!^!_?q!_#O=^#O#P>`#P#o=^#o#p?q#p;'S=^;'S;=`@h<%lO=^&n>gXVS$f&jOY>`YZ&cZ!^>`!^!_?S!_#o>`#o#p?S#p;'S>`;'S;=`?k<%lO>`S?XSVSOY?SZ;'S?S;'S;=`?e<%lO?SS?hP;=`<%l?S&n?nP;=`<%l>`!f?xWVS(R!bOY?qZw?qwx?Sx#O?q#O#P?S#P;'S?q;'S;=`@b<%lO?q!f@eP;=`<%l?q(Q@kP;=`<%l=^'`@w]VS$f&j(OpOY@nYZ&cZr@nrs>`s!^@n!^!_Ap!_#O@n#O#P>`#P#o@n#o#pAp#p;'S@n;'S;=`Bg<%lO@ntAwWVS(OpOYApZrAprs?Ss#OAp#O#P?S#P;'SAp;'S;=`Ba<%lOAptBdP;=`<%lAp'`BjP;=`<%l@n#WBvYVS(Op(R!bOYBmZrBmrs?qswBmwxApx#OBm#O#P?S#P;'SBm;'S;=`Cf<%lOBm#WCiP;=`<%lBm(rCoP;=`<%l<S#%|C}i$f&j(g!L^(Op(R!bOY%ZYZ&cZr%Zrs&}st%ZtuCruw%Zwx(rx!Q%Z!Q![Cr![!^%Z!^!_*g!_!c%Z!c!}Cr!}#O%Z#O#P&c#P#R%Z#R#SCr#S#T%Z#T#oCr#o#p*g#p$g%Z$g;'SCr;'S;=`El<%lOCr#%|EoP;=`<%lCr(CSFRk$f&j(Op(R!b$Y#t'{&;d([!LYOY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr+dHRk$f&j(Op(R!b$Y#tOY%ZYZ&cZr%Zrs&}st%ZtuGvuw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Gv![!^%Z!^!_*g!_!c%Z!c!}Gv!}#O%Z#O#P&c#P#R%Z#R#SGv#S#T%Z#T#oGv#o#p*g#p$g%Z$g;'SGv;'S;=`Iv<%lOGv+dIyP;=`<%lGv(CSJPP;=`<%lEr%#SJ_`$f&j(Op(R!b#l$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#SKl_$f&j$O$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&COLva(p&;`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sv%ZvwM{wx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#SNW`$f&j#x$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/|! c_(Q$)`$f&j(OpOY!!bYZ!#hZr!!brs!#hsw!!bwx!$xx!^!!b!^!_!%z!_#O!!b#O#P!#h#P#o!!b#o#p!%z#p;'S!!b;'S;=`!'c<%lO!!b'l!!i_$f&j(OpOY!!bYZ!#hZr!!brs!#hsw!!bwx!$xx!^!!b!^!_!%z!_#O!!b#O#P!#h#P#o!!b#o#p!%z#p;'S!!b;'S;=`!'c<%lO!!b&z!#mX$f&jOw!#hwx6cx!^!#h!^!_!$Y!_#o!#h#o#p!$Y#p;'S!#h;'S;=`!$r<%lO!#h`!$]TOw!$Ywx7]x;'S!$Y;'S;=`!$l<%lO!$Y`!$oP;=`<%l!$Y&z!$uP;=`<%l!#h'l!%R]$a`$f&j(OpOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(r!Q!&PZ(OpOY!%zYZ!$YZr!%zrs!$Ysw!%zwx!&rx#O!%z#O#P!$Y#P;'S!%z;'S;=`!']<%lO!%z!Q!&yU$a`(OpOY)rZr)rs#O)r#P;'S)r;'S;=`*Z<%lO)r!Q!'`P;=`<%l!%z'l!'fP;=`<%l!!b(*Q!'t_!k(!b$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'l!)O_!jM|$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+h!*[b$f&j(Op(R!b'|#)d#m$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rxz%Zz{!+d{!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S!+o`$f&j(Op(R!b#j$IdOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&-O!,|`$f&j(Op(R!bn&%`OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&C[!.Z_!Y&;l$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS!/ec$f&j(Op(R!b|'<nOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!0p!P!Q%Z!Q![!3Y![!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'d!0ya$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!2O!P!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z!'d!2Z_!XMt$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!3eg$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!3Y![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S!3Y#S#X%Z#X#Y!4|#Y#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!5Vg$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx{%Z{|!6n|}%Z}!O!6n!O!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!6wc$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l!8_c$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![!8S![!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S!8S#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS!9uf$f&j(Op(R!b#k$IdOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpxz!;Zz{#,f{!P!;Z!P!Q#-{!Q!^!;Z!^!_#'Z!_!`#5k!`!a#7Q!a!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(r!;fb$f&j(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(Q!<w`$f&j(R!b!USOY!<nYZ&cZw!<nwx!=yx!P!<n!P!Q!Eb!Q!^!<n!^!_!GY!_!}!<n!}#O!Ja#O#P!Dj#P#o!<n#o#p!GY#p;'S!<n;'S;=`!Kj<%lO!<n&n!>Q^$f&j!USOY!=yYZ&cZ!P!=y!P!Q!>|!Q!^!=y!^!_!@Y!_!}!=y!}#O!Bw#O#P!Dj#P#o!=y#o#p!@Y#p;'S!=y;'S;=`!E[<%lO!=y&n!?Ta$f&j!USO!^&c!_#Z&c#Z#[!>|#[#]&c#]#^!>|#^#a&c#a#b!>|#b#g&c#g#h!>|#h#i&c#i#j!>|#j#m&c#m#n!>|#n#o&c#p;'S&c;'S;=`&w<%lO&cS!@_X!USOY!@YZ!P!@Y!P!Q!@z!Q!}!@Y!}#O!Ac#O#P!Bb#P;'S!@Y;'S;=`!Bq<%lO!@YS!APU!US#Z#[!@z#]#^!@z#a#b!@z#g#h!@z#i#j!@z#m#n!@zS!AfVOY!AcZ#O!Ac#O#P!A{#P#Q!@Y#Q;'S!Ac;'S;=`!B[<%lO!AcS!BOSOY!AcZ;'S!Ac;'S;=`!B[<%lO!AcS!B_P;=`<%l!AcS!BeSOY!@YZ;'S!@Y;'S;=`!Bq<%lO!@YS!BtP;=`<%l!@Y&n!B|[$f&jOY!BwYZ&cZ!^!Bw!^!_!Ac!_#O!Bw#O#P!Cr#P#Q!=y#Q#o!Bw#o#p!Ac#p;'S!Bw;'S;=`!Dd<%lO!Bw&n!CwX$f&jOY!BwYZ&cZ!^!Bw!^!_!Ac!_#o!Bw#o#p!Ac#p;'S!Bw;'S;=`!Dd<%lO!Bw&n!DgP;=`<%l!Bw&n!DoX$f&jOY!=yYZ&cZ!^!=y!^!_!@Y!_#o!=y#o#p!@Y#p;'S!=y;'S;=`!E[<%lO!=y&n!E_P;=`<%l!=y(Q!Eki$f&j(R!b!USOY&}YZ&cZw&}wx&cx!^&}!^!_'}!_#O&}#O#P&c#P#Z&}#Z#[!Eb#[#]&}#]#^!Eb#^#a&}#a#b!Eb#b#g&}#g#h!Eb#h#i&}#i#j!Eb#j#m&}#m#n!Eb#n#o&}#o#p'}#p;'S&};'S;=`(l<%lO&}!f!GaZ(R!b!USOY!GYZw!GYwx!@Yx!P!GY!P!Q!HS!Q!}!GY!}#O!Ic#O#P!Bb#P;'S!GY;'S;=`!JZ<%lO!GY!f!HZb(R!b!USOY'}Zw'}x#O'}#P#Z'}#Z#[!HS#[#]'}#]#^!HS#^#a'}#a#b!HS#b#g'}#g#h!HS#h#i'}#i#j!HS#j#m'}#m#n!HS#n;'S'};'S;=`(f<%lO'}!f!IhX(R!bOY!IcZw!Icwx!Acx#O!Ic#O#P!A{#P#Q!GY#Q;'S!Ic;'S;=`!JT<%lO!Ic!f!JWP;=`<%l!Ic!f!J^P;=`<%l!GY(Q!Jh^$f&j(R!bOY!JaYZ&cZw!Jawx!Bwx!^!Ja!^!_!Ic!_#O!Ja#O#P!Cr#P#Q!<n#Q#o!Ja#o#p!Ic#p;'S!Ja;'S;=`!Kd<%lO!Ja(Q!KgP;=`<%l!Ja(Q!KmP;=`<%l!<n'`!Ky`$f&j(Op!USOY!KpYZ&cZr!Kprs!=ys!P!Kp!P!Q!L{!Q!^!Kp!^!_!Ns!_!}!Kp!}#O##z#O#P!Dj#P#o!Kp#o#p!Ns#p;'S!Kp;'S;=`#%T<%lO!Kp'`!MUi$f&j(Op!USOY(rYZ&cZr(rrs&cs!^(r!^!_)r!_#O(r#O#P&c#P#Z(r#Z#[!L{#[#](r#]#^!L{#^#a(r#a#b!L{#b#g(r#g#h!L{#h#i(r#i#j!L{#j#m(r#m#n!L{#n#o(r#o#p)r#p;'S(r;'S;=`*a<%lO(rt!NzZ(Op!USOY!NsZr!Nsrs!@Ys!P!Ns!P!Q# m!Q!}!Ns!}#O#!|#O#P!Bb#P;'S!Ns;'S;=`##t<%lO!Nst# tb(Op!USOY)rZr)rs#O)r#P#Z)r#Z#[# m#[#])r#]#^# m#^#a)r#a#b# m#b#g)r#g#h# m#h#i)r#i#j# m#j#m)r#m#n# m#n;'S)r;'S;=`*Z<%lO)rt##RX(OpOY#!|Zr#!|rs!Acs#O#!|#O#P!A{#P#Q!Ns#Q;'S#!|;'S;=`##n<%lO#!|t##qP;=`<%l#!|t##wP;=`<%l!Ns'`#$R^$f&j(OpOY##zYZ&cZr##zrs!Bws!^##z!^!_#!|!_#O##z#O#P!Cr#P#Q!Kp#Q#o##z#o#p#!|#p;'S##z;'S;=`#$}<%lO##z'`#%QP;=`<%l##z'`#%WP;=`<%l!Kp(r#%fk$f&j(Op(R!b!USOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#Z%Z#Z#[#%Z#[#]%Z#]#^#%Z#^#a%Z#a#b#%Z#b#g%Z#g#h#%Z#h#i%Z#i#j#%Z#j#m%Z#m#n#%Z#n#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z#W#'d](Op(R!b!USOY#'ZZr#'Zrs!GYsw#'Zwx!Nsx!P#'Z!P!Q#(]!Q!}#'Z!}#O#)w#O#P!Bb#P;'S#'Z;'S;=`#*w<%lO#'Z#W#(fe(Op(R!b!USOY*gZr*grs'}sw*gwx)rx#O*g#P#Z*g#Z#[#(]#[#]*g#]#^#(]#^#a*g#a#b#(]#b#g*g#g#h#(]#h#i*g#i#j#(]#j#m*g#m#n#(]#n;'S*g;'S;=`+Z<%lO*g#W#*OZ(Op(R!bOY#)wZr#)wrs!Icsw#)wwx#!|x#O#)w#O#P!A{#P#Q#'Z#Q;'S#)w;'S;=`#*q<%lO#)w#W#*tP;=`<%l#)w#W#*zP;=`<%l#'Z(r#+W`$f&j(Op(R!bOY#*}YZ&cZr#*}rs!Jasw#*}wx##zx!^#*}!^!_#)w!_#O#*}#O#P!Cr#P#Q!;Z#Q#o#*}#o#p#)w#p;'S#*};'S;=`#,Y<%lO#*}(r#,]P;=`<%l#*}(r#,cP;=`<%l!;Z(CS#,sb$f&j(Op(R!b'v(;d!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z(CS#.W_$f&j(Op(R!bS(;dOY#-{YZ&cZr#-{rs#/Vsw#-{wx#2gx!^#-{!^!_#4f!_#O#-{#O#P#0X#P#o#-{#o#p#4f#p;'S#-{;'S;=`#5e<%lO#-{(Bb#/`]$f&j(R!bS(;dOY#/VYZ&cZw#/Vwx#0Xx!^#/V!^!_#1j!_#O#/V#O#P#0X#P#o#/V#o#p#1j#p;'S#/V;'S;=`#2a<%lO#/V(AO#0`X$f&jS(;dOY#0XYZ&cZ!^#0X!^!_#0{!_#o#0X#o#p#0{#p;'S#0X;'S;=`#1d<%lO#0X(;d#1QSS(;dOY#0{Z;'S#0{;'S;=`#1^<%lO#0{(;d#1aP;=`<%l#0{(AO#1gP;=`<%l#0X(<v#1qW(R!bS(;dOY#1jZw#1jwx#0{x#O#1j#O#P#0{#P;'S#1j;'S;=`#2Z<%lO#1j(<v#2^P;=`<%l#1j(Bb#2dP;=`<%l#/V(Ap#2p]$f&j(OpS(;dOY#2gYZ&cZr#2grs#0Xs!^#2g!^!_#3i!_#O#2g#O#P#0X#P#o#2g#o#p#3i#p;'S#2g;'S;=`#4`<%lO#2g(<U#3pW(OpS(;dOY#3iZr#3irs#0{s#O#3i#O#P#0{#P;'S#3i;'S;=`#4Y<%lO#3i(<U#4]P;=`<%l#3i(Ap#4cP;=`<%l#2g(=h#4oY(Op(R!bS(;dOY#4fZr#4frs#1jsw#4fwx#3ix#O#4f#O#P#0{#P;'S#4f;'S;=`#5_<%lO#4f(=h#5bP;=`<%l#4f(CS#5hP;=`<%l#-{%#W#5xb$f&j$O$Id(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z+h#7_b$W#t$f&j(Op(R!b!USOY!;ZYZ&cZr!;Zrs!<nsw!;Zwx!Kpx!P!;Z!P!Q#%Z!Q!^!;Z!^!_#'Z!_!}!;Z!}#O#*}#O#P!Dj#P#o!;Z#o#p#'Z#p;'S!;Z;'S;=`#,`<%lO!;Z$/l#8rp$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!3Y!P!Q%Z!Q![#:v![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S#:v#S#U%Z#U#V#>Q#V#X%Z#X#Y!4|#Y#b%Z#b#c#<v#c#d#AY#d#l%Z#l#m#D[#m#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#;Rk$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P!3Y!P!Q%Z!Q![#:v![!^%Z!^!_*g!_!g%Z!g!h!4|!h#O%Z#O#P&c#P#R%Z#R#S#:v#S#X%Z#X#Y!4|#Y#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#=R_$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#>Zd$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#?i!R!S#?i!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#?i#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#?tf$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!R#?i!R!S#?i!S!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#?i#S#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Acc$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#Bn!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#Bn#S#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Bye$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q!Y#Bn!Y!^%Z!^!_*g!_#O%Z#O#P&c#P#R%Z#R#S#Bn#S#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#Deg$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#E|![!^%Z!^!_*g!_!c%Z!c!i#E|!i#O%Z#O#P&c#P#R%Z#R#S#E|#S#T%Z#T#Z#E|#Z#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z$/l#FXi$f&j(Op(R!bo$'|OY%ZYZ&cZr%Zrs&}sw%Zwx(rx!Q%Z!Q![#E|![!^%Z!^!_*g!_!c%Z!c!i#E|!i#O%Z#O#P&c#P#R%Z#R#S#E|#S#T%Z#T#Z#E|#Z#b%Z#b#c#<v#c#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%Gh#HT_!d$b$f&j#|%<f(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z)[#I__`l$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(@^#Jk^g!*v!h'.r(Op(R!b(tSOY*gZr*grs'}sw*gwx)rx!P*g!P!Q#Kg!Q!^*g!^!_#L]!_!`#M}!`#O*g#P;'S*g;'S;=`+Z<%lO*g(n#KpX$h&j(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#LfZ#n$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx!_*g!_!`#MX!`#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#MbX$O$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g$Kh#NWX#o$Id(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g%Gh$ Oa#[%?x$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`0z!`!a$!T!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#W$!`_#g$Ih$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%Gh$#nafBf#o$Id$c#|$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`$$s!`!a$%}!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$%O_#o$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$&Ya#n$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`!a$'_!a#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$'j`#n$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+h$(wc(h$Ip$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!O%Z!O!P$*S!P!^%Z!^!_*g!_!a%Z!a!b$+^!b#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z'+`$*__}'#p$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$+i`$f&j#y$Id(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z#&^$,v_!{!Ln$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(@^$.Q_!P(8n$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(n$/UZ$f&jO!^$/w!^!_$0_!_#i$/w#i#j$0d#j#l$/w#l#m$2V#m#o$/w#o#p$0_#p;'S$/w;'S;=`$4b<%lO$/w(n$0OT^#S$f&jO!^&c!_#o&c#p;'S&c;'S;=`&w<%lO&c#S$0dO^#S(n$0i[$f&jO!Q&c!Q![$1_![!^&c!_!c&c!c!i$1_!i#T&c#T#Z$1_#Z#o&c#o#p$3u#p;'S&c;'S;=`&w<%lO&c(n$1dZ$f&jO!Q&c!Q![$2V![!^&c!_!c&c!c!i$2V!i#T&c#T#Z$2V#Z#o&c#p;'S&c;'S;=`&w<%lO&c(n$2[Z$f&jO!Q&c!Q![$2}![!^&c!_!c&c!c!i$2}!i#T&c#T#Z$2}#Z#o&c#p;'S&c;'S;=`&w<%lO&c(n$3SZ$f&jO!Q&c!Q![$/w![!^&c!_!c&c!c!i$/w!i#T&c#T#Z$/w#Z#o&c#p;'S&c;'S;=`&w<%lO&c#S$3xR!Q![$4R!c!i$4R#T#Z$4R#S$4US!Q![$4R!c!i$4R#T#Z$4R#q#r$0_(n$4eP;=`<%l$/w!2r$4s_!V!+S$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z%#S$5}`#v$Id$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z&,v$7[_$f&j(Op(R!b(X&%WOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS$8jk$f&j(Op(R!b'{&;d$[#t([!LYOY%ZYZ&cZr%Zrs&}st%Ztu$8Zuw%Zwx(rx}%Z}!O$:_!O!Q%Z!Q![$8Z![!^%Z!^!_*g!_!c%Z!c!}$8Z!}#O%Z#O#P&c#P#R%Z#R#S$8Z#S#T%Z#T#o$8Z#o#p*g#p$g%Z$g;'S$8Z;'S;=`$<e<%lO$8Z+d$:jk$f&j(Op(R!b$[#tOY%ZYZ&cZr%Zrs&}st%Ztu$:_uw%Zwx(rx}%Z}!O$:_!O!Q%Z!Q![$:_![!^%Z!^!_*g!_!c%Z!c!}$:_!}#O%Z#O#P&c#P#R%Z#R#S$:_#S#T%Z#T#o$:_#o#p*g#p$g%Z$g;'S$:_;'S;=`$<_<%lO$:_+d$<bP;=`<%l$:_(CS$<hP;=`<%l$8Z!5p$<tX![!3l(Op(R!bOY*gZr*grs'}sw*gwx)rx#O*g#P;'S*g;'S;=`+Z<%lO*g&CO$=la(o&;`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_!`Ka!`#O%Z#O#P&c#P#o%Z#o#p*g#p#q$+^#q;'S%Z;'S;=`+a<%lO%Z%#`$?O_!Z$I`r`$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(r$@Y_!pS$f&j(Op(R!bOY%ZYZ&cZr%Zrs&}sw%Zwx(rx!^%Z!^!_*g!_#O%Z#O#P&c#P#o%Z#o#p*g#p;'S%Z;'S;=`+a<%lO%Z(CS$Aj|$f&j(Op(R!b't(;d$Y#t'{&;d([!LYOX%ZXY+gYZ&cZ[+g[p%Zpq+gqr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$f%Z$f$g+g$g#BYEr#BY#BZ$AX#BZ$ISEr$IS$I_$AX$I_$JTEr$JT$JU$AX$JU$KVEr$KV$KW$AX$KW&FUEr&FU&FV$AX&FV;'SEr;'S;=`I|<%l?HTEr?HT?HU$AX?HUOEr(CS$Duk$f&j(Op(R!b'u(;d$Y#t'{&;d([!LYOY%ZYZ&cZr%Zrs&}st%ZtuEruw%Zwx(rx}%Z}!OGv!O!Q%Z!Q![Er![!^%Z!^!_*g!_!c%Z!c!}Er!}#O%Z#O#P&c#P#R%Z#R#SEr#S#T%Z#T#oEr#o#p*g#p$g%Z$g;'SEr;'S;=`I|<%lOEr",tokenizers:[rO,oO,lO,2,3,4,5,6,7,8,9,10,11,12,13,sO,new Ep("$S~RRtu[#O#Pg#S#T#|~_P#o#pb~gOt~~jVO#i!P#i#j!U#j#l!P#l#m!q#m;'S!P;'S;=`#v<%lO!P~!UO!R~~!XS!Q![!e!c!i!e#T#Z!e#o#p#Z~!hR!Q![!q!c!i!q#T#Z!q~!tR!Q![!}!c!i!}#T#Z!}~#QR!Q![!P!c!i!P#T#Z!P~#^R!Q![#g!c!i#g#T#Z#g~#jS!Q![#g!c!i#g#T#Z#g#q#r!P~#yP;=`<%l!P~$RO(Z~~",141,332),new Ep("j~RQYZXz{^~^O'x~~aP!P!Qd~iO'y~~",25,315)],topRules:{Script:[0,6],SingleExpression:[1,269],SingleClassItem:[2,270]},dialects:{jsx:0,ts:14614},dynamicPrecedences:{69:1,79:1,81:1,165:1,193:1},specialized:[{term:319,get:t=>cO[t]||-1},{term:334,get:t=>fO[t]||-1},{term:70,get:t=>uO[t]||-1}],tokenPrec:14638}),pO=[Dd("function ${name}(${params}) {\n\t${}\n}",{label:"function",detail:"definition",type:"keyword"}),Dd("for (let ${index} = 0; ${index} < ${bound}; ${index}++) {\n\t${}\n}",{label:"for",detail:"loop",type:"keyword"}),Dd("for (let ${name} of ${collection}) {\n\t${}\n}",{label:"for",detail:"of loop",type:"keyword"}),Dd("do {\n\t${}\n} while (${})",{label:"do",detail:"loop",type:"keyword"}),Dd("while (${}) {\n\t${}\n}",{label:"while",detail:"loop",type:"keyword"}),Dd("try {\n\t${}\n} catch (${error}) {\n\t${}\n}",{label:"try",detail:"/ catch block",type:"keyword"}),Dd("if (${}) {\n\t${}\n}",{label:"if",detail:"block",type:"keyword"}),Dd("if (${}) {\n\t${}\n} else {\n\t${}\n}",{label:"if",detail:"/ else block",type:"keyword"}),Dd("class ${name} {\n\tconstructor(${params}) {\n\t\t${}\n\t}\n}",{label:"class",detail:"definition",type:"keyword"}),Dd('import {${names}} from "${module}"\n${}',{label:"import",detail:"named",type:"keyword"}),Dd('import ${name} from "${module}"\n${}',{label:"import",detail:"default",type:"keyword"})],OO=pO.concat([Dd("interface ${name} {\n\t${}\n}",{label:"interface",detail:"definition",type:"keyword"}),Dd("type ${name} = ${type}",{label:"type",detail:"definition",type:"keyword"}),Dd("enum ${name} {\n\t${}\n}",{label:"enum",detail:"definition",type:"keyword"})]),gO=new xa,mO=new Set(["Script","Block","FunctionExpression","FunctionDeclaration","ArrowFunction","MethodDeclaration","ForStatement"]);function wO(t){return(e,i)=>{let n=e.node.getChild("VariableDefinition");return n&&i(n,t),!0}}const vO=["FunctionDeclaration"],bO={FunctionDeclaration:wO("function"),ClassDeclaration:wO("class"),ClassExpression:()=>!0,EnumDeclaration:wO("constant"),TypeAliasDeclaration:wO("type"),NamespaceDeclaration:wO("namespace"),VariableDefinition(t,e){t.matchContext(vO)||e(t,"variable")},TypeDefinition(t,e){e(t,"type")},__proto__:null};function yO(t,e){let i=gO.get(e);if(i)return i;let n=[],s=!0;function r(e,i){let s=t.sliceString(e.from,e.to);n.push({label:s,type:i})}return e.cursor(sa.IncludeAnonymous).iterate((e=>{if(s)s=!1;else if(e.name){let t=bO[e.name];if(t&&t(e,r)||mO.has(e.name))return!1}else if(e.to-e.from>8192){for(let i of yO(t,e.node))n.push(i);return!1}})),gO.set(e,n),n}const SO=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,xO=["TemplateString","String","RegExp","LineComment","BlockComment","VariableDefinition","TypeDefinition","Label","PropertyDefinition","PropertyName","PrivatePropertyDefinition","PrivatePropertyName",".","?."];function kO(t){let e=hl(t.state).resolveInner(t.pos,-1);if(xO.indexOf(e.name)>-1)return null;let i="VariableName"==e.name||e.to-e.from<20&&SO.test(t.state.sliceDoc(e.from,e.to));if(!i&&!t.explicit)return null;let n=[];for(let i=e;i;i=i.parent)mO.has(i.name)&&(n=n.concat(yO(t.state.doc,i)));return{options:n,from:i?e.from:t.pos,validFor:SO}}function QO(t,e,i){var n;let s=[];for(;;){let r,o=e.firstChild;if("VariableName"==(null==o?void 0:o.name))return s.push(t(o)),{path:s.reverse(),name:i};if("MemberExpression"!=(null==o?void 0:o.name)||"PropertyName"!=(null===(n=r=o.lastChild)||void 0===n?void 0:n.name))return null;s.push(t(r)),e=o}}function $O(t){let e=e=>t.state.doc.sliceString(e.from,e.to),i=hl(t.state).resolveInner(t.pos,-1);return"PropertyName"==i.name?QO(e,i.parent,e(i)):"."!=i.name&&"?."!=i.name||"MemberExpression"!=i.parent.name?xO.indexOf(i.name)>-1?null:"VariableName"==i.name||i.to-i.from<20&&SO.test(e(i))?{path:[],name:e(i)}:"MemberExpression"==i.name?QO(e,i,""):t.explicit?{path:[],name:""}:null:QO(e,i.parent,"")}const PO=ll.define({name:"javascript",parser:dO.configure({props:[Zl.add({IfStatement:jl({except:/^\s*({|else\b)/}),TryStatement:jl({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:Ml,SwitchBody:t=>{let e=t.textAfter,i=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return t.baseIndent+(i?0:n?1:2)*t.unit},Block:Yl({closing:"}"}),ArrowFunction:t=>t.baseIndent+t.unit,"TemplateString BlockComment":()=>null,"Statement Property":jl({except:/^{/}),JSXElement(t){let e=/^\s*<\//.test(t.textAfter);return t.lineIndent(t.node.from)+(e?0:t.unit)},JSXEscape(t){let e=/\s*\}/.test(t.textAfter);return t.lineIndent(t.node.from)+(e?0:t.unit)},"JSXOpenTag JSXSelfClosingTag":t=>t.column(t.node.from)+t.unit}),ql.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":_l,BlockComment:t=>({from:t.from+2,to:t.to-2})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:"$"}}),ZO={test:t=>/^JSX/.test(t.name),facet:sl({commentTokens:{block:{open:"{/*",close:"*/}"}}})},CO=PO.configure({dialect:"ts"},"typescript"),TO=PO.configure({dialect:"jsx",props:[rl.add((t=>t.isTop?[ZO]:void 0))]}),AO=PO.configure({dialect:"jsx ts",props:[rl.add((t=>t.isTop?[ZO]:void 0))]},"typescript");let RO=t=>({label:t,type:"keyword"});const XO="break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield".split(" ").map(RO),YO=XO.concat(["declare","implements","private","protected","public"].map(RO));function WO(t,e,i=t.length){for(let n=null==e?void 0:e.firstChild;n;n=n.nextSibling)if("JSXIdentifier"==n.name||"JSXBuiltin"==n.name||"JSXNamespacedName"==n.name||"JSXMemberExpression"==n.name)return t.sliceString(n.from,Math.min(n.to,i));return""}const MO="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),jO=Bs.inputHandler.of(((t,e,i,n,s)=>{if((MO?t.composing:t.compositionStarted)||t.state.readOnly||e!=i||">"!=n&&"/"!=n||!PO.isActiveAt(t.state,e,-1))return!1;let r=s(),{state:o}=r,a=o.changeByRange((t=>{var e;let i,{head:s}=t,r=hl(o).resolveInner(s-1,-1);if("JSXStartTag"==r.name&&(r=r.parent),o.doc.sliceString(s-1,s)!=n||"JSXAttributeValue"==r.name&&r.to>s);else{if(">"==n&&"JSXFragmentTag"==r.name)return{range:t,changes:{from:s,insert:"</>"}};if("/"==n&&"JSXStartCloseTag"==r.name){let t=r.parent,n=t.parent;if(n&&t.from==s-2&&((i=WO(o.doc,n.firstChild,s))||"JSXFragmentTag"==(null===(e=n.firstChild)||void 0===e?void 0:e.name))){let t=`${i}>`;return{range:X.cursor(s+t.length,-1),changes:{from:s,insert:t}}}}else if(">"==n){let e=function(t){for(;;){if("JSXOpenTag"==t.name||"JSXSelfClosingTag"==t.name||"JSXFragmentTag"==t.name)return t;if("JSXEscape"==t.name||!t.parent)return null;t=t.parent}}(r);if(e&&!/^\/?>|^<\//.test(o.doc.sliceString(s,s+2))&&(i=WO(o.doc,e,s)))return{range:t,changes:{from:s,insert:`</${i}>`}}}}return{range:t}}));return!a.changes.empty&&(t.dispatch([r,o.update(a,{userEvent:"input.complete",scrollIntoView:!0})]),!0)}));function DO(t,e,i,n){return i.line(t+n.line).from+e+(1==t?n.col-1:-1)}function EO(t,e,i){let n=DO(t.line,t.column,e,i),s={from:n,to:null!=t.endLine&&1!=t.endColumn?DO(t.endLine,t.endColumn,e,i):n,message:t.message,source:t.ruleId?"eslint:"+t.ruleId:"eslint",severity:1==t.severity?"warning":"error"};if(t.fix){let{range:e,text:r}=t.fix,o=e[0]+i.pos-n,a=e[1]+i.pos-n;s.actions=[{name:"fix",apply(t,e){t.dispatch({changes:{from:e+o,to:e+a,insert:r},scrollIntoView:!0})}}]}return s}var qO=Object.freeze({__proto__:null,autoCloseTags:jO,completionPath:$O,esLint:function(t,e){return e||(e={parserOptions:{ecmaVersion:2019,sourceType:"module"},env:{browser:!0,node:!0,es6:!0,es2015:!0,es2017:!0,es2020:!0},rules:{}},t.getRules().forEach(((t,i)=>{t.meta.docs.recommended&&(e.rules[i]=2)}))),i=>{let{state:n}=i,s=[];for(let{from:i,to:r}of PO.findRegions(n)){let o=n.doc.lineAt(i),a={line:o.number-1,col:i-o.from,pos:i};for(let o of t.verify(n.sliceDoc(i,r),e))s.push(EO(o,n.doc,a))}return s}},javascript:function(t={}){let e=t.jsx?t.typescript?AO:TO:t.typescript?CO:PO,i=t.typescript?OO.concat(YO):pO.concat(XO);return new bl(e,[PO.data.of({autocomplete:(n=xO,s=Iu(i),t=>{for(let e=hl(t.state).resolveInner(t.pos,-1);e;e=e.parent){if(n.indexOf(e.name)>-1)return null;if(e.type.isTop)break}return s(t)})}),PO.data.of({autocomplete:kO}),t.jsx?jO:[]]);var n,s},javascriptLanguage:PO,jsxLanguage:TO,localCompletionSource:kO,scopeCompletionSource:function(t){let e=new Map;return i=>{let n=$O(i);if(!n)return null;let s=t;for(let t of n.path)if(s=s[t],!s)return null;let r=e.get(s);return r||e.set(s,r=function(t,e){let i=[],n=new Set;for(let s=0;;s++){for(let r of(Object.getOwnPropertyNames||Object.keys)(t)){if(!/^[a-zA-Z_$\xaa-\uffdc][\w$\xaa-\uffdc]*$/.test(r)||n.has(r))continue;let o;n.add(r);try{o=t[r]}catch(t){continue}i.push({label:r,type:"function"==typeof o?/^[A-Z]/.test(r)?"class":e?"function":"method":e?"variable":"property",boost:-s})}let r=Object.getPrototypeOf(t);if(!r)return i;t=r}}(s,!n.path.length)),{from:i.pos-n.name.length,options:r,validFor:SO}}},snippets:pO,tsxLanguage:AO,typescriptLanguage:CO,typescriptSnippets:OO});export{Cp as codemirror,qO as codemirrorLangJavascript,hc as codemirrorLanguage,zt as codemirrorState,Lo as codemirrorView,il as lezerHighlight}; diff --git a/devtools/client/shared/sourceeditor/codemirror6/index.mjs b/devtools/client/shared/sourceeditor/codemirror6/index.mjs index a1a03124ce..5ef71e4398 100644 --- a/devtools/client/shared/sourceeditor/codemirror6/index.mjs +++ b/devtools/client/shared/sourceeditor/codemirror6/index.mjs @@ -9,7 +9,7 @@ import * as codemirrorLanguage from "@codemirror/language"; import * as codemirrorLangJavascript from "@codemirror/lang-javascript"; import * as lezerHighlight from "@lezer/highlight"; -// XXX When adding new exports, you need to update the codemirror6.bundle.js file, +// XXX When adding new exports, you need to update the codemirror6.bundle.mjs file, // running `npm install && npm run build-cm6` from the devtools/client/shared/sourceeditor folder export { diff --git a/devtools/client/shared/sourceeditor/codemirror6/moz.build b/devtools/client/shared/sourceeditor/codemirror6/moz.build index 4d66cfabea..b52dc17cb9 100644 --- a/devtools/client/shared/sourceeditor/codemirror6/moz.build +++ b/devtools/client/shared/sourceeditor/codemirror6/moz.build @@ -5,7 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DevToolsModules( - "codemirror6.bundle.js", + "codemirror6.bundle.mjs", ) with Files("**"): diff --git a/devtools/client/shared/sourceeditor/editor.js b/devtools/client/shared/sourceeditor/editor.js index c379a6b411..056914b931 100644 --- a/devtools/client/shared/sourceeditor/editor.js +++ b/devtools/client/shared/sourceeditor/editor.js @@ -62,8 +62,6 @@ const { OS } = Services.appinfo; const CM_BUNDLE = "chrome://devtools/content/shared/sourceeditor/codemirror/codemirror.bundle.js"; -const CM6_BUNDLE = - "resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.js"; const CM_IFRAME = "chrome://devtools/content/shared/sourceeditor/codemirror/cmiframe.html"; @@ -161,11 +159,13 @@ class Editor extends EventEmitter { config = null; Doc = null; + #CodeMirror6; #compartments; #lastDirty; #loadedKeyMaps; #ownerDoc; #prefObserver; + #win; constructor(config) { super(); @@ -422,6 +422,7 @@ class Editor extends EventEmitter { const win = el.ownerDocument.defaultView; Services.scriptloader.loadSubScript(CM_BUNDLE, win); + this.#win = win; if (this.config.cssProperties) { // Replace the propertyKeywords, colorKeywords and valueKeywords @@ -594,8 +595,12 @@ class Editor extends EventEmitter { #setupCm6(el, doc) { this.#ownerDoc = doc || el.ownerDocument; const win = el.ownerDocument.defaultView; + this.#win = win; - Services.scriptloader.loadSubScript(CM6_BUNDLE, win); + this.#CodeMirror6 = this.#win.ChromeUtils.importESModule( + "resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs", + { global: "current" } + ); const { codemirror, @@ -604,13 +609,16 @@ class Editor extends EventEmitter { codemirrorLanguage, codemirrorLangJavascript, lezerHighlight, - } = win.CodeMirror; + } = this.#CodeMirror6; const tabSizeCompartment = new Compartment(); const indentCompartment = new Compartment(); + const lineWrapCompartment = new Compartment(); + this.#compartments = { tabSizeCompartment, indentCompartment, + lineWrapCompartment, }; const indentStr = (this.config.indentWithTabs ? "\t" : " ").repeat( @@ -620,6 +628,9 @@ class Editor extends EventEmitter { const extensions = [ indentCompartment.of(codemirrorLanguage.indentUnit.of(indentStr)), tabSizeCompartment.of(EditorState.tabSize.of(this.config.tabSize)), + lineWrapCompartment.of( + this.config.lineWrapping ? EditorView.lineWrapping : [] + ), EditorState.readOnly.of(this.config.readOnly), codemirrorLanguage.codeFolding({ placeholderText: "↔", @@ -627,7 +638,7 @@ class Editor extends EventEmitter { codemirrorLanguage.foldGutter({ class: "cm6-dt-foldgutter", markerDOM: open => { - const button = doc.createElement("button"); + const button = this.#ownerDoc.createElement("button"); button.classList.add("cm6-dt-foldgutter__toggle-button"); button.setAttribute("aria-expanded", open); return button; @@ -646,10 +657,6 @@ class Editor extends EventEmitter { extensions.push(lineNumbers()); } - if (this.config.lineWrapping) { - extensions.push(EditorView.lineWrapping); - } - const cm = new EditorView({ parent: el, extensions, @@ -686,14 +693,6 @@ class Editor extends EventEmitter { } /** - * Returns the container content window - * @returns {Window} - */ - getContainerWindow() { - return this.container.contentWindow.wrappedJSObject; - } - - /** * Creates a CodeMirror Document * * @param {String} text: Initial text of the document @@ -923,7 +922,7 @@ class Editor extends EventEmitter { const { codemirrorState: { EditorState }, codemirrorLanguage, - } = this.getContainerWindow().CodeMirror; + } = this.#CodeMirror6; cm.dispatch({ effects: this.#compartments.tabSizeCompartment.reconfigure( @@ -1495,6 +1494,23 @@ class Editor extends EventEmitter { cm.refresh(); } + setLineWrapping(value) { + const cm = editors.get(this); + if (this.config.cm6) { + const { + codemirrorView: { EditorView }, + } = this.#CodeMirror6; + cm.dispatch({ + effects: this.#compartments.lineWrapCompartment.reconfigure( + value ? EditorView.lineWrapping : [] + ), + }); + } else { + cm.setOption("lineWrapping", value); + } + this.config.lineWrapping = value; + } + /** * Sets an option for the editor. For most options it just defers to * CodeMirror.setOption, but certain ones are maintained within the editor diff --git a/devtools/client/shared/sourceeditor/rollup.config.mjs b/devtools/client/shared/sourceeditor/rollup.config.mjs index 520ca87164..e4d4ec6b43 100644 --- a/devtools/client/shared/sourceeditor/rollup.config.mjs +++ b/devtools/client/shared/sourceeditor/rollup.config.mjs @@ -15,9 +15,8 @@ export default function (commandLineArgs) { return { input: "codemirror6/index.mjs", output: { - file: "codemirror6/codemirror6.bundle.js", - format: "iife", - name: "CodeMirror", + file: "codemirror6/codemirror6.bundle.mjs", + format: "esm", }, plugins, }; diff --git a/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js b/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js index c7dc9c8a97..13ab5825c8 100644 --- a/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js +++ b/devtools/client/shared/sourceeditor/test/browser_editor_autocomplete_basic.js @@ -18,7 +18,7 @@ async function test() { teardown(ed, win); } -function testJS(ed, win) { +function testJS(ed) { ok(!ed.getOption("autocomplete"), "Autocompletion is not set"); ed.setMode(Editor.modes.js); @@ -27,7 +27,7 @@ function testJS(ed, win) { ok(ed.getOption("autocomplete"), "Autocompletion is set"); } -function testCSS(ed, win) { +function testCSS(ed) { ok(ed.getOption("autocomplete"), "Autocompletion is set"); ed.setMode(Editor.modes.css); @@ -36,7 +36,7 @@ function testCSS(ed, win) { ok(ed.getOption("autocomplete"), "Autocompletion is still set"); } -function testPref(ed, win) { +function testPref(ed) { ed.setMode(Editor.modes.js); ed.setOption("autocomplete", true); diff --git a/devtools/client/shared/stylesheet-utils.js b/devtools/client/shared/stylesheet-utils.js index 5a034debe1..187cf2898d 100644 --- a/devtools/client/shared/stylesheet-utils.js +++ b/devtools/client/shared/stylesheet-utils.js @@ -5,7 +5,7 @@ /* eslint-env browser */ "use strict"; -function stylesheetLoadPromise(styleSheet, url) { +function stylesheetLoadPromise(styleSheet) { return new Promise((resolve, reject) => { styleSheet.addEventListener("load", resolve, { once: true }); styleSheet.addEventListener("error", reject, { once: true }); diff --git a/devtools/client/shared/test-helpers/jest-fixtures/ChromeUtils.js b/devtools/client/shared/test-helpers/jest-fixtures/ChromeUtils.js index 2fee8bc01c..d396777223 100644 --- a/devtools/client/shared/test-helpers/jest-fixtures/ChromeUtils.js +++ b/devtools/client/shared/test-helpers/jest-fixtures/ChromeUtils.js @@ -4,9 +4,21 @@ "use strict"; +const mockedESM = { + BinarySearch: { + insertionIndexOf() { + return 0; + }, + }, +}; + module.exports = { import: () => ({}), addProfilerMarker: () => {}, - defineESModuleGetters: () => {}, + defineESModuleGetters: (lazy, dict) => { + for (const key in dict) { + lazy[key] = mockedESM[key]; + } + }, importESModule: () => ({}), }; diff --git a/devtools/client/shared/test-helpers/jest-fixtures/Services.js b/devtools/client/shared/test-helpers/jest-fixtures/Services.js index 85d0bce5e0..d6198c8d2d 100644 --- a/devtools/client/shared/test-helpers/jest-fixtures/Services.js +++ b/devtools/client/shared/test-helpers/jest-fixtures/Services.js @@ -541,9 +541,9 @@ const Services = { appinfo: "", obs: { addObserver: () => {} }, strings: { - createBundle(bundle) { + createBundle() { return { - GetStringFromName(str) { + GetStringFromName() { return "NodeTest"; }, }; diff --git a/devtools/client/shared/test-helpers/shared-node-helpers.js b/devtools/client/shared/test-helpers/shared-node-helpers.js index ca6a728a8a..e9296d3b86 100644 --- a/devtools/client/shared/test-helpers/shared-node-helpers.js +++ b/devtools/client/shared/test-helpers/shared-node-helpers.js @@ -13,7 +13,7 @@ function setMocksInGlobal() { global.Cc = new Proxy( {}, { - get(target, prop, receiver) { + get(target, prop) { if (prop.startsWith("@mozilla.org")) { return { getService: () => ({}) }; } diff --git a/devtools/client/shared/test/browser_autocomplete_popup_input.js b/devtools/client/shared/test/browser_autocomplete_popup_input.js index a7d04f1c9c..32fc6da25e 100644 --- a/devtools/client/shared/test/browser_autocomplete_popup_input.js +++ b/devtools/client/shared/test/browser_autocomplete_popup_input.js @@ -19,7 +19,8 @@ add_task(async function () { const { doc } = await createHost(); const input = doc.createElement("input"); - doc.body.append(input, doc.createElement("input")); + const prevInput = doc.createElement("input"); + doc.body.append(prevInput, input, doc.createElement("input")); const onSelectCalled = []; const onClickCalled = []; @@ -189,7 +190,9 @@ add_task(async function () { ); EventUtils.synthesizeKey("KEY_Tab", { shiftKey: true }); is(onClickCalled.length, 3, "onClick wasn't called"); + is(hasFocus(input), false, "input does not have the focus anymore"); + is(hasFocus(prevInput), true, "Shift+Tab moves the focus to prevInput"); const onPopupClose = popup.once("popup-closed"); popup.hidePopup(); diff --git a/devtools/client/shared/test/browser_cubic-bezier-02.js b/devtools/client/shared/test/browser_cubic-bezier-02.js index 3ce0af2f99..55fcb39c83 100644 --- a/devtools/client/shared/test/browser_cubic-bezier-02.js +++ b/devtools/client/shared/test/browser_cubic-bezier-02.js @@ -103,7 +103,7 @@ async function curveCanBeClicked(widget, win, doc, offsets) { is(bezier.P1[1], 0.75, "P1 progress coordinate remained unchanged"); } -async function pointsCanBeMovedWithKeyboard(widget, win, doc, offsets) { +async function pointsCanBeMovedWithKeyboard(widget) { info("Checking that points respond to keyboard events"); const singleStep = 3; diff --git a/devtools/client/shared/test/browser_cubic-bezier-06.js b/devtools/client/shared/test/browser_cubic-bezier-06.js index 9cb00e8bf7..269610b69f 100644 --- a/devtools/client/shared/test/browser_cubic-bezier-06.js +++ b/devtools/client/shared/test/browser_cubic-bezier-06.js @@ -63,7 +63,7 @@ function adjustingBezierUpdatesPreset(widget, win, doc, rect) { is(widget.presets._activePreset, null, "There is no active preset"); } -async function selectingPresetUpdatesBezier(widget, win, doc, rect) { +async function selectingPresetUpdatesBezier(widget, win, doc) { info("Checking that selecting a preset updates bezier curve"); info("Listening for the new coordinates event"); diff --git a/devtools/client/shared/test/browser_dbg_listworkers.js b/devtools/client/shared/test/browser_dbg_listworkers.js index fcdcf8e5dd..fc54139134 100644 --- a/devtools/client/shared/test/browser_dbg_listworkers.js +++ b/devtools/client/shared/test/browser_dbg_listworkers.js @@ -42,7 +42,7 @@ add_task(async function test() { is(workers[1].url, WORKER2_URL); onWorkerListChanged = waitForWorkerListChanged(target); - await SpecialPowers.spawn(tab.linkedBrowser, [WORKER2_URL], workerUrl => { + await SpecialPowers.spawn(tab.linkedBrowser, [WORKER2_URL], () => { content.worker1.terminate(); }); await onWorkerListChanged; @@ -52,7 +52,7 @@ add_task(async function test() { is(workers[0].url, WORKER2_URL); onWorkerListChanged = waitForWorkerListChanged(target); - await SpecialPowers.spawn(tab.linkedBrowser, [WORKER2_URL], workerUrl => { + await SpecialPowers.spawn(tab.linkedBrowser, [WORKER2_URL], () => { content.worker2.terminate(); }); await onWorkerListChanged; diff --git a/devtools/client/shared/test/browser_inplace-editor-01.js b/devtools/client/shared/test/browser_inplace-editor-01.js index b919fca946..e6bc604392 100644 --- a/devtools/client/shared/test/browser_inplace-editor-01.js +++ b/devtools/client/shared/test/browser_inplace-editor-01.js @@ -96,7 +96,7 @@ function testAdvanceCharCommit(doc) { createInplaceEditorAndClick( { advanceChars: ":", - start(editor) { + start() { EventUtils.sendString("Test:"); }, done: onDone("Test", true, resolve), @@ -114,7 +114,7 @@ function testAdvanceCharsFunction(doc) { createInplaceEditorAndClick( { initial: "", - advanceChars(charCode, text, insertionPoint) { + advanceChars(charCode, text) { if (charCode !== KeyboardEvent.DOM_VK_COLON) { return false; } @@ -126,7 +126,7 @@ function testAdvanceCharsFunction(doc) { // Just to make sure we check it somehow. return !!text.length; }, - start(editor) { + start() { for (const ch of ":Test:") { EventUtils.sendChar(ch); } diff --git a/devtools/client/shared/test/browser_key_shortcuts.js b/devtools/client/shared/test/browser_key_shortcuts.js index d48666ddca..6dafe3df2c 100644 --- a/devtools/client/shared/test/browser_key_shortcuts.js +++ b/devtools/client/shared/test/browser_key_shortcuts.js @@ -438,7 +438,7 @@ async function testTabCharacterShortcut(shortcuts) { info("Test tab character shortcut"); - once(shortcuts, "CmdOrCtrl+Alt+I", event => { + once(shortcuts, "CmdOrCtrl+Alt+I", () => { ok(false, "This handler must not be executed"); }); diff --git a/devtools/client/shared/test/browser_spectrum.js b/devtools/client/shared/test/browser_spectrum.js index 6189b1f0af..32ed6a79e0 100644 --- a/devtools/client/shared/test/browser_spectrum.js +++ b/devtools/client/shared/test/browser_spectrum.js @@ -245,12 +245,7 @@ function setSpectrumProps(spectrum, props, updateUI = true) { } } -function testAriaAttributesOnSpectrumElements( - spectrum, - colorName, - rgbString, - alpha -) { +function testAriaAttributesOnSpectrumElements(spectrum, colorName, rgbString) { for (const slider of [spectrum.dragger, spectrum.hueSlider]) { is( slider.getAttribute("aria-describedby"), diff --git a/devtools/client/shared/test/browser_tableWidget_basic.js b/devtools/client/shared/test/browser_tableWidget_basic.js index a8b737b9d0..5cdf67206e 100644 --- a/devtools/client/shared/test/browser_tableWidget_basic.js +++ b/devtools/client/shared/test/browser_tableWidget_basic.js @@ -1,6 +1,9 @@ /* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ +// We test sorting of strings, which Assert.greater/less etc. don't do. +/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */ + // Tests that the table widget api works fine "use strict"; diff --git a/devtools/client/shared/test/browser_telemetry_button_eyedropper.js b/devtools/client/shared/test/browser_telemetry_button_eyedropper.js index 88d019de91..0606cec886 100644 --- a/devtools/client/shared/test/browser_telemetry_button_eyedropper.js +++ b/devtools/client/shared/test/browser_telemetry_button_eyedropper.js @@ -23,7 +23,7 @@ add_task(async function () { gBrowser.removeCurrentTab(); }); -async function testButton(toolbox, Telemetry) { +async function testButton(toolbox) { info("Calling the eyedropper button's callback"); // We call the button callback directly because we don't need to test the UI here, we're // only concerned about testing the telemetry probe. diff --git a/devtools/client/shared/test/browser_treeWidget_basic.js b/devtools/client/shared/test/browser_treeWidget_basic.js index 48702b9b8d..bc52a07c8e 100644 --- a/devtools/client/shared/test/browser_treeWidget_basic.js +++ b/devtools/client/shared/test/browser_treeWidget_basic.js @@ -34,7 +34,7 @@ add_task(async function () { gBrowser.removeCurrentTab(); }); -function populateTree(tree, doc) { +function populateTree(tree) { tree.add([ { id: "level1", @@ -179,7 +179,7 @@ function testTreeItemInsertedCorrectly(tree, doc) { /** * Populate the unsorted tree. */ -function populateUnsortedTree(tree, doc) { +function populateUnsortedTree(tree) { tree.sorted = false; tree.add([{ id: "g-1", label: "g-1" }]); @@ -191,7 +191,7 @@ function populateUnsortedTree(tree, doc) { /** * Test if the nodes are inserted correctly in the unsorted tree. */ -function testUnsortedTreeItemInsertedCorrectly(tree, doc) { +function testUnsortedTreeItemInsertedCorrectly(tree) { ok(tree.root.items.has("g-1"), "g-1 top level element exists"); is( diff --git a/devtools/client/shared/test/doc_event-listeners-01.html b/devtools/client/shared/test/doc_event-listeners-01.html index 5a9c2d53b6..653676b623 100644 --- a/devtools/client/shared/test/doc_event-listeners-01.html +++ b/devtools/client/shared/test/doc_event-listeners-01.html @@ -15,19 +15,19 @@ "use strict"; window.addEventListener("load", function() { - function initialSetup(event) { + function initialSetup() { // eslint-disable-next-line no-debugger debugger; const button = document.querySelector("button"); button.onclick = clickHandler; } - function clickHandler(event) { + function clickHandler() { window.foobar = "clickHandler"; } - function changeHandler(event) { + function changeHandler() { window.foobar = "changeHandler"; } - function keyupHandler(event) { + function keyupHandler() { window.foobar = "keyupHandler"; } diff --git a/devtools/client/shared/test/doc_event-listeners-03.html b/devtools/client/shared/test/doc_event-listeners-03.html index 2660f9f141..1d45b575e1 100644 --- a/devtools/client/shared/test/doc_event-listeners-03.html +++ b/devtools/client/shared/test/doc_event-listeners-03.html @@ -17,14 +17,14 @@ "use strict"; window.addEventListener("load", function() { - function initialSetup(event) { + function initialSetup() { const button = document.getElementById("initialSetup"); button.removeEventListener("click", initialSetup); // eslint-disable-next-line no-debugger debugger; } - function clicker(event) { + function clicker() { window.foobar = "clicker"; } diff --git a/devtools/client/shared/test/doc_layoutHelpers_getBoxQuads2-c-and-e.html b/devtools/client/shared/test/doc_layoutHelpers_getBoxQuads2-c-and-e.html index 7917c82411..d31aa30e73 100644 --- a/devtools/client/shared/test/doc_layoutHelpers_getBoxQuads2-c-and-e.html +++ b/devtools/client/shared/test/doc_layoutHelpers_getBoxQuads2-c-and-e.html @@ -2,7 +2,7 @@ <meta charset=utf-8> <script> 'use strict'; -window.onmessage = event => { +window.onmessage = () => { const innerNode = window.document.getElementById("inner-node"); const wrappedNode = SpecialPowers.wrap(innerNode); const wrappedQuads = wrappedNode.getBoxQuadsFromWindowOrigin(); diff --git a/devtools/client/shared/test/doc_native-event-handler.html b/devtools/client/shared/test/doc_native-event-handler.html index f08d7c01f1..45203f3444 100644 --- a/devtools/client/shared/test/doc_native-event-handler.html +++ b/devtools/client/shared/test/doc_native-event-handler.html @@ -9,7 +9,7 @@ "use strict"; /* exported initialSetup */ - function initialSetup(event) { + function initialSetup() { // eslint-disable-next-line no-debugger debugger; } diff --git a/devtools/client/shared/test/highlighter-test-actor.js b/devtools/client/shared/test/highlighter-test-actor.js index 8a7b404df1..8d02d79784 100644 --- a/devtools/client/shared/test/highlighter-test-actor.js +++ b/devtools/client/shared/test/highlighter-test-actor.js @@ -209,7 +209,7 @@ var highlighterTestSpec = protocol.generateActorSpec({ }); class HighlighterTestActor extends protocol.Actor { - constructor(conn, targetActor, options) { + constructor(conn, targetActor) { super(conn, highlighterTestSpec); this.targetActor = targetActor; diff --git a/devtools/client/shared/test/shared-head.js b/devtools/client/shared/test/shared-head.js index 2c8df188a6..aa47b35edd 100644 --- a/devtools/client/shared/test/shared-head.js +++ b/devtools/client/shared/test/shared-head.js @@ -54,6 +54,45 @@ if (DEBUG_ALLOCATIONS) { }); } +// When DEBUG_STEP environment variable is set, +// automatically start a tracer which will log all line being executed +// in the running test (and nothing else) and also pause its execution +// for the given amount of milliseconds. +// +// Be careful that these pause have significant side effect. +// This will pause the test script event loop and allow running the other +// tasks queued in the parent process's main thread event loop queue. +// +// Passing any non-number value, like `DEBUG_STEP=true` will still +// log the executed lines without any pause, and without this side effect. +// +// For now, the tracer can only work once per thread. +// So when using this feature you will not be able to use the JS tracer +// in any other way on parent process's main thread. +const DEBUG_STEP = Services.env.get("DEBUG_STEP"); +if (DEBUG_STEP) { + // Use a custom loader with `invisibleToDebugger` flag for the allocation tracker + // as it instantiates custom Debugger API instances and has to be running in a distinct + // compartments from DevTools and system scopes (JSMs, XPCOM,...) + const { + useDistinctSystemPrincipalLoader, + releaseDistinctSystemPrincipalLoader, + } = ChromeUtils.importESModule( + "resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs" + ); + const requester = {}; + const loader = useDistinctSystemPrincipalLoader(requester); + + const stepper = loader.require( + "resource://devtools/shared/test-helpers/test-stepper.js" + ); + stepper.start(globalThis, gTestPath, DEBUG_STEP); + registerCleanupFunction(() => { + stepper.stop(); + releaseDistinctSystemPrincipalLoader(requester); + }); +} + const { loader, require } = ChromeUtils.importESModule( "resource://devtools/shared/loader/Loader.sys.mjs" ); diff --git a/devtools/client/shared/undo.js b/devtools/client/shared/undo.js index 759d3a4aed..b246bec3c4 100644 --- a/devtools/client/shared/undo.js +++ b/devtools/client/shared/undo.js @@ -186,5 +186,5 @@ UndoStack.prototype = { } }, - onEvent(event) {}, + onEvent() {}, }; diff --git a/devtools/client/shared/widgets/TableWidget.js b/devtools/client/shared/widgets/TableWidget.js index d37559b587..f606649eee 100644 --- a/devtools/client/shared/widgets/TableWidget.js +++ b/devtools/client/shared/widgets/TableWidget.js @@ -1667,7 +1667,7 @@ function Cell(column, item, nextCell) { if (column.table.cellContextMenuId) { this.label.setAttribute("context", column.table.cellContextMenuId); - this.label.addEventListener("contextmenu", event => { + this.label.addEventListener("contextmenu", () => { // Make the ID of the clicked cell available as a property on the table. // It's then available for the popupshowing or command handler. column.table.contextMenuRowId = this.id; diff --git a/devtools/client/shared/widgets/spectrum.css b/devtools/client/shared/widgets/spectrum.css index b7bf31668f..9ea2a97fbc 100644 --- a/devtools/client/shared/widgets/spectrum.css +++ b/devtools/client/shared/widgets/spectrum.css @@ -292,15 +292,14 @@ http://www.briangrinstead.com/blog/keep-aspect-ratio-with-html-and-css */ } .spectrum-color-contrast .accessibility-color-contrast-large-text { - margin-inline-start: 1px; - margin-inline-end: 1px; + margin-inline: 1px; unicode-bidi: isolate; } .learn-more { background-repeat: no-repeat; -moz-context-properties: fill; - background-image: url(chrome://devtools/skin/images/info-small.svg); + background-image: url(resource://devtools-shared-images/info-small.svg); background-color: transparent; fill: var(--theme-icon-dimmed-color); border: none; diff --git a/devtools/client/shared/workers-listener.js b/devtools/client/shared/workers-listener.js index 7d544481d8..26a054219a 100644 --- a/devtools/client/shared/workers-listener.js +++ b/devtools/client/shared/workers-listener.js @@ -62,7 +62,7 @@ class WorkersListener { this.rootFront.on("serviceWorkerRegistrationListChanged", this._listener); } - removeListener(listener) { + removeListener() { if (!this._listener) { return; } diff --git a/devtools/client/storage/VariablesView.sys.mjs b/devtools/client/storage/VariablesView.sys.mjs index 4cd03edb18..96fe4f8da4 100644 --- a/devtools/client/storage/VariablesView.sys.mjs +++ b/devtools/client/storage/VariablesView.sys.mjs @@ -2596,10 +2596,8 @@ Variable.prototype = extend(Scope.prototype, { * * @param string aName * The variable's name. - * @param object aDescriptor - * The variable's descriptor. */ - _init(aName, aDescriptor) { + _init(aName) { this._idString = generateId((this._nameString = aName)); this._displayScope({ value: aName, targetClassName: this.targetClassName }); this._displayVariable(); @@ -3699,12 +3697,12 @@ VariablesView.stringifiers.byType = { return null; }, - symbol(aGrip, aOptions) { + symbol(aGrip) { const name = aGrip.name || ""; return "Symbol(" + name + ")"; }, - mapEntry(aGrip, { concise }) { + mapEntry(aGrip) { const { preview: { key, value }, } = aGrip; @@ -4416,13 +4414,13 @@ function EditableNameAndValue(aVariable, aOptions) { EditableNameAndValue.create = Editable.create; EditableNameAndValue.prototype = extend(EditableName.prototype, { - _reset(e) { + _reset() { // Hide the Variable or Property if the user presses escape. this._variable.remove(); this.deactivate(); }, - _next(e) { + _next() { // Override _next so as to set both key and value at the same time. const key = this._input.value; this.label.setAttribute("value", key); diff --git a/devtools/client/storage/test/browser_storage_cookies_sort.js b/devtools/client/storage/test/browser_storage_cookies_sort.js index 2b4316af53..7ed0feb0ad 100644 --- a/devtools/client/storage/test/browser_storage_cookies_sort.js +++ b/devtools/client/storage/test/browser_storage_cookies_sort.js @@ -53,7 +53,7 @@ function checkCells(expected) { const cells = [ ...gPanelWindow.document.querySelectorAll("#name .table-widget-cell"), ]; - cells.forEach(function (cell, i, arr) { + cells.forEach(function (cell, i) { // We use startsWith in order to avoid asserting the relative order of // "session" cookies when sorting on the "expires" column. ok( diff --git a/devtools/client/storage/test/browser_storage_indexeddb_hide_internal_dbs.js b/devtools/client/storage/test/browser_storage_indexeddb_hide_internal_dbs.js index 35906256b1..fab834ed52 100644 --- a/devtools/client/storage/test/browser_storage_indexeddb_hide_internal_dbs.js +++ b/devtools/client/storage/test/browser_storage_indexeddb_hide_internal_dbs.js @@ -35,6 +35,8 @@ add_task(async function () { const browserToolboxDoc = gToolbox.getCurrentPanel().panelWindow.document; const browserToolboxHosts = getDBHostsInTree(browserToolboxDoc); + // In the spawn task, we don't have access to Assert: + // eslint-disable-next-line mozilla/no-comparison-or-assignment-inside-ok ok(browserToolboxHosts.length > 1, "There are more than 1 indexedDB hosts"); ok( browserToolboxHosts.includes("about:devtools-toolbox"), diff --git a/devtools/client/storage/test/storage-empty-objectstores.html b/devtools/client/storage/test/storage-empty-objectstores.html index 4479fc0972..fc82d2f452 100644 --- a/devtools/client/storage/test/storage-empty-objectstores.html +++ b/devtools/client/storage/test/storage-empty-objectstores.html @@ -10,7 +10,7 @@ window.setup = async function () { let request = indexedDB.open("idb1", 1); const db = await new Promise((resolve, reject) => { - request.onerror = e => reject(Error("error opening db connection")); + request.onerror = () => reject(Error("error opening db connection")); request.onupgradeneeded = event => { const _db = event.target.result; const store1 = _db.createObjectStore("obj1", { keyPath: "id" }); @@ -38,7 +38,7 @@ window.setup = async function () { request = indexedDB.open("idb2", 1); const db2 = await new Promise((resolve, reject) => { - request.onerror = e => reject(Error("error opening db2 connection")); + request.onerror = () => reject(Error("error opening db2 connection")); request.onupgradeneeded = event => resolve(event.target.result); }); diff --git a/devtools/client/storage/test/storage-idb-delete-blocked.html b/devtools/client/storage/test/storage-idb-delete-blocked.html index 7c7b597421..bc61f5fe8d 100644 --- a/devtools/client/storage/test/storage-idb-delete-blocked.html +++ b/devtools/client/storage/test/storage-idb-delete-blocked.html @@ -14,7 +14,7 @@ window.setup = async function () { const request = indexedDB.open("idb", 1); request.onsuccess = e => resolve(e.target.result); - request.onerror = e => reject(new Error("error opening db connection")); + request.onerror = () => reject(new Error("error opening db connection")); }); dump("opened indexedDB\n"); @@ -29,7 +29,7 @@ window.deleteDb = async function () { const request = indexedDB.deleteDatabase("idb"); request.onsuccess = resolve; - request.onerror = e => reject(new Error("error deleting db")); + request.onerror = () => reject(new Error("error deleting db")); }); }; diff --git a/devtools/client/storage/test/storage-indexeddb-iframe.html b/devtools/client/storage/test/storage-indexeddb-iframe.html index 8cf0071bd0..4a76c85415 100644 --- a/devtools/client/storage/test/storage-indexeddb-iframe.html +++ b/devtools/client/storage/test/storage-indexeddb-iframe.html @@ -17,7 +17,7 @@ const DB_NAME = "db"; async function setup() { // eslint-disable-line no-unused-vars await new Promise((resolve, reject) => { const request = indexedDB.open(DB_NAME, 1); - request.onerror = event => reject(Error("Error opening DB")); + request.onerror = () => reject(Error("Error opening DB")); request.onupgradeneeded = event => { const db = event.target.result; const store = db.createObjectStore("store", { keyPath: "key" }); diff --git a/devtools/client/storage/test/storage-indexeddb-simple-alt.html b/devtools/client/storage/test/storage-indexeddb-simple-alt.html index 0c5e56f795..10a7d087bf 100644 --- a/devtools/client/storage/test/storage-indexeddb-simple-alt.html +++ b/devtools/client/storage/test/storage-indexeddb-simple-alt.html @@ -16,7 +16,7 @@ const DB_NAME = "db-alt"; async function setup() { // eslint-disable-line no-unused-vars await new Promise((resolve, reject) => { const request = indexedDB.open(DB_NAME, 1); - request.onerror = event => reject(Error("Error opening DB")); + request.onerror = () => reject(Error("Error opening DB")); request.onupgradeneeded = event => { const db = event.target.result; const store = db.createObjectStore("store", { keyPath: "key" }); diff --git a/devtools/client/storage/test/storage-indexeddb-simple.html b/devtools/client/storage/test/storage-indexeddb-simple.html index 9839240646..a670392fc1 100644 --- a/devtools/client/storage/test/storage-indexeddb-simple.html +++ b/devtools/client/storage/test/storage-indexeddb-simple.html @@ -16,7 +16,7 @@ const DB_NAME = "db"; async function setup() { // eslint-disable-line no-unused-vars await new Promise((resolve, reject) => { const request = indexedDB.open(DB_NAME, 1); - request.onerror = event => reject(Error("Error opening DB")); + request.onerror = () => reject(Error("Error opening DB")); request.onupgradeneeded = event => { const db = event.target.result; const store = db.createObjectStore("store", { keyPath: "key" }); diff --git a/devtools/client/storage/ui.js b/devtools/client/storage/ui.js index 095bb4730b..c68f44ee3d 100644 --- a/devtools/client/storage/ui.js +++ b/devtools/client/storage/ui.js @@ -403,7 +403,7 @@ class StorageUI { // We only need to listen to target destruction, but TargetCommand.watchTarget // requires a target available function... - async _onTargetAvailable({ targetFront }) {} + async _onTargetAvailable() {} _onTargetDestroyed({ targetFront }) { // Remove all storages related to this target @@ -1574,7 +1574,7 @@ class StorageUI { } } - onVariableViewPopupShowing(event) { + onVariableViewPopupShowing() { const item = this.view.getFocusedItem(); this._variableViewPopupCopy.setAttribute("disabled", !item); } diff --git a/devtools/client/styleeditor/StyleEditorUI.sys.mjs b/devtools/client/styleeditor/StyleEditorUI.sys.mjs index d48c50f556..e00a88c3ad 100644 --- a/devtools/client/styleeditor/StyleEditorUI.sys.mjs +++ b/devtools/client/styleeditor/StyleEditorUI.sys.mjs @@ -1576,7 +1576,7 @@ export class StyleEditorUI extends EventEmitter { // onAvailable is a mandatory argument for watchTargets, // but we don't do anything when a new target gets created. - #onTargetAvailable = ({ targetFront }) => {}; + #onTargetAvailable = () => {}; #onTargetDestroyed = ({ targetFront }) => { // Iterate over a copy of the list in order to prevent skipping diff --git a/devtools/client/styleeditor/StyleEditorUtil.sys.mjs b/devtools/client/styleeditor/StyleEditorUtil.sys.mjs index 739dc55fc5..11dae675d9 100644 --- a/devtools/client/styleeditor/StyleEditorUtil.sys.mjs +++ b/devtools/client/styleeditor/StyleEditorUtil.sys.mjs @@ -51,23 +51,6 @@ export function getString(name) { } /** - * Assert an expression is true or throw if false. - * - * @param expression - * @param message - * Optional message. - * @return expression - */ -export function assert(expression, message) { - if (!expression) { - const msg = message ? "ASSERTION FAILURE:" + message : "ASSERTION FAILURE"; - log(msg); - throw new Error(msg); - } - return expression; -} - -/** * Retrieve or set the text content of an element. * * @param DOMElement root @@ -94,18 +77,6 @@ export function text(root, selector, textContent) { } /** - * Log a message to the console. - * - * @param ...rest - * One or multiple arguments to log. - * If multiple arguments are given, they will be joined by " " - * in the log. - */ -export function log() { - console.logStringMessage(Array.prototype.slice.call(arguments).join(" ")); -} - -/** * Show file picker and return the file user selected. * * @param mixed file @@ -171,7 +142,7 @@ export function showFilePicker( fp.defaultString = suggestedFilename; } - fp.init(parentWindow, getString(key + ".title"), mode); + fp.init(parentWindow.browsingContext, getString(key + ".title"), mode); fp.appendFilter(getString(key + ".filter"), "*.css"); fp.appendFilters(fp.filterAll); fp.open(fpCallback); diff --git a/devtools/client/styleeditor/StyleSheetEditor.sys.mjs b/devtools/client/styleeditor/StyleSheetEditor.sys.mjs index d84854a0ae..bf43bf0268 100644 --- a/devtools/client/styleeditor/StyleSheetEditor.sys.mjs +++ b/devtools/client/styleeditor/StyleSheetEditor.sys.mjs @@ -274,7 +274,7 @@ StyleSheetEditor.prototype = { * * This will set |this._state.text| to the new text. */ - async _fetchSourceText(options = {}) { + async _fetchSourceText() { const styleSheetsFront = await this._getStyleSheetsFront(); let longStr = null; diff --git a/devtools/client/styleeditor/test/iframe_with_service_worker.html b/devtools/client/styleeditor/test/iframe_with_service_worker.html index 690515775e..b66e1e74a8 100644 --- a/devtools/client/styleeditor/test/iframe_with_service_worker.html +++ b/devtools/client/styleeditor/test/iframe_with_service_worker.html @@ -12,7 +12,7 @@ function waitForActive(swr) { resolve(swr); return; } - sw.addEventListener("statechange", function onStateChange(evt) { + sw.addEventListener("statechange", function onStateChange() { if (sw.state === "activated") { sw.removeEventListener("statechange", onStateChange); resolve(swr); diff --git a/devtools/client/themes/compatibility.css b/devtools/client/themes/compatibility.css index 0fd3c7f00d..98739ee81c 100644 --- a/devtools/client/themes/compatibility.css +++ b/devtools/client/themes/compatibility.css @@ -105,7 +105,7 @@ } .compatibility-issue-item--deprecated::before { - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); fill: var(--theme-icon-warning-color); } diff --git a/devtools/client/themes/dark-theme.css b/devtools/client/themes/dark-theme.css index 4dffefd9cf..8433bc75c4 100644 --- a/devtools/client/themes/dark-theme.css +++ b/devtools/client/themes/dark-theme.css @@ -35,7 +35,7 @@ body { .cm-s-mozilla .cm-link, .cm-editor .tok-link, .CodeMirror-Tern-type { - color: var(--grey-50); + color: var(--grey-45); } /* @@ -222,7 +222,8 @@ body { color: var(--theme-text-color-strong); } -.cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor { +.cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor, +.cm-editor .cm-cursor { border-left: solid 1px #fff; } .cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor.CodeMirror-secondarycursor { diff --git a/devtools/client/themes/images/alert-small.svg b/devtools/client/themes/images/alert-small.svg deleted file mode 100644 index 8b9102cae3..0000000000 --- a/devtools/client/themes/images/alert-small.svg +++ /dev/null @@ -1,6 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"> - <path fill="context-fill" d="M6 0a1 1 0 0 1 .89.54l5 9.6A1 1 0 0 1 11 11.6H1a1 1 0 0 1-.89-1.46l5-9.6A1 1 0 0 1 6 0zm-.25 8a.75.75 0 0 0-.75.75v.5c0 .41.34.75.75.75h.5c.41 0 .75-.34.75-.75v-.5A.75.75 0 0 0 6.25 8h-.5zM7 3.7a1 1 0 1 0-2 0v2.6a1 1 0 1 0 2 0V3.7z" /> -</svg> diff --git a/devtools/client/themes/images/info-small.svg b/devtools/client/themes/images/info-small.svg deleted file mode 100644 index df505d9f14..0000000000 --- a/devtools/client/themes/images/info-small.svg +++ /dev/null @@ -1,7 +0,0 @@ -<!-- This Source Code Form is subject to the terms of the Mozilla Public - - License, v. 2.0. If a copy of the MPL was not distributed with this - - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12"> - <path fill="context-fill" fill-opacity=".8" d="M6 1a5 5 0 1 0 0 10A5 5 0 0 0 6 1zM0 6a6 6 0 1 1 12 0A6 6 0 0 1 0 6z"/> - <path fill="context-fill" d="M7 3.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0zM5 6.5a1 1 0 0 1 2 0v1.75a1 1 0 0 1-2 0V6.5z"/> -</svg> diff --git a/devtools/client/themes/light-theme.css b/devtools/client/themes/light-theme.css index 2b38926bc3..d54bfffef3 100644 --- a/devtools/client/themes/light-theme.css +++ b/devtools/client/themes/light-theme.css @@ -213,7 +213,8 @@ body { color: var(--theme-body-color); } -.cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor:not(.CodeMirror-secondarycursor) { +.cm-s-mozilla .CodeMirror-lines .CodeMirror-cursor:not(.CodeMirror-secondarycursor), +.cm-editor .cm-cursor { border-left: solid 1px black; } diff --git a/devtools/client/themes/memory.css b/devtools/client/themes/memory.css index 23767acbcf..2e2ba71650 100644 --- a/devtools/client/themes/memory.css +++ b/devtools/client/themes/memory.css @@ -572,7 +572,7 @@ html, body, #app, #memory-tool { height: 12px; max-height: 12px; margin-inline-end: 5px; - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); background-repeat: no-repeat; background-size: contain; -moz-context-properties: fill; diff --git a/devtools/client/themes/rules.css b/devtools/client/themes/rules.css index 363556732d..72ca35fff7 100644 --- a/devtools/client/themes/rules.css +++ b/devtools/client/themes/rules.css @@ -486,12 +486,12 @@ } .ruleview-warning { - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); fill: var(--yellow-60); } .ruleview-unused-warning { - background-image: url(chrome://devtools/skin/images/info-small.svg); + background-image: url(resource://devtools-shared-images/info-small.svg); background-color: var(--theme-sidebar-background); fill: var(--theme-icon-dimmed-color); } @@ -872,7 +872,7 @@ -moz-context-properties: fill; /* Default warning icon */ - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); background-size: 10px; &.slow { diff --git a/devtools/client/themes/webconsole.css b/devtools/client/themes/webconsole.css index 5df6a6143f..91e3e04086 100644 --- a/devtools/client/themes/webconsole.css +++ b/devtools/client/themes/webconsole.css @@ -284,14 +284,9 @@ background-image: url(chrome://devtools/skin/images/webconsole/return.svg); } -.message.info > .icon { +.message:is(.info, .disabled) > .icon { color: var(--theme-icon-color); - background-image: url(chrome://devtools/skin/images/info-small.svg); -} - -.message.disabled > .icon { - color: var(--theme-icon-color); - background-image: url(chrome://devtools/skin/images/info-small.svg); + background-image: url(resource://devtools-shared-images/info-small.svg); } .message.error > .icon { @@ -301,7 +296,7 @@ .message.warn > .icon { color: var(--theme-icon-warning-color); - background-image: url(chrome://devtools/skin/images/alert-small.svg); + background-image: url(resource://devtools-shared-images/alert-small.svg); } .message.navigationMarker > .icon { @@ -804,15 +799,24 @@ a.learn-more-link.webconsole-learn-more-link { } /* Styles for JavaScript Tracer messages */ -.webconsole-app .jstracer-dom-event { +.webconsole-app :is( + .jstracer-dom-event, + .jstracer-dom-mutation, + .jstracer-implementation + ) { padding-inline: 4px; margin-inline: 2px; +} +.webconsole-app .jstracer-dom-event { background-color: var(--toolbarbutton-checked-background); color: var(--toolbarbutton-checked-color); } +.webconsole-app .jstracer-dom-mutation { + background-color: var(--toolbarbutton-checked-background); + color: var(--toolbarbutton-checked-color); + margin-inline-end: 4px; +} .webconsole-app .jstracer-implementation { - padding-inline: 4px; - margin-inline: 2px; background-color: var(--theme-toolbarbutton-checked-hover-background); color: var(--theme-toolbarbutton-checked-hover-color); } diff --git a/devtools/client/themes/widgets.css b/devtools/client/themes/widgets.css index 115d10aadd..8f454f557e 100644 --- a/devtools/client/themes/widgets.css +++ b/devtools/client/themes/widgets.css @@ -107,6 +107,10 @@ .variables-view-container { /* Hack: force hardware acceleration */ transform: translateZ(1px); + + & > scrollbox { + overflow: auto; + } } .variables-view-empty-notice { diff --git a/devtools/client/webconsole/actions/input.js b/devtools/client/webconsole/actions/input.js index f7dba1cbd8..f93d401346 100644 --- a/devtools/client/webconsole/actions/input.js +++ b/devtools/client/webconsole/actions/input.js @@ -83,7 +83,7 @@ async function getMappedExpression(hud, expression) { } function evaluateExpression(expression, from = "input") { - return async ({ dispatch, toolbox, webConsoleUI, hud, commands }) => { + return async ({ dispatch, webConsoleUI, hud, commands }) => { if (!expression) { expression = hud.getInputSelection() || hud.getInputValue(); } diff --git a/devtools/client/webconsole/components/FilterBar/FilterBar.js b/devtools/client/webconsole/components/FilterBar/FilterBar.js index fa9ab15e87..f1438f0f5b 100644 --- a/devtools/client/webconsole/components/FilterBar/FilterBar.js +++ b/devtools/client/webconsole/components/FilterBar/FilterBar.js @@ -105,7 +105,7 @@ class FilterBar extends Component { this.resizeObserver.observe(this.wrapperNode); } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps) { const { closeButtonVisible, displayMode, diff --git a/devtools/client/webconsole/components/Input/EagerEvaluation.js b/devtools/client/webconsole/components/Input/EagerEvaluation.js index 52d5467b45..7dd1053cd1 100644 --- a/devtools/client/webconsole/components/Input/EagerEvaluation.js +++ b/devtools/client/webconsole/components/Input/EagerEvaluation.js @@ -45,7 +45,7 @@ class EagerEvaluation extends Component { }; } - static getDerivedStateFromError(error) { + static getDerivedStateFromError() { return { hasError: true }; } diff --git a/devtools/client/webconsole/components/Input/JSTerm.js b/devtools/client/webconsole/components/Input/JSTerm.js index f00ddd66b0..6a5cbc31bb 100644 --- a/devtools/client/webconsole/components/Input/JSTerm.js +++ b/devtools/client/webconsole/components/Input/JSTerm.js @@ -758,7 +758,7 @@ class JSTerm extends Component { async _openFile() { const fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); fp.init( - this.webConsoleUI.document.defaultView, + this.webConsoleUI.document.defaultView.browsingContext, l10n.getStr("webconsole.input.openJavaScriptFile"), Ci.nsIFilePicker.modeOpen ); @@ -891,9 +891,8 @@ class JSTerm extends Component { * * @param {CodeMirror} cm: codeMirror instance * @param {String} key: The key that was handled - * @param {Event} e: The keypress event */ - _onEditorKeyHandled(cm, key, e) { + _onEditorKeyHandled(cm, key) { // The autocloseBracket addon handle closing brackets keys when they're typed, but // there's already an existing closing bracket. // ex: diff --git a/devtools/client/webconsole/components/Output/ConsoleOutput.js b/devtools/client/webconsole/components/Output/ConsoleOutput.js index a2469b3b46..b8ba82c5c6 100644 --- a/devtools/client/webconsole/components/Output/ConsoleOutput.js +++ b/devtools/client/webconsole/components/Output/ConsoleOutput.js @@ -84,7 +84,7 @@ class ConsoleOutput extends Component { this.ref = createRef(); this.lazyMessageListRef = createRef(); - this.resizeObserver = new ResizeObserver(entries => { + this.resizeObserver = new ResizeObserver(() => { // If we don't have the outputNode reference, or if the outputNode isn't connected // anymore, we disconnect the resize observer (componentWillUnmount is never called // on this component, so we have to do it here). @@ -141,7 +141,7 @@ class ConsoleOutput extends Component { } // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507 - UNSAFE_componentWillUpdate(nextProps, nextState) { + UNSAFE_componentWillUpdate(nextProps) { this.isUpdating = true; if (nextProps.cacheGeneration !== this.props.cacheGeneration) { this.messageIdsToKeepAlive = new Set(); @@ -356,7 +356,7 @@ class ConsoleOutput extends Component { } } -function mapStateToProps(state, props) { +function mapStateToProps(state) { const mutableMessages = getMutableMessagesById(state); return { initialized: state.ui.initialized, diff --git a/devtools/client/webconsole/components/Output/ConsoleTable.js b/devtools/client/webconsole/components/Output/ConsoleTable.js index f41afce96d..9f7780dfe5 100644 --- a/devtools/client/webconsole/components/Output/ConsoleTable.js +++ b/devtools/client/webconsole/components/Output/ConsoleTable.js @@ -71,7 +71,7 @@ class ConsoleTable extends Component { const { dispatch, serviceContainer, setExpanded } = this.props; const rows = []; - items.forEach((item, index) => { + items.forEach(item => { const cells = []; columns.forEach((value, key) => { diff --git a/devtools/client/webconsole/components/Output/GripMessageBody.js b/devtools/client/webconsole/components/Output/GripMessageBody.js index 6ecfe55b8e..a99c0ad547 100644 --- a/devtools/client/webconsole/components/Output/GripMessageBody.js +++ b/devtools/client/webconsole/components/Output/GripMessageBody.js @@ -81,7 +81,7 @@ function GripMessageBody(props) { maybeScrollToBottom, setExpanded, customFormat, - onCmdCtrlClick: (node, { depth, event, focused, expanded }) => { + onCmdCtrlClick: node => { const front = objectInspector.utils.node.getFront(node); if (front) { dispatch(actions.showObjectInSidebar(front)); diff --git a/devtools/client/webconsole/components/Output/LazyMessageList.js b/devtools/client/webconsole/components/Output/LazyMessageList.js index 931b5bb8bd..203efbded6 100644 --- a/devtools/client/webconsole/components/Output/LazyMessageList.js +++ b/devtools/client/webconsole/components/Output/LazyMessageList.js @@ -86,7 +86,7 @@ class LazyMessageList extends Component { } // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507 - UNSAFE_componentWillUpdate(nextProps, nextState) { + UNSAFE_componentWillUpdate(nextProps) { if (nextProps.cacheGeneration !== this.props.cacheGeneration) { this.#cachedHeights = []; this.#startIndex = 0; @@ -158,10 +158,6 @@ class LazyMessageList extends Component { #cachedHeights; #scrollHandlerBinding; - get #maxIndex() { - return this.props.items.length - 1; - } - get #overdrawHeight() { return this.props.scrollOverdrawCount * this.props.itemDefaultHeight; } @@ -269,7 +265,7 @@ class LazyMessageList extends Component { #addListeners() { const { viewportRef } = this.props; viewportRef.current.addEventListener("scroll", this.#scrollHandlerBinding); - this.#resizeObserver = new ResizeObserver(entries => { + this.#resizeObserver = new ResizeObserver(() => { this.#viewportHeight = viewportRef.current.parentNode.parentNode.clientHeight; this.forceUpdate(); diff --git a/devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js b/devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js index 893e6b04c6..089feff8a8 100644 --- a/devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js +++ b/devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js @@ -8,7 +8,7 @@ const dom = require("resource://devtools/client/shared/vendor/react-dom-factorie DefaultRenderer.displayName = "DefaultRenderer"; -function DefaultRenderer(props) { +function DefaultRenderer() { return dom.div({}, "This message type is not supported yet."); } diff --git a/devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js b/devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js index 7d6ddd2623..241fa15bd1 100644 --- a/devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js +++ b/devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js @@ -62,8 +62,27 @@ function JSTracerTrace(props) { relatedTraceId, // See tracer.jsm FRAME_EXIT_REASONS why, + + // Attributes specific to DOM Mutations + mutationType, + mutationElement, } = message; + let messageBodyConfig; + if (parameters || why || mutationType) { + messageBodyConfig = { + dispatch, + serviceContainer, + maybeScrollToBottom, + setExpanded, + type: "", + useQuotes: true, + + // Disable custom formatter for now in traces + customFormat: false, + }; + } + // When we are logging a DOM event, we have the `eventName` defined. let messageBody; if (eventName) { @@ -73,31 +92,27 @@ function JSTracerTrace(props) { dom.span({ className: "jstracer-io" }, "⟵ "), dom.span({ className: "jstracer-display-name" }, displayName), ]; - } else { + } else if (mutationType) { + messageBody = [ + dom.span( + { className: "jstracer-dom-mutation" }, + // Add an extra space at the end to have nice copy-paste messages + "— DOM Mutation | " + mutationType + " " + ), + formatRep(messageBodyConfig, mutationElement), + ]; + } else if (displayName) { messageBody = [ dom.span({ className: "jstracer-io" }, "⟶ "), dom.span({ className: "jstracer-implementation" }, implementation), // Add a space in order to improve copy paste rendering dom.span({ className: "jstracer-display-name" }, " " + displayName), ]; + } else { + messageBody = [dom.span({ className: "jstracer-io" }, "—")]; } - let messageBodyConfig; - if (parameters || why) { - messageBodyConfig = { - dispatch, - serviceContainer, - maybeScrollToBottom, - setExpanded, - type: "", - useQuotes: true, - - // Disable custom formatter for now in traces - customFormat: false, - }; - } // Arguments will only be passed on-demand - if (parameters) { messageBody.push("(", ...formatReps(messageBodyConfig, parameters), ")"); } @@ -105,9 +120,11 @@ function JSTracerTrace(props) { if (why) { messageBody.push( // Add a spaces in order to improve copy paste rendering - dom.span({ className: "jstracer-exit-frame-reason" }, " " + why + " "), - formatRep(messageBodyConfig, returnedValue) + dom.span({ className: "jstracer-exit-frame-reason" }, " " + why + " ") ); + if (returnedValue !== undefined) { + messageBody.push(formatRep(messageBodyConfig, returnedValue)); + } } if (prefix) { diff --git a/devtools/client/webconsole/components/SideBar.js b/devtools/client/webconsole/components/SideBar.js index e29d7dbbed..412bd8064f 100644 --- a/devtools/client/webconsole/components/SideBar.js +++ b/devtools/client/webconsole/components/SideBar.js @@ -119,7 +119,7 @@ class SideBar extends Component { } } -function mapStateToProps(state, props) { +function mapStateToProps(state) { return { front: state.ui.frontInSidebar, }; diff --git a/devtools/client/webconsole/reducers/history.js b/devtools/client/webconsole/reducers/history.js index adfca885c5..e147cdd83c 100644 --- a/devtools/client/webconsole/reducers/history.js +++ b/devtools/client/webconsole/reducers/history.js @@ -96,7 +96,7 @@ function appendToHistory(state, prefsState, expression) { return state; } -function clearHistory(state) { +function clearHistory() { return getInitialState(); } diff --git a/devtools/client/webconsole/test/browser/browser_jsterm_file_load_save_keyboard_shortcut.js b/devtools/client/webconsole/test/browser/browser_jsterm_file_load_save_keyboard_shortcut.js index 73e93b47f7..d0cfb7640b 100644 --- a/devtools/client/webconsole/test/browser/browser_jsterm_file_load_save_keyboard_shortcut.js +++ b/devtools/client/webconsole/test/browser/browser_jsterm_file_load_save_keyboard_shortcut.js @@ -20,7 +20,7 @@ add_task(async function () { // create file to import first info("Create the file to import"); const { MockFilePicker } = SpecialPowers; - MockFilePicker.init(window); + MockFilePicker.init(window.browsingContext); MockFilePicker.returnValue = MockFilePicker.returnOK; const file = await createLocalFile(); diff --git a/devtools/client/webconsole/test/browser/browser_jsterm_trace_command.js b/devtools/client/webconsole/test/browser/browser_jsterm_trace_command.js index 2bd1149a49..968e70d0d8 100644 --- a/devtools/client/webconsole/test/browser/browser_jsterm_trace_command.js +++ b/devtools/client/webconsole/test/browser/browser_jsterm_trace_command.js @@ -11,7 +11,7 @@ const TEST_URI = `data:text/html;charset=utf-8,<!DOCTYPE html> <div> <h1>Testing trace command</h1> <script> - function main() {} + function main() { return 42; } function someNoise() {} </script> </div> @@ -44,7 +44,7 @@ add_task(async function testBasicRecord() { // Instead a JSTRACER_STATE resource logs a console-api message. msg = await evaluateExpressionInConsole( hud, - ":trace --logMethod console --prefix foo --values --on-next-interaction", + ":trace --logMethod console --prefix foo --returns --values --on-next-interaction", "console-api" ); is( @@ -80,6 +80,11 @@ add_task(async function testBasicRecord() { 0, "The code running before the key press should not be traced" ); + await waitFor( + () => !!findTracerMessages(hud, `foo: ⟵ λ main return 42`).length, + + "Got the function returns being logged, with the returned value" + ); // But now that the tracer is active, we will be able to log this call to someNoise await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { @@ -106,7 +111,7 @@ add_task(async function testBasicRecord() { }); // Let some time for traces to appear - await wait(1000); + await wait(500); ok( !findTracerMessages(hud, `foo: ⟶ interpreter λ main("arg", 2)`).length, @@ -215,3 +220,145 @@ add_task(async function testLimitedRecord() { await waitFor(() => !!findTracerMessages(hud, `λ bar`).length); ok(true, "All traces were printed to console"); }); + +add_task(async function testDOMMutations() { + await pushPref("devtools.debugger.features.javascript-tracing", true); + + const testScript = `/* this will be line 1 */ + function add() { + const element = document.createElement("hr"); + document.body.appendChild(element); + } + function attributes() { + document.querySelector("hr").setAttribute("hidden", "true"); + } + function remove() { + document.querySelector("hr").remove(); + } + /* Fake a real file name for this inline script */ + //# sourceURL=fake.js + `; + const hud = await openNewTabAndConsole( + `data:text/html,test-page<script>${encodeURIComponent(testScript)}</script>` + ); + ok(hud, "web console opened"); + + let msg = await evaluateExpressionInConsole( + hud, + ":trace --dom-mutations foo", + "console-api" + ); + is( + msg.textContent.trim(), + ":trace --dom-mutations only accept a list of strings whose values can be: add,attributes,remove" + ); + + msg = await evaluateExpressionInConsole( + hud, + ":trace --dom-mutations 42", + "console-api" + ); + is( + msg.textContent.trim(), + ":trace --dom-mutations accept only no arguments, or a list mutation type strings (add,attributes,remove)" + ); + + info("Test toggling the tracer ON"); + // Pass `console-api` specific classname as the command results aren't logged as "result". + // Instead the frontend log a message as a console API message. + await evaluateExpressionInConsole( + hud, + ":trace --logMethod console --dom-mutations", + "console-api" + ); + + info("Trigger some code to add a DOM Element"); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + content.wrappedJSObject.add(); + }); + let traceNode = await waitFor( + () => findTracerMessages(hud, `DOM Mutation | add <hr>`)[0], + "Wait for the DOM Mutation trace for DOM element creation" + ); + is( + traceNode.querySelector(".message-location").textContent, + "fake.js:4:19", + "Add Mutation location is correct" + ); + + info("Trigger some code to modify attributes of a DOM Element"); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + content.wrappedJSObject.attributes(); + }); + traceNode = await waitFor( + () => + findTracerMessages( + hud, + `DOM Mutation | attributes <hr hidden="true">` + )[0], + "Wait for the DOM Mutation trace for DOM attributes modification" + ); + is( + traceNode.querySelector(".message-location").textContent, + "fake.js:7:34", + "Attributes Mutation location is correct" + ); + + info("Trigger some code to remove a DOM Element"); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + content.wrappedJSObject.remove(); + }); + traceNode = await waitFor( + () => + findTracerMessages(hud, `DOM Mutation | remove <hr hidden="true">`)[0], + "Wait for the DOM Mutation trace for DOM Element removal" + ); + is( + traceNode.querySelector(".message-location").textContent, + "fake.js:10:34", + "Remove Mutation location is correct" + ); + + info("Stop tracing all mutations"); + await evaluateExpressionInConsole(hud, ":trace", "console-api"); + + info("Clear past traces"); + hud.ui.clearOutput(); + await waitFor( + () => !findTracerMessages(hud, `remove(<hr hidden="true">)`).length + ); + ok("Console was cleared"); + + info("Re-enable the tracing, but only with a subset of mutations"); + await evaluateExpressionInConsole( + hud, + ":trace --logMethod console --dom-mutations attributes,remove", + "console-api" + ); + + info("Trigger all types of mutations"); + await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + const element = content.document.createElement("hr"); + content.document.body.appendChild(element); + element.setAttribute("hidden", "true"); + element.remove(); + }); + await waitFor( + () => + !!findTracerMessages(hud, `DOM Mutation | attributes <hr hidden="true">`) + .length, + "Wait for the DOM Mutation trace for DOM attributes modification" + ); + + await waitFor( + () => + !!findTracerMessages(hud, `DOM Mutation | remove <hr hidden="true">`) + .length, + "Wait for the DOM Mutation trace for DOM Element removal" + ); + is( + findTracerMessages(hud, `add <hr`).length, + 0, + "DOM Element creation isn't traced" + ); +}); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_context_menu_export_console_output.js b/devtools/client/webconsole/test/browser/browser_webconsole_context_menu_export_console_output.js index a119f4c06c..757b4a5ae7 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_context_menu_export_console_output.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_context_menu_export_console_output.js @@ -39,7 +39,7 @@ httpServer.registerPathHandler("/test.js", function (request, response) { const TEST_URI = `http://localhost:${httpServer.identity.primaryPort}/`; const { MockFilePicker } = SpecialPowers; -MockFilePicker.init(window); +MockFilePicker.init(window.browsingContext); MockFilePicker.returnValue = MockFilePicker.returnOK; var FileUtils = ChromeUtils.importESModule( diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_cors_errors.js b/devtools/client/webconsole/test/browser/browser_webconsole_cors_errors.js index af2f04cc90..b29da33bab 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_cors_errors.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_cors_errors.js @@ -18,7 +18,7 @@ const BASE_CORS_ERROR_URL_PARAMS = new URLSearchParams({ registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_csp_too_many_reports.js b/devtools/client/webconsole/test/browser/browser_webconsole_csp_too_many_reports.js index 41e98a2a42..76ab1b22e6 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_csp_too_many_reports.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_csp_too_many_reports.js @@ -13,11 +13,18 @@ const TEST_URI = const TEST_VIOLATIONS = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-many-errors.html"; -const CSP_VIOLATION_MSG = - "Content-Security-Policy: The page\u2019s settings blocked the loading of a resource " + - "at inline (\u201cstyle-src\u201d)."; -const CSP_TOO_MANY_REPORTS_MSG = - "Content-Security-Policy: Prevented too many CSP reports from being sent within a short period of time."; + +const bundle = Services.strings.createBundle( + "chrome://global/locale/security/csp.properties" +); +const CSP_VIOLATION_MSG = bundle.formatStringFromName( + "CSPInlineStyleViolation", + ["style-src 'none'", "style-src-attr"] +); +const CSP_TOO_MANY_REPORTS_MSG = bundle.formatStringFromName( + "tooManyReports", + [] +); add_task(async function () { // Reduce the limit to reduce the log spam. diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_csp_violation.js b/devtools/client/webconsole/test/browser/browser_webconsole_csp_violation.js index ebaca341b3..04dcb313fc 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_csp_violation.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_csp_violation.js @@ -7,6 +7,10 @@ "use strict"; add_task(async function () { + const bundle = Services.strings.createBundle( + "chrome://global/locale/security/csp.properties" + ); + const TEST_URI = "data:text/html;charset=utf8,<!DOCTYPE html>Web Console CSP violation test"; const hud = await openNewTabAndConsole(TEST_URI); @@ -15,10 +19,14 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation.html"; - const CSP_VIOLATION_MSG = - "Content-Security-Policy: The page\u2019s settings " + - "blocked the loading of a resource at " + - "http://some.example.com/test.png (\u201cimg-src\u201d)."; + const CSP_VIOLATION_MSG = bundle.formatStringFromName( + "CSPGenericViolation", + [ + "img-src https://example.com", + "http://some.example.com/test.png", + "img-src", + ] + ); const onRepeatedMessage = waitForRepeatedMessageByType( hud, CSP_VIOLATION_MSG, @@ -35,9 +43,10 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation-inline.html"; - const CSP_VIOLATION = - `Content-Security-Policy: The page’s settings blocked` + - ` the loading of a resource at inline (“style-src”).`; + const CSP_VIOLATION = bundle.formatStringFromName( + "CSPInlineStyleViolation", + ["style-src 'self'", "style-src-elem"] + ); const VIOLATION_LOCATION_HTML = "test-csp-violation-inline.html:18:1"; const VIOLATION_LOCATION_JS = "test-csp-violation-inline.html:14:25"; await navigateTo(TEST_VIOLATION); @@ -71,7 +80,11 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation-base-uri.html"; - const CSP_VIOLATION = `Content-Security-Policy: The page’s settings blocked the loading of a resource at https://evil.com/ (“base-uri”).`; + const CSP_VIOLATION = bundle.formatStringFromName("CSPGenericViolation", [ + "base-uri 'self'", + "https://evil.com/", + "base-uri", + ]); const VIOLATION_LOCATION = "test-csp-violation-base-uri.html:15:25"; await navigateTo(TEST_VIOLATION); let msg = await waitFor(() => findErrorMessage(hud, CSP_VIOLATION)); @@ -97,7 +110,11 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation-form-action.html"; - const CSP_VIOLATION = `Content-Security-Policy: The page’s settings blocked the loading of a resource at https://evil.com/evil.com (“form-action”).`; + const CSP_VIOLATION = bundle.formatStringFromName("CSPGenericViolation", [ + "form-action 'self'", + "https://evil.com/evil.com", + "form-action", + ]); const VIOLATION_LOCATION = "test-csp-violation-form-action.html:14:40"; await navigateTo(TEST_VIOLATION); @@ -116,9 +133,11 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation-frame-ancestor-parent.html"; - const CSP_VIOLATION = - `Content-Security-Policy: The page’s settings blocked` + - ` the loading of a resource at ${TEST_VIOLATION} (“frame-ancestors”).`; + const CSP_VIOLATION = bundle.formatStringFromName("CSPGenericViolation", [ + "frame-ancestors 'none'", + TEST_VIOLATION, + "frame-ancestors", + ]); await navigateTo(TEST_VIOLATION); const msg = await waitFor(() => findErrorMessage(hud, CSP_VIOLATION)); ok(msg, "Frame-Ancestors violation by html was printed"); @@ -129,8 +148,11 @@ add_task(async function () { const TEST_VIOLATION = "https://example.com/browser/devtools/client/webconsole/" + "test/browser/test-csp-violation-event-handler.html"; - const CSP_VIOLATION = `Content-Security-Policy: The page’s settings blocked the loading of a resource at inline (“script-src”). -Source: document.body.textContent = 'JavaScript …`; + const CSP_VIOLATION = + bundle.formatStringFromName("CSPEventHandlerScriptViolation", [ + "script-src 'self'", + "script-src-attr", + ]) + `\nSource: document.body.textContent = 'JavaScript …`; // Future-Todo: Include line and column number. const VIOLATION_LOCATION = "test-csp-violation-event-handler.html"; await navigateTo(TEST_VIOLATION); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_cspro.js b/devtools/client/webconsole/test/browser/browser_webconsole_cspro.js index 328663ce28..91555cbb8e 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_cspro.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_cspro.js @@ -21,13 +21,20 @@ const TEST_URI = const TEST_VIOLATION = "http://example.com/browser/devtools/client/webconsole/" + "test/browser/test-cspro.html"; -const CSP_VIOLATION_MSG = - "Content-Security-Policy: The page\u2019s settings blocked the loading of a resource " + - "at http://some.example.com/cspro.png (\u201cimg-src\u201d)."; -const CSP_REPORT_MSG = - "Content-Security-Policy: The page\u2019s settings observed the loading of a " + - "resource at http://some.example.com/cspro.js " + - "(\u201cscript-src\u201d). A CSP report is being sent."; + +const bundle = Services.strings.createBundle( + "chrome://global/locale/security/csp.properties" +); +const CSP_VIOLATION_MSG = bundle.formatStringFromName("CSPGenericViolation", [ + "img-src 'self'", + "http://some.example.com/cspro.png", + "img-src", +]); +const CSP_REPORT_MSG = bundle.formatStringFromName("CSPROScriptViolation", [ + "script-src 'self'", + "http://some.example.com/cspro.js", + "script-src-elem", +]); add_task(async function () { const hud = await openNewTabAndConsole(TEST_URI); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_message_categories.js b/devtools/client/webconsole/test/browser/browser_webconsole_message_categories.js index 248da4533b..d2de322d11 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_message_categories.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_message_categories.js @@ -114,7 +114,7 @@ add_task(async function () { } await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_attach.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_attach.js index 9993423518..9dc6414222 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_attach.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_attach.js @@ -10,7 +10,7 @@ const TEST_URI = TEST_PATH + TEST_FILE; registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_message_close_on_escape.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_message_close_on_escape.js index e5549a686e..77f1f0dca9 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_message_close_on_escape.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_message_close_on_escape.js @@ -10,7 +10,7 @@ const TEST_URI = TEST_PATH + TEST_FILE; registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_after_target_switching.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_after_target_switching.js index d5833e06f8..ac2eb3b925 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_after_target_switching.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_after_target_switching.js @@ -17,7 +17,7 @@ pushPref("devtools.webconsole.filter.netxhr", true); registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_expand.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_expand.js index 96da695208..14b32bd8a8 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_expand.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_expand.js @@ -13,7 +13,7 @@ requestLongerTimeout(2); registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_openinnet.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_openinnet.js index 8a92ef07dc..d9ca0954a4 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_openinnet.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_openinnet.js @@ -23,7 +23,7 @@ registerCleanupFunction(async () => { Services.prefs.clearUserPref(XHR_PREF); await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_resend_request.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_resend_request.js index 900e3bfc34..6743ea3fad 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_resend_request.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_resend_request.js @@ -13,7 +13,7 @@ const TEST_PATH = registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_stacktrace_console_initiated_request.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_stacktrace_console_initiated_request.js index 0326b24f98..5fde57566b 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_stacktrace_console_initiated_request.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_stacktrace_console_initiated_request.js @@ -12,7 +12,7 @@ pushPref("devtools.webconsole.filter.netxhr", true); registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_status_code.js b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_status_code.js index 9d59a3fe63..240a5df67f 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_status_code.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_network_messages_status_code.js @@ -21,7 +21,7 @@ pushPref(XHR_PREF, true); registerCleanupFunction(async function () { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); @@ -65,7 +65,7 @@ add_task(async function task() { await hideContextMenu(hud); await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_array_getters.js b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_array_getters.js index 0a801de5eb..40081ef309 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_array_getters.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_array_getters.js @@ -16,11 +16,11 @@ add_task(async function () { get: () => "elem0", }); Object.defineProperty(array, 1, { - set: x => {}, + set: () => {}, }); Object.defineProperty(array, 2, { get: () => "elem2", - set: x => {}, + set: () => {}, }); content.wrappedJSObject.console.log("oi-array-test", array); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_entries.js b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_entries.js index 16f1261862..909d66cecb 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_entries.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_entries.js @@ -18,6 +18,8 @@ add_task(async function () { await pushPref("media.navigator.permission.disabled", true); // enable custom highlight API await pushPref("dom.customHighlightAPI.enabled", true); + // enable custom state + await pushPref("dom.element.customstateset.enabled", true); const hud = await openNewTabAndConsole(TEST_URI); @@ -40,6 +42,16 @@ add_task(async function () { content.CSS.highlights.set("glow", new content.Highlight()); content.CSS.highlights.set("anchor", new content.Highlight()); + content.customElements.define( + "fx-test", + class extends content.HTMLElement {} + ); + const { states } = content.document + .createElement("fx-test") + .attachInternals(); + states.add("custom-state"); + states.add("another-custom-state"); + content.wrappedJSObject.console.log( "oi-entries-test", new Map( @@ -70,7 +82,8 @@ add_task(async function () { formData, midiAccess.inputs, midiAccess.outputs, - content.CSS.highlights + content.CSS.highlights, + states ); return { @@ -98,7 +111,7 @@ add_task(async function () { const objectInspectors = [...node.querySelectorAll(".tree")]; is( objectInspectors.length, - 12, + 13, "There is the expected number of object inspectors" ); @@ -115,6 +128,7 @@ add_task(async function () { midiInputsOi, midiOutputsOi, highlightsRegistryOi, + customStateSetOi, ] = objectInspectors; await testSmallMap(smallMapOi); @@ -129,6 +143,7 @@ add_task(async function () { await testMidiInputs(midiInputsOi, taskResult.midi.inputs); await testMidiOutputs(midiOutputsOi, taskResult.midi.outputs); await testHighlightsRegistry(highlightsRegistryOi); + await testCustomStateSet(customStateSetOi); }); async function testSmallMap(oi) { @@ -829,3 +844,51 @@ async function testHighlightsRegistry(oi) { `Got expected prototype property` ); } + +async function testCustomStateSet(oi) { + info("Expanding the CustomStateSet"); + let onCustomStateSetOiMutation = waitForNodeMutation(oi, { + childList: true, + }); + + oi.querySelector(".arrow").click(); + await onCustomStateSetOiMutation; + + ok( + oi.querySelector(".arrow").classList.contains("expanded"), + "The arrow of the node has the expected class after clicking on it" + ); + + let oiNodes = oi.querySelectorAll(".node"); + // There are 4 nodes: the root, size, entries and the proto. + is(oiNodes.length, 4, "There is the expected number of nodes in the tree"); + + info("Expanding the <entries> leaf of the map"); + const entriesNode = oiNodes[2]; + is( + entriesNode.textContent, + "<entries>", + "There is the expected <entries> node" + ); + onCustomStateSetOiMutation = waitForNodeMutation(oi, { + childList: true, + }); + + entriesNode.querySelector(".arrow").click(); + await onCustomStateSetOiMutation; + + oiNodes = oi.querySelectorAll(".node"); + // There are now 6 nodes, the 4 original ones, and the 2 entries. + is(oiNodes.length, 6, "There is the expected number of nodes in the tree"); + + is( + oiNodes[3].textContent, + `0: "custom-state"`, + `Got expected first entry item` + ); + is( + oiNodes[4].textContent, + `1: "another-custom-state"`, + `Got expected second entry item` + ); +} diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_private_properties.js b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_private_properties.js index d70483a0f3..92187d000e 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_private_properties.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_object_inspector_private_properties.js @@ -30,9 +30,11 @@ add_task(async function () { } #privateProperty; + // eslint-disable-next-line no-unused-private-class-members #privateMethod() { return Math.random(); } + // eslint-disable-next-line no-unused-private-class-members get #privateGetter() { return 42; } diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_from_netmonitor.js b/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_from_netmonitor.js index 8d9a6f8ff8..1788c0c035 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_from_netmonitor.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_from_netmonitor.js @@ -20,7 +20,7 @@ registerCleanupFunction(async () => { Services.prefs.clearUserPref(NET_PREF); await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_in_netmonitor.js b/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_in_netmonitor.js index 09c61bc007..552ea39d75 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_in_netmonitor.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_shows_reqs_in_netmonitor.js @@ -19,7 +19,7 @@ registerCleanupFunction(async () => { Services.prefs.clearUserPref(NET_PREF); await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_filters_changed.js b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_filters_changed.js index 95ff2e8e51..eb8d4eeceb 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_filters_changed.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_filters_changed.js @@ -57,7 +57,11 @@ function checkTelemetryEvent(expectedEvent) { const events = getFiltersChangedEventsExtra(); is(events.length, 1, "There was only 1 event logged"); const [event] = events; - ok(event.session_id > 0, "There is a valid session_id in the logged event"); + Assert.greater( + Number(event.session_id), + 0, + "There is a valid session_id in the logged event" + ); const f = e => JSON.stringify(e, null, 2); is( f(event), diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_jump_to_definition.js b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_jump_to_definition.js index 07a1d575f5..2b722947c8 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_jump_to_definition.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_jump_to_definition.js @@ -32,7 +32,11 @@ add_task(async function () { const events = getJumpToDefinitionEventsExtra(); is(events.length, 1, "There was 1 event logged"); const [event] = events; - ok(event.session_id > 0, "There is a valid session_id in the logged event"); + Assert.greater( + Number(event.session_id), + 0, + "There is a valid session_id in the logged event" + ); }); function getJumpToDefinitionEventsExtra() { diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_object_expanded.js b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_object_expanded.js index 6dc6149295..c671d7cd63 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_object_expanded.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_object_expanded.js @@ -35,7 +35,11 @@ add_task(async function () { let events = getObjectExpandedEventsExtra(); is(events.length, 1, "There was 1 event logged"); const [event] = events; - ok(event.session_id > 0, "There is a valid session_id in the logged event"); + Assert.greater( + Number(event.session_id), + 0, + "There is a valid session_id in the logged event" + ); info("Click on the second arrow icon to expand the prototype node"); const secondArrowIcon = message.querySelectorAll(".arrow")[1]; diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_reverse_search.js b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_reverse_search.js index b801f3b898..8177ff3ffa 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_reverse_search.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_telemetry_reverse_search.js @@ -166,6 +166,6 @@ function checkEventTelemetry(expectedData) { expected.extra.functionality, "'functionality' is correct" ); - ok(extra.session_id > 0, "'session_id' is correct"); + Assert.greater(Number(extra.session_id), 0, "'session_id' is correct"); } } diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_trackingprotection_errors.js b/devtools/client/webconsole/test/browser/browser_webconsole_trackingprotection_errors.js index c2d91fcb3b..e9a056ea65 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_trackingprotection_errors.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_trackingprotection_errors.js @@ -45,7 +45,7 @@ registerCleanupFunction(async function () { UrlClassifierTestUtils.cleanupTestTrackers(); await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_content_blocking.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_content_blocking.js index dbe5b508d1..849dcd394f 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_content_blocking.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_content_blocking.js @@ -44,7 +44,7 @@ pushPref("devtools.webconsole.groupWarningMessages", true); async function cleanUp() { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_cookies.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_cookies.js index bc611efde1..55a2e0945c 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_cookies.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_cookies.js @@ -13,7 +13,7 @@ pushPref("devtools.webconsole.groupWarningMessages", true); async function cleanUp() { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_storage_isolation.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_storage_isolation.js index 86276b5567..91e3c3e231 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_storage_isolation.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_group_storage_isolation.js @@ -26,7 +26,7 @@ pushPref("devtools.webconsole.groupWarningMessages", true); async function cleanUp() { await new Promise(resolve => { - Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, value => + Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_ALL, () => resolve() ); }); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_filtering.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_filtering.js index b85f35e809..38ec73c4bd 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_filtering.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_filtering.js @@ -299,7 +299,7 @@ let cpt = 0; * tagged as tracker. The image is loaded with a incremented counter query parameter * each time so we can get the warning message. */ -function emitContentBlockedMessage(hud) { +function emitContentBlockedMessage() { const url = `${BLOCKED_URL}?${++cpt}`; SpecialPowers.spawn(gBrowser.selectedBrowser, [url], function (innerURL) { content.wrappedJSObject.loadImage(innerURL); diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_toggle.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_toggle.js index 54e3d884e3..e0d0311b4f 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_toggle.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups_toggle.js @@ -238,7 +238,7 @@ let cpt = 0; * tagged as tracker. The image is loaded with a incremented counter query parameter * each time so we can get the warning message. */ -function emitContentBlockedMessage(hud) { +function emitContentBlockedMessage() { const url = `${BLOCKED_URL}?${++cpt}`; SpecialPowers.spawn(gBrowser.selectedBrowser, [url], function (innerURL) { content.wrappedJSObject.loadImage(innerURL); diff --git a/devtools/client/webconsole/test/browser/test-console-custom-formatters-errors.html b/devtools/client/webconsole/test/browser/test-console-custom-formatters-errors.html index a186bb338a..450672e78e 100644 --- a/devtools/client/webconsole/test/browser/test-console-custom-formatters-errors.html +++ b/devtools/client/webconsole/test/browser/test-console-custom-formatters-errors.html @@ -141,7 +141,7 @@ } return null; }, - hasBody: (obj) => false + hasBody: () => false }, { header: (obj) => { @@ -150,7 +150,7 @@ } return null; }, - hasBody: (obj) => true, + hasBody: () => true, body: (obj) => ["span", {"style": "font-family: serif; font-size: 2rem;"}, obj.customFormatHeaderAndBody] }, { diff --git a/devtools/client/webconsole/test/browser/test-console-custom-formatters.html b/devtools/client/webconsole/test/browser/test-console-custom-formatters.html index 68fcda8ad2..53dc09a256 100644 --- a/devtools/client/webconsole/test/browser/test-console-custom-formatters.html +++ b/devtools/client/webconsole/test/browser/test-console-custom-formatters.html @@ -33,7 +33,7 @@ } return null; }, - hasBody: obj => false + hasBody: () => false }, { header: obj => { @@ -42,7 +42,7 @@ } return null; }, - hasBody: obj => true, + hasBody: () => true, body: obj => ["span", {"style": "font-family: serif; font-size: 2rem;"}, obj.customFormatHeaderAndBody] }, { @@ -108,7 +108,7 @@ ]} }, { - header: (obj, config) => { + header: (obj) => { if (obj === proxy) { return [ "span", @@ -118,7 +118,7 @@ } return null; }, - hasBody: obj => false + hasBody: () => false }, ]; diff --git a/devtools/client/webconsole/test/browser/test-console-evaluation-context-selector-child.html b/devtools/client/webconsole/test/browser/test-console-evaluation-context-selector-child.html index 88c42868e0..50f048e477 100644 --- a/devtools/client/webconsole/test/browser/test-console-evaluation-context-selector-child.html +++ b/devtools/client/webconsole/test/browser/test-console-evaluation-context-selector-child.html @@ -12,7 +12,7 @@ var id = new URLSearchParams(document.location.search).get("id"); document.querySelector("h2").id = id; document.title = `${id}|${document.location.host}`; - document.addEventListener("click", function(e) { + document.addEventListener("click", function() { // eslint-disable-next-line no-unused-vars const localVar = document; // eslint-disable-next-line no-debugger diff --git a/devtools/client/webconsole/test/browser/test-error-worker2.js b/devtools/client/webconsole/test/browser/test-error-worker2.js index 61fe07c3c4..0c038d916b 100644 --- a/devtools/client/webconsole/test/browser/test-error-worker2.js +++ b/devtools/client/webconsole/test/browser/test-error-worker2.js @@ -2,6 +2,6 @@ self.addEventListener("message", ({ data }) => foo(data)); -function foo(data) { +function foo() { throw new Error("worker2"); } diff --git a/devtools/client/webconsole/test/browser/test-eval-error.html b/devtools/client/webconsole/test/browser/test-eval-error.html index ecc0fbb8cc..8f16a0320c 100644 --- a/devtools/client/webconsole/test/browser/test-eval-error.html +++ b/devtools/client/webconsole/test/browser/test-eval-error.html @@ -2,7 +2,7 @@ /* eslint-disable no-unused-vars */ "use strict"; -function throwErrorObject(value) { +function throwErrorObject() { throw new Error("ThrowErrorObject"); } diff --git a/devtools/client/webconsole/test/browser/test-evaluate-worker.js b/devtools/client/webconsole/test/browser/test-evaluate-worker.js index 7d3ca22979..a98a81b7e7 100644 --- a/devtools/client/webconsole/test/browser/test-evaluate-worker.js +++ b/devtools/client/webconsole/test/browser/test-evaluate-worker.js @@ -2,6 +2,8 @@ self.addEventListener("message", ({ data }) => foo(data)); +// This paramater is accessed by the debugger +// eslint-disable-next-line no-unused-vars function foo(data) { // eslint-disable-next-line no-debugger debugger; diff --git a/devtools/client/webconsole/test/node/components/webconsole-wrapper.test.js b/devtools/client/webconsole/test/node/components/webconsole-wrapper.test.js index 1ea44b7388..eacd6bc9b6 100644 --- a/devtools/client/webconsole/test/node/components/webconsole-wrapper.test.js +++ b/devtools/client/webconsole/test/node/components/webconsole-wrapper.test.js @@ -27,7 +27,7 @@ async function getWebConsoleWrapper() { getMappedExpression: () => {}, commands: { objectCommand: { - releaseObjects: async frontsToRelease => {}, + releaseObjects: async () => {}, }, }, }; diff --git a/devtools/client/webconsole/test/node/helpers.js b/devtools/client/webconsole/test/node/helpers.js index d50a0a64ed..b9d8aa9c14 100644 --- a/devtools/client/webconsole/test/node/helpers.js +++ b/devtools/client/webconsole/test/node/helpers.js @@ -143,16 +143,12 @@ function getWebConsoleUiMock(hud) { emit: () => {}, emitForTests: () => {}, hud: { - // @backward-compat { version 123 } A new Objects Manager front has a new "releaseActors" method. - // Once 123 is release, supportsReleaseActors could be removed. commands: { client: { - mainRoot: { - supportsReleaseActors: true, - }, + mainRoot: {}, }, objectCommand: { - releaseObjects: async frontsToRelease => {}, + releaseObjects: async () => {}, }, }, ...hud, diff --git a/devtools/client/webconsole/test/node/store/private-messages.test.js b/devtools/client/webconsole/test/node/store/private-messages.test.js index f040770436..e8f575c4f1 100644 --- a/devtools/client/webconsole/test/node/store/private-messages.test.js +++ b/devtools/client/webconsole/test/node/store/private-messages.test.js @@ -207,9 +207,7 @@ describe("private messages", () => { webConsoleUI: getWebConsoleUiMock({ commands: { client: { - mainRoot: { - supportsReleaseActors: true, - }, + mainRoot: {}, }, objectCommand: { releaseObjects: async frontsToRelease => { diff --git a/devtools/client/webconsole/test/node/store/release-actors.test.js b/devtools/client/webconsole/test/node/store/release-actors.test.js index 28339653b7..a449d390ba 100644 --- a/devtools/client/webconsole/test/node/store/release-actors.test.js +++ b/devtools/client/webconsole/test/node/store/release-actors.test.js @@ -31,9 +31,7 @@ describe("Release actor enhancer:", () => { webConsoleUI: getWebConsoleUiMock({ commands: { client: { - mainRoot: { - supportsReleaseActors: true, - }, + mainRoot: {}, }, objectCommand: { releaseObjects: async frontsToRelease => { @@ -85,9 +83,7 @@ describe("Release actor enhancer:", () => { webConsoleUI: getWebConsoleUiMock({ commands: { client: { - mainRoot: { - supportsReleaseActors: true, - }, + mainRoot: {}, }, objectCommand: { releaseObjects: async frontsToRelease => { @@ -146,9 +142,7 @@ describe("Release actor enhancer:", () => { webConsoleUI: getWebConsoleUiMock({ commands: { client: { - mainRoot: { - supportsReleaseActors: true, - }, + mainRoot: {}, }, objectCommand: { releaseObjects: async frontsToRelease => { diff --git a/devtools/client/webconsole/utils/messages.js b/devtools/client/webconsole/utils/messages.js index 135da20536..5f10046a71 100644 --- a/devtools/client/webconsole/utils/messages.js +++ b/devtools/client/webconsole/utils/messages.js @@ -386,9 +386,11 @@ function transformTraceResource(traceResource) { args, sourceId, - returnedValue, relatedTraceId, why, + + mutationType, + mutationElement, } = traceResource; const frame = { @@ -408,14 +410,19 @@ function transformTraceResource(traceResource) { parameters: args ? args.map(p => (p ? getAdHocFrontOrPrimitiveGrip(p, targetFront) : p)) : null, - returnedValue: why - ? getAdHocFrontOrPrimitiveGrip(returnedValue, targetFront) - : null, + returnedValue: + why && "returnedValue" in traceResource + ? getAdHocFrontOrPrimitiveGrip(traceResource.returnedValue, targetFront) + : undefined, relatedTraceId, why, messageText: null, timeStamp, prefix, + mutationType, + mutationElement: mutationElement + ? getAdHocFrontOrPrimitiveGrip(mutationElement, targetFront) + : null, // Allow the identical frames to be coallesced into a unique message // with a repeatition counter so that we keep the output short in case of loops. allowRepeating: true, @@ -558,7 +565,9 @@ function areMessagesSimilar(message1, message2) { message1.isPromiseRejection !== message2.isPromiseRejection || message1.userProvidedStyles?.length !== message2.userProvidedStyles?.length || - `${message1.userProvidedStyles}` !== `${message2.userProvidedStyles}` + `${message1.userProvidedStyles}` !== `${message2.userProvidedStyles}` || + message1.mutationType !== message2.mutationType || + message1.mutationElement != message2.mutationElement ) { return false; } diff --git a/devtools/client/webconsole/webconsole-ui.js b/devtools/client/webconsole/webconsole-ui.js index 7dfa44a402..a12f1f3983 100644 --- a/devtools/client/webconsole/webconsole-ui.js +++ b/devtools/client/webconsole/webconsole-ui.js @@ -535,12 +535,8 @@ class WebConsoleUI { * i.e. it was already existing or has just been created. * * @private - * @param Front targetFront - * The Front of the target that is available. - * This Front inherits from TargetMixin and is typically - * composed of a WindowGlobalTargetFront or ContentProcessTargetFront. */ - async _onTargetAvailable({ targetFront }) { + async _onTargetAvailable() { // onTargetAvailable is a mandatory argument for watchTargets, // we still define it solely for being able to use onTargetDestroyed. } @@ -687,7 +683,7 @@ class WebConsoleUI { this.hud.commands.targetCommand.reloadTopLevelTarget(); }); } else if (Services.prefs.getBoolPref(PREF_SIDEBAR_ENABLED)) { - shortcuts.on("Esc", event => { + shortcuts.on("Esc", () => { this.wrapper.dispatchSidebarClose(); if (this.jsterm) { this.jsterm.focus(); |