]> git.proxmox.com Git - pve-xtermjs.git/commitdiff
split upstream and our native into different source packages
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 4 Oct 2023 12:57:46 +0000 (14:57 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 17 Oct 2023 08:49:54 +0000 (10:49 +0200)
We should have never added a upstream repackage and some custom tools
in the same source package, let alone binary package. Finally resolve
that tech debt and do a split.

This commit does a bit more than I'd like at once, but it's really not
trivial to make a clean split while keeping all sanely buildable in
multiple commits.

What roughly happens is:
- two complete separate source packages
  - one for xterm.js, we keep this purely to the xterm.js and our
    local additions and modifications that are relevant directly to
    xterm.js itself
  - one for termproxy, where only the rust-based tool is shipped.
    This also reduces churn, as the termproxy doesn't sees lots of
    updates, so no point in building it on every xterm.js update.
  - drop debcargo, which while great for library source code packages
    for build dependencies, is just a PITA for binary packages
    shipping actual compiled rust code, it adds almost nothing there
    but provides lots of special handling to get the correct result.
  - rename `termproxy` to `proxmox-termproxy` but keep a backward
    compat link for now, termproxy is way to general a name.
    Maybe we should also move this away from /bin in general, into the
    /lib/<arch-qualifier>/proxmox/ directory like we do for
    proxmox-backup.
  - clean ups all over the place

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
57 files changed:
.gitignore
Cargo.toml [deleted file]
Makefile [deleted file]
debian/changelog [deleted file]
debian/control [deleted file]
debian/copyright [deleted file]
debian/debcargo.toml [deleted file]
debian/docs [deleted file]
debian/install [deleted file]
debian/rules [deleted file]
debian/rules.debcargo.hint [deleted file]
debian/source/format [deleted file]
debian/source/lintian-overrides [deleted file]
src/main.rs [deleted file]
src/www/index.html.hbs.in [deleted file]
src/www/index.html.tpl.in [deleted file]
src/www/main.js [deleted file]
src/www/style.css [deleted file]
src/www/util.js [deleted file]
src/www/xterm-addon-fit.js [deleted file]
src/www/xterm-addon-fit.js.map [deleted file]
src/www/xterm-addon-webgl.js [deleted file]
src/www/xterm-addon-webgl.js.map [deleted file]
src/www/xterm.css [deleted file]
src/www/xterm.js [deleted file]
src/www/xterm.js.map [deleted file]
termproxy/Cargo.toml [new file with mode: 0644]
termproxy/Makefile [new file with mode: 0644]
termproxy/debian/changelog [new file with mode: 0644]
termproxy/debian/control [new file with mode: 0644]
termproxy/debian/copyright [new file with mode: 0644]
termproxy/debian/docs [new file with mode: 0644]
termproxy/debian/links [new file with mode: 0644]
termproxy/debian/rules [new file with mode: 0755]
termproxy/debian/source/format [new file with mode: 0644]
termproxy/src/main.rs [new file with mode: 0644]
xterm.js/Makefile [new file with mode: 0644]
xterm.js/debian/changelog [new file with mode: 0644]
xterm.js/debian/control [new file with mode: 0644]
xterm.js/debian/copyright [new file with mode: 0644]
xterm.js/debian/docs [new file with mode: 0644]
xterm.js/debian/install [new file with mode: 0644]
xterm.js/debian/rules [new file with mode: 0755]
xterm.js/debian/source/format [new file with mode: 0644]
xterm.js/debian/source/lintian-overrides [new file with mode: 0644]
xterm.js/src/index.html.hbs.in [new file with mode: 0644]
xterm.js/src/index.html.tpl.in [new file with mode: 0644]
xterm.js/src/main.js [new file with mode: 0644]
xterm.js/src/style.css [new file with mode: 0644]
xterm.js/src/util.js [new file with mode: 0644]
xterm.js/src/xterm-addon-fit.js [new file with mode: 0644]
xterm.js/src/xterm-addon-fit.js.map [new file with mode: 0644]
xterm.js/src/xterm-addon-webgl.js [new file with mode: 0644]
xterm.js/src/xterm-addon-webgl.js.map [new file with mode: 0644]
xterm.js/src/xterm.css [new file with mode: 0644]
xterm.js/src/xterm.js [new file with mode: 0644]
xterm.js/src/xterm.js.map [new file with mode: 0644]

index 76abd7082de9d1cd9cef4330fb636a24ac1b8b3d..7480d9c25769f12dd151aa17f0c318637ee0fdb3 100644 (file)
@@ -1,7 +1,9 @@
-/*.build
-/*.buildinfo
-/*.changes
-/*.deb
-/*.dsc
-/*.tar*
-/rust-termproxy-*/
+*.build
+*.buildinfo
+*.changes
+*.deb
+*.dsc
+*.tar*
+Cargo.lock
+/termproxy/proxmox-termproxy-[0-9]*/
+/xterm.js/pve-xtermjs-[0-9]*/
diff --git a/Cargo.toml b/Cargo.toml
deleted file mode 100644 (file)
index 7b05c47..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "termproxy"
-description = "Execute a terminal command and proxy I/O via network"
-version = "4.16.0"
-authors = [
-    "Proxmox Support Team <support@proxmox.com>",
-    "for xterm.js parts: The xterm.js authors <https://github.com/xtermjs/xterm.js>",
-]
-edition = "2018"
-license = "AGPL-3"
-
-exclude = [ "build", "debian" ]
-
-[dependencies]
-anyhow = "1"
-mio = { version = "0.8", features = [ "net", "os-ext" ] }
-ureq = { version = "2.4", default-features = false, features = [ "gzip" ] }
-clap = "4"
-proxmox-io = "1"
-proxmox-lang = "1.1"
-proxmox-sys = "0.5"
diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index 4ea718d..0000000
--- a/Makefile
+++ /dev/null
@@ -1,128 +0,0 @@
-include /usr/share/dpkg/pkg-info.mk
-include /usr/share/dpkg/architecture.mk
-
-PACKAGE=pve-xtermjs
-CRATENAME=termproxy
-
-BUILDDIR ?= $(DEB_SOURCE)-$(DEB_VERSION_UPSTREAM)
-ORIG_SRC_TAR=$(DEB_SOURCE)_$(DEB_VERSION_UPSTREAM).orig.tar.gz
-
-export VERSION=$(DEB_VERSION_UPSTREAM_REVISION)
-
-XTERMJSVER=5.3.0
-XTERMJSTGZ=xterm-$(XTERMJSVER).tgz
-
-FITADDONVER=0.8.0
-FITADDONTGZ=xterm-addon-fit-$(FITADDONVER).tgz
-
-WEBGLADDONVER=0.16.0
-WEBGLADDONTGZ=xterm-addon-webgl-$(WEBGLADDONVER).tgz
-
-DEB=$(PACKAGE)_$(DEB_VERSION_UPSTREAM_REVISION)_$(DEB_HOST_ARCH).deb
-DBG_DEB=$(PACKAGE)-dbgsym_$(DEB_VERSION_UPSTREAM_REVISION)_$(DEB_HOST_ARCH).deb
-DSC=rust-$(CRATENAME)_$(DEB_VERSION_UPSTREAM_REVISION).dsc
-
-CARGO ?= cargo
-ifeq ($(BUILD_MODE), release)
-CARGO_BUILD_ARGS += --release
-COMPILEDIR := target/release
-else
-COMPILEDIR := target/debug
-endif
-
-PREFIX = /usr
-BINDIR = $(PREFIX)/bin
-TERMPROXY_BIN := $(addprefix $(COMPILEDIR)/,termproxy)
-
-all:
-
-install: $(TERMPROXY_BIN)
-       install -dm755 $(DESTDIR)$(BINDIR)
-       install -m755 $(TERMPROXY_BIN) $(DESTDIR)$(BINDIR)/
-
-$(TERMPROXY_BIN): .do-cargo-build
-.do-cargo-build:
-       $(CARGO) build $(CARGO_BUILD_ARGS)
-       touch .do-cargo-build
-
-
-.PHONY: cargo-build
-cargo-build: .do-cargo-build
-
-update-dcontrol:
-       rm -rf $(BUILDDIR)
-       $(MAKE) $(BUILDDIR)
-       cd $(BUILDDIR); debcargo package \
-         --config debian/debcargo.toml \
-         --changelog-ready \
-         --no-overlay-write-back \
-         --directory build \
-         $(CRATENAME) \
-         $(DEB_VERSION_UPSTREAM)
-       cd $(BUILDDIR)/build; wrap-and-sort -tkn
-       cp --remove-destination $(BUILDDIR)/build/debian/control debian/control
-
-$(BUILDDIR):
-       rm -rf $@ $@.tmp
-       mkdir $@.tmp
-       cp -a debian/ src/ Makefile Cargo.toml $@.tmp
-       echo "git clone git://git.proxmox.com/git/pve-xtermjs.git\\ngit checkout $$(git rev-parse HEAD)" \
-           > $@.tmp/debian/SOURCE
-       mv $@.tmp $@
-
-
-$(ORIG_SRC_TAR): $(BUILDDIR)
-       tar czf $(ORIG_SRC_TAR) --exclude="$(BUILDDIR)/debian" $(BUILDDIR)
-
-.PHONY: deb
-deb: $(DEB)
-$(DBG_DEB): $(DEB)
-$(DEB): $(BUILDDIR)
-       cd $(BUILDDIR); dpkg-buildpackage -b -uc -us
-       lintian $(DEB)
-       @echo $(DEB)
-
-.PHONY: dsc
-dsc:
-       rm -rf $(DSC) $(BUILDDIR)
-       $(MAKE) $(DSC)
-       lintian $(DSC)
-
-$(DSC): $(BUILDDIR) $(ORIG_SRC_TAR)
-       cd $(BUILDDIR); dpkg-buildpackage -S -us -uc -d
-
-sbuild: $(DSC)
-       sbuild $(DSC)
-
-EXCLUDED_ADDONS=attach fullscreen search terminado webLinks zmodem
-X_EXCLUSIONS=$(foreach ADDON,$(EXCLUDED_ADDONS),--exclude=addons/$(ADDON))
-
-.PHONY: download
-download:
-       wget https://registry.npmjs.org/xterm/-/$(XTERMJSTGZ) -O $(XTERMJSTGZ).tmp
-       wget https://registry.npmjs.org/xterm-addon-fit/-/$(FITADDONTGZ) -O $(FITADDONTGZ).tmp
-       wget https://registry.npmjs.org/xterm-addon-webgl/-/$(WEBGLADDONTGZ) -O $(WEBGLADDONTGZ).tmp
-       mv $(XTERMJSTGZ).tmp $(XTERMJSTGZ)
-       mv $(FITADDONTGZ).tmp $(FITADDONTGZ)
-       mv $(WEBGLADDONTGZ).tmp $(WEBGLADDONTGZ)
-       tar -C src/www -xf $(XTERMJSTGZ) package/lib package/css --strip-components=2 $(X_EXCLUSIONS)
-       tar -C src/www -xf $(FITADDONTGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
-       tar -C src/www -xf $(WEBGLADDONTGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
-       rm $(XTERMJSTGZ) $(FITADDONTGZ) $(WEBGLADDONTGZ)
-
-.PHONY: upload
-upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
-upload: $(DEB) $(DBG_DEB)
-       tar cf - $(DEB) $(DBG_DEB) |ssh -X repoman@repo.proxmox.com -- upload --product pmg,pve,pbs --dist $(UPLOAD_DIST) --arch $(DEB_HOST_ARCH)
-
-.PHONY: distclean
-distclean: clean
-
-.PHONY: clean
-clean:
-       $(CARGO) clean
-       rm -rf $(DEB_SOURCE)-[0-9]*/ build/ *.deb *.changes *.dsc *.tar.* *.buildinfo *.build .do-cargo-build
-
-.PHONY: dinstall
-dinstall: deb
-       dpkg -i $(DEB)
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644 (file)
index acfff31..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-rust-termproxy (4.16.0-3) bookworm; urgency=medium
-
-  * re-build for Debian 12 Bookworm based releases
-
- -- Proxmox Support Team <support@proxmox.com>  Tue, 23 May 2023 13:48:44 +0200
-
-rust-termproxy (4.16.0-2) bullseye; urgency=medium
-
-  * switch from curl to ureq
-
-  * detect not running guests and add start button
-
-  * various smaller build system updates and improvements
-
- -- Proxmox Support Team <support@proxmox.com>  Mon, 22 May 2023 15:35:35 +0200
-
-rust-termproxy (4.16.0-1) bullseye; urgency=medium
-
-  * upgrade xterm.js from 4.12.0 to 4.16.0
-
- -- Proxmox Support Team <support@proxmox.com>  Tue, 25 Jan 2022 15:32:15 +0100
-
-rust-termproxy (4.12.0-1) bullseye; urgency=medium
-
-  * upgrade xterm.js to new upstream release 4.12.0
-
-  * re-build for Debian 11 Bullseye based releases
-
- -- Proxmox Support Team <support@proxmox.com>  Fri, 14 May 2021 08:26:36 +0200
-
-rust-termproxy (4.7.0-3) pve pmg; urgency=medium
-
-  * fix console window title for rust template
-
-  * fix #2980: do not prompt for leaving on reconnect/disconnect
-
- -- Proxmox Support Team <support@proxmox.com>  Tue, 24 Nov 2020 14:53:10 +0100
-
-rust-termproxy (4.7.0-2) pve pmg; urgency=medium
-
-  * fix corner case handling of pre-defined command options
-
- -- Proxmox Support Team <support@proxmox.com>  Fri, 28 Aug 2020 13:51:42 +0200
-
-rust-termproxy (4.7.0-1) pve pmg; urgency=medium
-
-  * upgrade xterm.js to new upstream release 4.3.0
-
-  * rewrite system console wrapper in rust
-
- -- Proxmox Support Team <support@proxmox.com>  Thu, 23 Jul 2020 12:20:16 +0200
-
-pve-xtermjs (4.3.0-1) pve pmg; urgency=medium
-
-  * upgrade xterm.js to new upstream release 4.3.0
-
- -- Proxmox Support Team <support@proxmox.com>  Wed, 22 Jan 2020 12:17:59 +0100
-
-pve-xtermjs (3.13.2-1) pve pmg; urgency=medium
-
-  * update sources to 3.13.2
-
-  * build for Debian Buster
-
- -- Proxmox Support Team <support@proxmox.com>  Wed, 22 May 2019 20:04:12 +0200
-
-pve-xtermjs (3.12.0-1) unstable; urgency=medium
-
-  * allow xtermjs on ipv6 only host
-
-  * update to upstream 3.12.0 release
-
- -- Proxmox Support Team <support@proxmox.com>  Tue, 26 Mar 2019 07:44:39 +0100
-
-pve-xtermjs (3.10.1-2) unstable; urgency=medium
-
-  * support new 'cmd' parameter
-
- -- Proxmox Support Team <support@proxmox.com>  Thu, 28 Feb 2019 11:13:08 +0100
-
-pve-xtermjs (3.10.1-1) unstable; urgency=medium
-
-  * update to xterm.js 3.10.1
-
- -- Proxmox Support Team <support@proxmox.com>  Thu, 17 Jan 2019 16:38:51 +0100
-
-pve-xtermjs (1.0-5) unstable; urgency=medium
-
-  * change localhost to 127.0.0.1
-
- -- Proxmox Support Team <support@proxmox.com>  Tue, 08 May 2018 11:20:25 +0200
-
-pve-xtermjs (1.0-4) unstable; urgency=medium
-
-  * reload on container reboot
-
-  * do not try to reconnect the host shell
-
-  * focus terminal when starting
-
- -- Proxmox Support Team <support@proxmox.com>  Mon, 07 May 2018 15:16:07 +0200
-
-pve-xtermjs (1.0-3) unstable; urgency=medium
-
-  * update to xterm.js 3.2.0
-
-  * implement reconnect logic
-
- -- Proxmox Support Team <support@proxmox.com>  Wed, 11 Apr 2018 14:32:28 +0200
-
-pve-xtermjs (1.0-2) unstable; urgency=medium
-
-  * make perm an optional parameter
-
-  * remove dependcy to libpve-access-control
-
- -- Proxmox Support Team <support@proxmox.com>  Mon, 11 Dec 2017 14:39:10 +0100
-
-pve-xtermjs (1.0-1) unstable; urgency=medium
-
-  * bump to 1.0-1
-
-  * update dependencies
-
-  * check ticket via api instead of verify_vnc_ticket
-
- -- Proxmox Support Team <support@proxmox.com>  Thu, 07 Dec 2017 13:24:37 +0100
-
-pve-xtermjs (0.1-1) unstable; urgency=medium
-
-  * bump to 0.1-1
-
-  * update dependencies
-
-  * give pty object to process_queue on first call
-
- -- Proxmox Support Team <support@proxmox.com>  Mon, 04 Dec 2017 10:29:52 +0100
-
-pve-xtermjs (0.1-1~rc1) unstable; urgency=medium
-
-  * initial package
-
- -- Proxmox Support Team <support@proxmox.com>  Mon, 20 Nov 2017 08:25:32 +0100
diff --git a/debian/control b/debian/control
deleted file mode 100644 (file)
index d06ae3b..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-Source: rust-termproxy
-Section: admin
-Priority: optional
-Build-Depends: cargo:native,
-               debhelper-compat (= 13),
-               dh-cargo (>= 25),
-               librust-anyhow-1+default-dev,
-               librust-clap-4+default-dev,
-               librust-mio-0.8+default-dev,
-               librust-mio-0.8+net-dev,
-               librust-mio-0.8+os-ext-dev,
-               librust-proxmox-io-1+default-dev,
-               librust-proxmox-lang-1+default-dev (>= 1.1-~~),
-               librust-proxmox-sys-0.5+default-dev,
-               librust-ureq-2+gzip-dev (>= 2.4-~~),
-               libstd-rust-dev,
-               rustc:native,
-Maintainer: Proxmox Support Team <support@proxmox.com>
-Standards-Version: 4.6.1
-Vcs-Git: git://git.proxmox.com/git/pve-xtermjs.git
-Vcs-Browser: https://git.proxmox.com/?p=pve-xtermjs.git;a=summary
-Homepage: https://www.proxmox.com
-X-Cargo-Crate: termproxy
-Rules-Requires-Root: no
-
-Package: pve-xtermjs
-Architecture: any
-Multi-Arch: allowed
-Depends: ${cargo:Depends}, ${misc:Depends}, ${shlibs:Depends},
-Recommends: ${cargo:Recommends},
-Suggests: ${cargo:Suggests},
-Provides: ${cargo:Provides},
-Built-Using: ${cargo:Built-Using},
-XB-X-Cargo-Built-Using: ${cargo:X-Cargo-Built-Using}
-Description: HTML/JS Shell client for Proxmox projects
- This package provides an xterm.js client/proxy for Proxmoxprojects'  Hosts,
- Proxmox VE containers or Proxmox VE VM's serial-terminals.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644 (file)
index f9d2553..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-Copyright (C) 2017-2020 Proxmox Server Solutions GmbH
-
-This software is written by Proxmox Server Solutions GmbH <support@proxmox.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
--------------
-
-xterm.js
-
-Copyright (c) 2017-2019, The xterm.js authors (https://github.com/xtermjs/xterm.js)
-Copyright (c) 2014-2016, SourceLair Private Company (https://www.sourcelair.com)
-Copyright (c) 2012-2013, Christopher Jeffrey (https://github.com/chjj/)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/debian/debcargo.toml b/debian/debcargo.toml
deleted file mode 100644 (file)
index bad78f7..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-overlay = "."
-crate_src_path = ".."
-bin_name = "pve-xtermjs"
-maintainer = "Proxmox Support Team <support@proxmox.com>"
-
-[source]
-section = "admin"
-homepage = "https://www.proxmox.com"
-vcs_git = "git://git.proxmox.com/git/pve-xtermjs.git"
-vcs_browser = "https://git.proxmox.com/?p=pve-xtermjs.git;a=summary"
-
-[packages.bin]
-summary = "HTML/JS Shell client for Proxmox projects"
-description = """This package provides an xterm.js client/proxy for Proxmox\
-  projects'  Hosts, Proxmox VE containers or Proxmox VE VM's serial-terminals.\
-  """
diff --git a/debian/docs b/debian/docs
deleted file mode 100644 (file)
index 8696672..0000000
+++ /dev/null
@@ -1 +0,0 @@
-debian/SOURCE
diff --git a/debian/install b/debian/install
deleted file mode 100644 (file)
index 04be689..0000000
+++ /dev/null
@@ -1 +0,0 @@
-src/www/*              /usr/share/pve-xtermjs/
diff --git a/debian/rules b/debian/rules
deleted file mode 100755 (executable)
index 6049291..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/make -f
-
-include /usr/share/dpkg/pkg-info.mk
-include /usr/share/rustc/architecture.mk
-
-export BUILD_MODE=release
-
-export CFLAGS CXXFLAGS CPPFLAGS LDFLAGS
-export DEB_HOST_RUST_TYPE DEB_HOST_GNU_TYPE
-export CARGO_HOME = $(CURDIR)/debian/cargo_home
-
-export DEB_CARGO_CRATE=termproxy_$(DEB_VERSION_UPSTREAM)
-export DEB_CARGO_PACKAGE=pve-xtermjs
-
-%:
-       dh $@
-
-override_dh_auto_build:
-       dh_auto_build
-       sed -e 's/@VERSION@/$(DEB_VERSION)/' src/www/index.html.tpl.in > src/www/index.html.tpl
-       sed -e 's/@VERSION@/$(DEB_VERSION)/' src/www/index.html.hbs.in > src/www/index.html.hbs
-       rm src/www/index.html.tpl.in src/www/index.html.hbs.in
-
-override_dh_auto_configure:
-       rm -f Cargo.lock
-       /usr/share/cargo/bin/cargo prepare-debian $(CURDIR)/debian/cargo_registry --link-from-system
-       dh_auto_configure
diff --git a/debian/rules.debcargo.hint b/debian/rules.debcargo.hint
deleted file mode 100755 (executable)
index 92c239b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/make -f
-%:
-       dh $@ --buildsystem cargo
-
-override_dh_auto_test:
-       dh_auto_test -- test --all
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644 (file)
index 163aaf8..0000000
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
deleted file mode 100644 (file)
index 6e1429a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-rust-termproxy source: source-is-missing [src/www/xterm-addon-fit.js]
-rust-termproxy source: source-is-missing [src/www/xterm.js]
diff --git a/src/main.rs b/src/main.rs
deleted file mode 100644 (file)
index 5eb14ee..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-use std::cmp::min;
-use std::collections::HashMap;
-use std::ffi::OsString;
-use std::io::{ErrorKind, Write};
-use std::os::unix::io::{AsRawFd, FromRawFd};
-use std::os::unix::process::CommandExt;
-use std::process::Command;
-use std::time::{Duration, Instant};
-
-use anyhow::{bail, format_err, Result};
-use clap::Arg;
-use mio::net::{TcpListener, TcpStream};
-use mio::unix::SourceFd;
-use mio::{Events, Interest, Poll, Token};
-
-use proxmox_io::ByteBuffer;
-use proxmox_lang::error::io_err_other;
-use proxmox_sys::linux::pty::{make_controlling_terminal, PTY};
-
-const MSG_TYPE_DATA: u8 = 0;
-const MSG_TYPE_RESIZE: u8 = 1;
-//const MSG_TYPE_PING: u8 = 2;
-
-fn remove_number(buf: &mut ByteBuffer) -> Option<usize> {
-    loop {
-        if let Some(pos) = &buf.iter().position(|&x| x == b':') {
-            let data = buf.remove_data(*pos);
-            buf.consume(1); // the ':'
-            let len = match std::str::from_utf8(&data) {
-                Ok(lenstring) => match lenstring.parse() {
-                    Ok(len) => len,
-                    Err(err) => {
-                        eprintln!("error parsing number: '{}'", err);
-                        break;
-                    }
-                },
-                Err(err) => {
-                    eprintln!("error parsing number: '{}'", err);
-                    break;
-                }
-            };
-            return Some(len);
-        } else if buf.len() > 20 {
-            buf.consume(20);
-        } else {
-            break;
-        }
-    }
-    None
-}
-
-fn process_queue(buf: &mut ByteBuffer, pty: &mut PTY) -> Option<usize> {
-    if buf.is_empty() {
-        return None;
-    }
-
-    loop {
-        if buf.len() < 2 {
-            break;
-        }
-
-        let msgtype = buf[0] - b'0';
-
-        if msgtype == MSG_TYPE_DATA {
-            buf.consume(2);
-            if let Some(len) = remove_number(buf) {
-                return Some(len);
-            }
-        } else if msgtype == MSG_TYPE_RESIZE {
-            buf.consume(2);
-            if let Some(cols) = remove_number(buf) {
-                if let Some(rows) = remove_number(buf) {
-                    pty.set_size(cols as u16, rows as u16).ok()?;
-                }
-            }
-        // ignore incomplete messages
-        } else {
-            buf.consume(1);
-            // ignore invalid or ping (msgtype 2)
-        }
-    }
-
-    None
-}
-
-type TicketResult = Result<(Box<[u8]>, Box<[u8]>)>;
-
-/// Reads from the stream and returns the first line and the rest
-fn read_ticket_line(
-    stream: &mut TcpStream,
-    buf: &mut ByteBuffer,
-    timeout: Duration,
-) -> TicketResult {
-    let mut poll = Poll::new()?;
-    poll.registry()
-        .register(stream, Token(0), Interest::READABLE)?;
-    let mut events = Events::with_capacity(1);
-
-    let now = Instant::now();
-    let mut elapsed = Duration::new(0, 0);
-
-    loop {
-        poll.poll(&mut events, Some(timeout - elapsed))?;
-        if !events.is_empty() {
-            match buf.read_from(stream) {
-                Ok(n) => {
-                    if n == 0 {
-                        bail!("connection closed before authentication");
-                    }
-                }
-                Err(err) if err.kind() == ErrorKind::WouldBlock => {}
-                Err(err) => return Err(err.into()),
-            }
-
-            if buf[..].contains(&b'\n') {
-                break;
-            }
-
-            if buf.is_full() {
-                bail!("authentication data is incomplete: {:?}", &buf[..]);
-            }
-        }
-
-        elapsed = now.elapsed();
-        if elapsed > timeout {
-            bail!("timed out");
-        }
-    }
-
-    let newline_idx = &buf[..].iter().position(|&x| x == b'\n').unwrap();
-
-    let line = buf.remove_data(*newline_idx);
-    buf.consume(1); // discard newline
-
-    match line.iter().position(|&b| b == b':') {
-        Some(pos) => {
-            let (username, ticket) = line.split_at(pos);
-            Ok((username.into(), ticket[1..].into()))
-        }
-        None => bail!("authentication data is invalid"),
-    }
-}
-
-fn authenticate(
-    username: &[u8],
-    ticket: &[u8],
-    path: &str,
-    perm: Option<&str>,
-    authport: u16,
-    port: Option<u16>,
-) -> Result<()> {
-    let mut post_fields: Vec<(&str, &str)> = Vec::with_capacity(5);
-    post_fields.push(("username", std::str::from_utf8(username)?));
-    post_fields.push(("password", std::str::from_utf8(ticket)?));
-    post_fields.push(("path", path));
-    if let Some(perm) = perm {
-        post_fields.push(("privs", perm));
-    }
-    let port_str;
-    if let Some(port) = port {
-        port_str = port.to_string();
-        post_fields.push(("port", &port_str));
-    }
-
-    let url = format!("http://localhost:{}/api2/json/access/ticket", authport);
-
-    match ureq::post(&url).send_form(&post_fields[..]) {
-        Ok(res) if res.status() == 200 => Ok(()),
-        Ok(res) | Err(ureq::Error::Status(_, res)) => {
-            let code = res.status();
-            bail!("invalid authentication - {} {}", code, res.status_text())
-        }
-        Err(err) => bail!("authentication request failed - {}", err),
-    }
-}
-
-fn listen_and_accept(
-    hostname: &str,
-    port: u64,
-    port_as_fd: bool,
-    timeout: Duration,
-) -> Result<(TcpStream, u16)> {
-    let listener = if port_as_fd {
-        unsafe { std::net::TcpListener::from_raw_fd(port as i32) }
-    } else {
-        std::net::TcpListener::bind((hostname, port as u16))?
-    };
-    let port = listener.local_addr()?.port();
-    let mut listener = TcpListener::from_std(listener);
-    let mut poll = Poll::new()?;
-
-    poll.registry()
-        .register(&mut listener, Token(0), Interest::READABLE)?;
-
-    let mut events = Events::with_capacity(1);
-
-    let now = Instant::now();
-    let mut elapsed = Duration::new(0, 0);
-
-    loop {
-        poll.poll(&mut events, Some(timeout - elapsed))?;
-        if !events.is_empty() {
-            let (stream, client) = listener.accept()?;
-            println!("client connection: {:?}", client);
-            return Ok((stream, port));
-        }
-
-        elapsed = now.elapsed();
-        if elapsed > timeout {
-            bail!("timed out");
-        }
-    }
-}
-
-fn run_pty<'a>(mut full_cmd: impl Iterator<Item = &'a OsString>) -> Result<PTY> {
-    let cmd_exe = full_cmd.next().unwrap();
-    let params = full_cmd; // rest
-
-    let (mut pty, secondary_name) = PTY::new().map_err(io_err_other)?;
-
-    let mut filtered_env: HashMap<OsString, OsString> = std::env::vars_os()
-        .filter(|&(ref k, _)| {
-            k == "PATH"
-                || k == "USER"
-                || k == "HOME"
-                || k == "LANG"
-                || k == "LANGUAGE"
-                || k.to_string_lossy().starts_with("LC_")
-        })
-        .collect();
-    filtered_env.insert("TERM".into(), "xterm-256color".into());
-
-    let mut command = Command::new(cmd_exe);
-
-    command.args(params).env_clear().envs(&filtered_env);
-
-    unsafe {
-        command.pre_exec(move || {
-            make_controlling_terminal(&secondary_name).map_err(io_err_other)?;
-            Ok(())
-        });
-    }
-
-    command.spawn()?;
-
-    pty.set_size(80, 20)?;
-    Ok(pty)
-}
-
-const TCP: Token = Token(0);
-const PTY: Token = Token(1);
-
-fn do_main() -> Result<()> {
-    let matches = clap::builder::Command::new("termproxy")
-        .trailing_var_arg(true)
-        .arg(
-            Arg::new("port")
-                .num_args(1)
-                .required(true)
-                .value_parser(clap::value_parser!(u64)),
-        )
-        .arg(Arg::new("authport").num_args(1).long("authport"))
-        .arg(Arg::new("use-port-as-fd").long("port-as-fd"))
-        .arg(Arg::new("path").num_args(1).long("path").required(true))
-        .arg(Arg::new("perm").num_args(1).long("perm"))
-        .arg(
-            Arg::new("cmd")
-                .value_parser(clap::value_parser!(OsString))
-                .num_args(1..)
-                .required(true),
-        )
-        .get_matches();
-
-    let port: u64 = *matches.get_one("port").unwrap();
-    let path = matches.get_one::<String>("path").unwrap();
-    let perm = matches.get_one::<String>("perm").map(|x| x.as_str());
-    let full_cmd: clap::parser::ValuesRef<OsString> = matches.get_many("cmd").unwrap();
-    let authport: u16 = *matches.get_one("authport").unwrap_or(&85);
-    let use_port_as_fd = matches.contains_id("use-port-as-fd");
-
-    if use_port_as_fd && port > u16::MAX as u64 {
-        return Err(format_err!("port too big"));
-    } else if port > i32::MAX as u64 {
-        return Err(format_err!("Invalid FD number"));
-    }
-
-    let (mut tcp_handle, port) =
-        listen_and_accept("localhost", port, use_port_as_fd, Duration::new(10, 0))
-            .map_err(|err| format_err!("failed waiting for client: {}", err))?;
-
-    let mut pty_buf = ByteBuffer::new();
-    let mut tcp_buf = ByteBuffer::new();
-
-    let (username, ticket) = read_ticket_line(&mut tcp_handle, &mut pty_buf, Duration::new(10, 0))
-        .map_err(|err| format_err!("failed reading ticket: {}", err))?;
-    let port = if use_port_as_fd { Some(port) } else { None };
-    authenticate(&username, &ticket, &path, perm.as_deref(), authport, port)?;
-    tcp_handle.write_all(b"OK").expect("error writing response");
-
-    let mut poll = Poll::new()?;
-    let mut events = Events::with_capacity(128);
-
-    let mut pty = run_pty(full_cmd)?;
-
-    poll.registry().register(
-        &mut tcp_handle,
-        TCP,
-        Interest::READABLE | Interest::WRITABLE,
-    )?;
-    poll.registry().register(
-        &mut SourceFd(&pty.as_raw_fd()),
-        PTY,
-        Interest::READABLE | Interest::WRITABLE,
-    )?;
-
-    let mut tcp_writable = true;
-    let mut pty_writable = true;
-    let mut tcp_readable = true;
-    let mut pty_readable = true;
-    let mut remaining = 0;
-    let mut finished = false;
-
-    while !finished {
-        if tcp_readable && !pty_buf.is_full() || pty_readable && !tcp_buf.is_full() {
-            poll.poll(&mut events, Some(Duration::new(0, 0)))?;
-        } else {
-            poll.poll(&mut events, None)?;
-        }
-
-        for event in &events {
-            let writable = event.is_writable();
-            let readable = event.is_readable();
-            if event.is_read_closed() {
-                finished = true;
-            }
-            match event.token() {
-                TCP => {
-                    if readable {
-                        tcp_readable = true;
-                    }
-                    if writable {
-                        tcp_writable = true;
-                    }
-                }
-                PTY => {
-                    if readable {
-                        pty_readable = true;
-                    }
-                    if writable {
-                        pty_writable = true;
-                    }
-                }
-                _ => unreachable!(),
-            }
-        }
-
-        while tcp_readable && !pty_buf.is_full() {
-            let bytes = match pty_buf.read_from(&mut tcp_handle) {
-                Ok(bytes) => bytes,
-                Err(err) if err.kind() == ErrorKind::WouldBlock => {
-                    tcp_readable = false;
-                    break;
-                }
-                Err(err) => {
-                    if !finished {
-                        return Err(format_err!("error reading from tcp: {}", err));
-                    }
-                    break;
-                }
-            };
-            if bytes == 0 {
-                finished = true;
-                break;
-            }
-        }
-
-        while pty_readable && !tcp_buf.is_full() {
-            let bytes = match tcp_buf.read_from(&mut pty) {
-                Ok(bytes) => bytes,
-                Err(err) if err.kind() == ErrorKind::WouldBlock => {
-                    pty_readable = false;
-                    break;
-                }
-                Err(err) => {
-                    if !finished {
-                        return Err(format_err!("error reading from pty: {}", err));
-                    }
-                    break;
-                }
-            };
-            if bytes == 0 {
-                finished = true;
-                break;
-            }
-        }
-
-        while !tcp_buf.is_empty() && tcp_writable {
-            let bytes = match tcp_handle.write(&tcp_buf[..]) {
-                Ok(bytes) => bytes,
-                Err(err) if err.kind() == ErrorKind::WouldBlock => {
-                    tcp_writable = false;
-                    break;
-                }
-                Err(err) => {
-                    if !finished {
-                        return Err(format_err!("error writing to tcp : {}", err));
-                    }
-                    break;
-                }
-            };
-            tcp_buf.consume(bytes);
-        }
-
-        while !pty_buf.is_empty() && pty_writable {
-            if remaining == 0 {
-                remaining = match process_queue(&mut pty_buf, &mut pty) {
-                    Some(val) => val,
-                    None => break,
-                };
-            }
-            let len = min(remaining, pty_buf.len());
-            let bytes = match pty.write(&pty_buf[..len]) {
-                Ok(bytes) => bytes,
-                Err(err) if err.kind() == ErrorKind::WouldBlock => {
-                    pty_writable = false;
-                    break;
-                }
-                Err(err) => {
-                    if !finished {
-                        return Err(format_err!("error writing to pty : {}", err));
-                    }
-                    break;
-                }
-            };
-            remaining -= bytes;
-            pty_buf.consume(bytes);
-        }
-    }
-
-    Ok(())
-}
-
-fn main() {
-    std::process::exit(match do_main() {
-        Ok(_) => 0,
-        Err(err) => {
-            eprintln!("{}", err);
-            1
-        }
-    });
-}
diff --git a/src/www/index.html.hbs.in b/src/www/index.html.hbs.in
deleted file mode 100644 (file)
index 6216e67..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-       <title>{{ NodeName }} - Proxmox Console</title>
-       <link rel="stylesheet" href="/xtermjs/xterm.css?version=@VERSION@" />
-       <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
-       <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/util.js?version=@VERSION@" ></script>
-    </head>
-    <body>
-       <div id="status_bar"></div>
-       <div id="wrap">
-       <div class="center">
-           <div id="connect_dlg">
-               <div id="pve_start_info">Guest not running</div>
-               <div id="connect_btn"><div> Start Now </div></div>
-           </div>
-       </div>
-       <div id="terminal-container"></div>
-       </div>
-       <script type="text/javascript">
-           if (typeof(PVE) === 'undefined') PVE = {};
-           PVE.UserName = '{{ UserName }}';
-           PVE.CSRFPreventionToken = '{{ CSRFPreventionToken }}';
-       </script>
-       <script src="/xtermjs/main.js?version=@VERSION@" defer ></script>
-    </body>
-</html>
diff --git a/src/www/index.html.tpl.in b/src/www/index.html.tpl.in
deleted file mode 100644 (file)
index fd7ba77..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype html>
-<html>
-    <head>
-       <title>[% nodename %] - Proxmox Console</title>
-       <link rel="stylesheet" href="/xtermjs/xterm.css?version=@VERSION@" />
-       <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
-       <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
-       <script src="/xtermjs/util.js?version=@VERSION@" ></script>
-    </head>
-    <body>
-       <div id="status_bar"></div>
-       <div id="wrap">
-       <div class="center">
-           <div id="connect_dlg">
-               <div id="pve_start_info">Guest not running</div>
-               <div id="connect_btn"><div> Start Now </div></div>
-           </div>
-       </div>
-       <div id="terminal-container"></div>
-       </div>
-       <script type="text/javascript">
-           if (typeof(PVE) === 'undefined') PVE = {};
-           PVE.UserName = '[% username %]';
-           PVE.CSRFPreventionToken = '[% token %]';
-       </script>
-       <script src="/xtermjs/main.js?version=@VERSION@" defer ></script>
-    </body>
-</html>
diff --git a/src/www/main.js b/src/www/main.js
deleted file mode 100644 (file)
index 85cc399..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-console.log('xtermjs: starting');
-
-var states = {
-    start:         1,
-    connecting:    2,
-    connected:     3,
-    disconnecting: 4,
-    disconnected:  5,
-    reconnecting:  6,
-};
-
-var term,
-    protocol,
-    socketURL,
-    socket,
-    ticket,
-    resize,
-    ping,
-    state = states.start,
-    starttime = new Date();
-
-var type = getQueryParameter('console');
-var vmid = getQueryParameter('vmid');
-var vmname = getQueryParameter('vmname');
-var nodename = getQueryParameter('node');
-var cmd = getQueryParameter('cmd');
-var cmdOpts = getQueryParameter('cmd-opts');
-
-function updateState(newState, msg, code) {
-    var timeout, severity, message;
-    switch (newState) {
-       case states.connecting:
-           message = "Connecting...";
-           timeout = 0;
-           severity = severities.warning;
-           break;
-       case states.connected:
-           window.onbeforeunload = windowUnload;
-           message = "Connected";
-           break;
-       case states.disconnecting:
-           window.onbeforeunload = undefined;
-           message = "Disconnecting...";
-           timeout = 0;
-           severity = severities.warning;
-           break;
-       case states.reconnecting:
-           window.onbeforeunload = undefined;
-           message = "Reconnecting...";
-           timeout = 0;
-           severity = severities.warning;
-           break;
-       case states.disconnected:
-           window.onbeforeunload = undefined;
-           switch (state) {
-               case states.start:
-               case states.connecting:
-               case states.reconnecting:
-                   message = "Connection failed";
-                   timeout = 0;
-                   severity = severities.error;
-                   break;
-               case states.connected:
-               case states.disconnecting:
-                   var time_since_started = new Date() - starttime;
-                   timeout = 5000;
-                   if (time_since_started > 5*1000 || type === 'shell') {
-                       message = "Connection closed";
-                   } else {
-                       message = "Connection failed";
-                       severity = severities.error;
-                   }
-                   break;
-               case states.disconnected:
-                   // no state change
-                   break;
-               default:
-                   throw "unknown state";
-           }
-           break;
-       default:
-           throw "unknown state";
-    }
-    let msgArr = [];
-    if (msg) {
-       msgArr.push(msg);
-    }
-    if (code !== undefined) {
-       msgArr.push(`Code: ${code}`);
-    }
-    if (msgArr.length > 0) {
-       message += ` (${msgArr.join(', ')})`;
-    }
-    state = newState;
-    showMsg(message, timeout, severity);
-}
-
-var terminalContainer = document.getElementById('terminal-container');
-document.getElementById('status_bar').addEventListener('click', hideMsg);
-document.getElementById('connect_btn').addEventListener('click', startGuest);
-const fitAddon = new FitAddon.FitAddon();
-const webglAddon = new WebglAddon.WebglAddon();
-
-createTerminal();
-
-function startConnection(url, params, term) {
-    API2Request({
-       method: 'POST',
-       params: params,
-       url: url + '/termproxy',
-       success: function(result) {
-           var port = encodeURIComponent(result.data.port);
-           ticket = result.data.ticket;
-           socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + url + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket);
-
-           socket = new WebSocket(socketURL, 'binary');
-           socket.binaryType = 'arraybuffer';
-           socket.onopen = runTerminal;
-           socket.onclose = tryReconnect;
-           socket.onerror = tryReconnect;
-           updateState(states.connecting);
-       },
-       failure: function(msg) {
-           updateState(states.disconnected,msg);
-       }
-    });
-}
-
-function startGuest() {
-    let api_type = type === 'kvm' ? 'qemu' : 'lxc';
-    API2Request({
-       method: 'POST',
-       url: `/nodes/${nodename}/${api_type}/${vmid}/status/start`,
-       success: function(result) {
-           showMsg('Guest started successfully', 0);
-           setTimeout(function() {
-               location.reload();
-           }, 1000);
-       },
-       failure: function(msg) {
-           if (msg.match(/already running/)) {
-               showMsg('Guest started successfully', 0);
-               setTimeout(function() {
-                   location.reload();
-               }, 1000);
-           } else {
-               updateState(states.disconnected,msg);
-           }
-       }
-    });
-}
-
-function createTerminal() {
-    term = new Terminal(getTerminalSettings());
-    term.open(terminalContainer);
-    term.loadAddon(fitAddon);
-    try {
-       term.loadAddon(webglAddon);
-    } catch (_e) {
-       console.warn("webgl-addon loading failed, falling back to regular dom renderer");
-    }
-
-    term.onResize(function (size) {
-       if (state === states.connected) {
-           socket.send("1:" + size.cols + ":" + size.rows + ":");
-       }
-    });
-
-    protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://';
-
-    var params = {};
-    var url = '/nodes/' + nodename;
-    switch (type) {
-       case 'kvm':
-           url += '/qemu/' + vmid;
-           break;
-       case 'lxc':
-           url += '/lxc/' + vmid;
-           break;
-       case 'upgrade':
-           params.cmd = 'upgrade';
-           break;
-       case 'cmd':
-           params.cmd = decodeURI(cmd);
-           if (cmdOpts !== undefined && cmdOpts !== null && cmdOpts !== "") {
-               params['cmd-opts'] = decodeURI(cmdOpts);
-           }
-           break;
-    }
-    if (type === 'kvm' || type === 'lxc') {
-       API2Request({
-           method: 'GET',
-           url: `${url}/status/current`,
-           success: function(result) {
-               if (result.data.status === 'running') {
-                   startConnection(url, params, term);
-               } else {
-                   document.getElementById('connect_dlg').classList.add('pve_open');
-               }
-           },
-           failure: function(msg) {
-               updateState(states.disconnected, msg);
-           },
-       });
-    } else {
-       startConnection(url, params, term);
-    }
-}
-
-function runTerminal() {
-    socket.onmessage = function(event) {
-       var answer = new Uint8Array(event.data);
-       if (state === states.connected) {
-           term.write(answer);
-       } else if(state === states.connecting) {
-           if (answer[0] === 79 && answer[1] === 75) { // "OK"
-               updateState(states.connected);
-               term.write(answer.slice(2));
-           } else {
-               socket.close();
-           }
-       }
-    };
-
-    term.onData(function(data) {
-       if (state === states.connected) {
-           socket.send("0:" + unescape(encodeURIComponent(data)).length.toString() + ":" +  data);
-       }
-    });
-
-    ping = setInterval(function() {
-       socket.send("2");
-    }, 30*1000);
-
-    window.addEventListener('resize', function() {
-       clearTimeout(resize);
-       resize = setTimeout(function() {
-           // done resizing
-           fitAddon.fit();
-       }, 250);
-    });
-
-    socket.send(PVE.UserName + ':' + ticket + "\n");
-
-    // initial focus and resize
-    setTimeout(function() {
-       term.focus();
-       fitAddon.fit();
-    }, 250);
-}
-
-function getLxcStatus(callback) {
-    API2Request({
-       method: 'GET',
-       url: '/nodes/' + nodename + '/lxc/' + vmid + '/status/current',
-       success: function(result) {
-           if (typeof callback === 'function') {
-               callback(true, result);
-           }
-       },
-       failure: function(msg) {
-           if (typeof callback === 'function') {
-               callback(false, msg);
-           }
-       }
-    });
-}
-
-function checkMigration() {
-    var apitype = type;
-    if (apitype === 'kvm') {
-       apitype = 'qemu';
-    }
-    API2Request({
-       method: 'GET',
-       params: {
-           type: 'vm'
-       },
-       url: '/cluster/resources',
-       success: function(result) {
-           // if not yet migrated , wait and try again
-           // if not migrating and stopped, cancel
-           // if started, connect
-           result.data.forEach(function(entity) {
-               if (entity.id === (apitype + '/' + vmid)) {
-                   var started = entity.status === 'running';
-                   var migrated = entity.node !== nodename;
-                   if (migrated) {
-                       if (started) {
-                           // goto different node
-                           location.href = '?console=' + type +
-                               '&xtermjs=1&vmid=' + vmid + '&vmname=' +
-                               vmname + '&node=' + entity.node;
-                       } else {
-                           // wait again
-                           updateState(states.reconnecting, 'waiting for migration to finish...');
-                           setTimeout(checkMigration, 5000);
-                       }
-                   } else {
-                       if (type === 'lxc') {
-                           // we have to check the status of the
-                           // container to know if it has the
-                           // migration lock
-                           getLxcStatus(function(success, result) {
-                               if (success) {
-                                   if (result.data.lock === 'migrate') {
-                                       // still waiting
-                                       updateState(states.reconnecting, 'waiting for migration to finish...');
-                                       setTimeout(checkMigration, 5000);
-                                   } else if (started) {
-                                       // container was rebooted
-                                       location.reload();
-                                   } else {
-                                       stopTerminal();
-                                   }
-                               } else {
-                                   // probably the status call failed because
-                                   // the ct is already somewhere else, so retry
-                                   setTimeout(checkMigration, 1000);
-                               }
-                           });
-                       } else if (started) {
-                           // this happens if we have old data in
-                           // /cluster/resources, or the connection
-                           // disconnected, so simply try to reload here
-                           location.reload();
-                       } else if (type === 'kvm') {
-                           // it seems the guest simply stopped
-                           stopTerminal();
-                       }
-                   }
-
-                   return;
-               }
-           });
-       },
-       failure: function(msg) {
-           errorTerminal({msg: msg});
-       }
-    });
-}
-
-function tryReconnect(event) {
-    var time_since_started = new Date() - starttime;
-    var type = getQueryParameter('console');
-    if (time_since_started < 5*1000 || type === 'shell' || type === 'cmd') { // 5 seconds
-       stopTerminal(event);
-       return;
-    }
-
-    updateState(states.disconnecting, 'Detecting migration...');
-    setTimeout(checkMigration, 5000);
-}
-
-function clearEvents() {
-    term.onResize(() => {});
-    term.onData(() => {});
-}
-
-function windowUnload(e) {
-    let message = "Are you sure you want to leave this page?";
-
-    e = e || window.event;
-    if (e) {
-       e.returnValue = message;
-    }
-
-    return message;
-}
-
-function stopTerminal(event) {
-    event = event || {};
-    clearEvents();
-    clearInterval(ping);
-    socket.close();
-    updateState(states.disconnected, event.reason, event.code);
-}
-
-function errorTerminal(event) {
-    event = event || {};
-    clearEvents();
-    clearInterval(ping);
-    socket.close();
-    term.dispose();
-    updateState(states.disconnected, event.msg, event.code);
-}
diff --git a/src/www/style.css b/src/www/style.css
deleted file mode 100644 (file)
index 04db7d5..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-html,body {
-    height: 100%;
-    min-height: 100%;
-    margin: 0;
-    padding: 0;
-    overflow: hidden;
-    font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace;
-    background-color: #101010;
-}
-
-.terminal {
-    background-color: #101010;
-    color: #f0f0f0;
-    font-size: 10pt;
-    font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace;
-    font-variant-ligatures: none;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-}
-
-.terminal .xterm-viewport {
-    background-color: rgba(121, 121, 121, 0);
-    -webkit-background-clip: text;
-    -webkit-text-fill-color: transparent;
-    transition: background-color 800ms linear;
-}
-
-/* fix line height on firefox */
-.xterm-rows > div > span {
-    display: inline-block;
-}
-
-#terminal-container {
-    height: 100%;
-    width: auto;
-}
-
-#wrap {
-    height: 100%;
-    width: auto;
-    box-sizing: border-box;
-    padding: 5px;
-}
-
-#status_bar {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  z-index: 500;
-  transform: translateY(-100%);
-
-  transition: 0.25s ease-in-out;
-
-  visibility: hidden;
-  opacity: 0;
-
-  padding: 5px;
-
-  display: flex;
-  flex-direction: row;
-  justify-content: center;
-  align-content: center;
-
-  line-height: 25px;
-  color: #fff;
-
-  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
-}
-
-#status_bar.open {
-  transform: translateY(0);
-  visibility: visible;
-  opacity: 1;
-}
-
-#status_bar.normal {
-  background: rgba(128,128,128,0.9);
-}
-#status_bar.error {
-  background: rgba(200,55,55,0.9);
-}
-#status_bar.warning {
-  background: rgba(180,180,30,0.9);
-}
-
-#pve_start_info {
-    color: white;
-    text-align: center;
-    font-size: 20px;
-    padding: 6px;
-}
-
-#connect_dlg {
-  transition: 0.2s ease-in-out;
-
-  transform: scale(0, 0);
-  visibility: hidden;
-  opacity: 0;
-  font-family: Helvetica;
-}
-
-#connect_dlg.pve_open {
-  transform: scale(1, 1);
-  visibility: visible;
-  opacity: 1;
-}
-
-#connect_btn {
-  cursor: pointer;
-  padding: 6px;
-  color: white;
-  background:#4c4c4c;;
-  border-radius: 8px;
-  text-align: center;
-  font-size: 20px;
-  box-shadow: 4px 4px 0px rgba(0, 0, 0, 0.5);
-}
-#connect_btn div {
-  margin: 2px;
-  padding: 5px 30px;
-  border: 1px solid #2f2f2f;
-  border-bottom-width: 2px;
-  border-radius: 5px;
-  background:#4c4c4c;;
-
-  /* This avoids it jumping around when :active */
-  vertical-align: middle;
-}
-#connect_btn div:active {
-  border-bottom-width: 1px;
-  margin-top: 3px;
-}
-
-div.center {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-}
diff --git a/src/www/util.js b/src/www/util.js
deleted file mode 100644 (file)
index 52cad21..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-function urlEncode(object) {
-    var i,value, params = [];
-
-    for (i in object) {
-       if (object.hasOwnProperty(i)) {
-           value = object[i];
-           if (value === undefined) value = '';
-           params.push(encodeURIComponent(i) + '=' + encodeURIComponent(String(value)));
-       }
-    }
-
-    return params.join('&');
-}
-
-var msgtimeout;
-var severities = {
-    normal:  1,
-    warning: 2,
-    error:   3,
-};
-
-function showMsg(message, timeout, severity) {
-    var status_bar = document.getElementById('status_bar');
-    clearTimeout(msgtimeout);
-
-    status_bar.classList.remove('normal');
-    status_bar.classList.remove('warning');
-    status_bar.classList.remove('error');
-
-    status_bar.textContent = message;
-
-    severity = severity || severities.normal;
-
-    switch (severity) {
-       case severities.normal: 
-           status_bar.classList.add('normal');
-           break;
-       case severities.warning: 
-           status_bar.classList.add('warning');
-           break;
-       case severities.error: 
-           status_bar.classList.add('error');
-           break;
-       default:
-           throw "unknown severity";
-    }
-
-    status_bar.classList.add('open');
-
-    if (timeout !== 0) {
-       msgtimeout = setTimeout(hideMsg, timeout || 1500);
-    }
-}
-
-function hideMsg() {
-    clearTimeout(msgtimeout);
-    status_bar.classList.remove('open');
-}
-
-function getQueryParameter(name) {
-    var params = location.search.slice(1).split('&');
-    var result = "";
-    params.forEach(function(param) {
-       var components = param.split('=');
-       if (components[0] === name) {
-           result = components.slice(1).join('=');
-       }
-    });
-    return result;
-}
-
-function API2Request(reqOpts) {
-    var me = this;
-
-    reqOpts.method = reqOpts.method || 'GET';
-
-    var xhr = new XMLHttpRequest();
-
-    xhr.onload = function() {
-       var scope = reqOpts.scope || this;
-       var result;
-       var errmsg;
-
-       if (xhr.readyState === 4) {
-           var ctype = xhr.getResponseHeader('Content-Type');
-           if (xhr.status === 200) {
-               if (ctype.match(/application\/json;/)) {
-                   result = JSON.parse(xhr.responseText);
-               } else {
-                   errmsg = 'got unexpected content type ' + ctype;
-               }
-           } else {
-               errmsg = 'Error ' + xhr.status + ': ' + xhr.statusText;
-           }
-       } else {
-           errmsg = 'Connection error - server offline?';
-       }
-
-       if (errmsg !== undefined) {
-           if (reqOpts.failure) {
-               reqOpts.failure.call(scope, errmsg);
-           }
-       } else {
-           if (reqOpts.success) {
-               reqOpts.success.call(scope, result);
-           }
-       }
-       if (reqOpts.callback) {
-           reqOpts.callback.call(scope, errmsg === undefined);
-       }
-    }
-
-    var data = urlEncode(reqOpts.params || {});
-
-    if (reqOpts.method === 'GET') {
-       xhr.open(reqOpts.method, "/api2/json" + reqOpts.url + '?' + data);
-    } else {
-       xhr.open(reqOpts.method, "/api2/json" + reqOpts.url);
-    }
-    xhr.setRequestHeader('Cache-Control', 'no-cache');
-    if (reqOpts.method === 'POST' || reqOpts.method === 'PUT') {
-       xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-       xhr.setRequestHeader('CSRFPreventionToken', PVE.CSRFPreventionToken);
-       xhr.send(data);
-    } else if (reqOpts.method === 'GET') {
-       xhr.send();
-    } else {
-       throw "unknown method";
-    }
-}
-
-function getTerminalSettings() {
-    var res = {};
-    var settings = ['fontSize', 'fontFamily', 'letterSpacing', 'lineHeight'];
-    if(localStorage) {
-       settings.forEach(function(setting) {
-           var val = localStorage.getItem('pve-xterm-' + setting);
-           if (val !== undefined && val !== null) {
-               res[setting] = val;
-           }
-       });
-    }
-    return res;
-}
diff --git a/src/www/xterm-addon-fit.js b/src/www/xterm-addon-fit.js
deleted file mode 100644 (file)
index 7cfd9de..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})()));
-//# sourceMappingURL=xterm-addon-fit.js.map
\ No newline at end of file
diff --git a/src/www/xterm-addon-fit.js.map b/src/www/xterm-addon-fit.js.map
deleted file mode 100644 (file)
index 33a9297..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"xterm-addon-fit.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAkB,SAAID,IAEtBD,EAAe,SAAIC,GACpB,CATD,CASGK,MAAM,I,mHCcT,iBAGS,QAAAC,CAASC,GACdC,KAAKC,UAAYF,CACnB,CAEO,OAAAG,GAAiB,CAEjB,GAAAC,GACL,MAAMC,EAAOJ,KAAKK,oBAClB,IAAKD,IAASJ,KAAKC,WAAaK,MAAMF,EAAKG,OAASD,MAAMF,EAAKI,MAC7D,OAIF,MAAMC,EAAQT,KAAKC,UAAkBS,MAGjCV,KAAKC,UAAUO,OAASJ,EAAKI,MAAQR,KAAKC,UAAUM,OAASH,EAAKG,OACpEE,EAAKE,eAAeC,QACpBZ,KAAKC,UAAUY,OAAOT,EAAKG,KAAMH,EAAKI,MAE1C,CAEO,iBAAAH,GACL,IAAKL,KAAKC,UACR,OAGF,IAAKD,KAAKC,UAAUa,UAAYd,KAAKC,UAAUa,QAAQC,cACrD,OAIF,MAAMN,EAAQT,KAAKC,UAAkBS,MAC/BN,EAA0BK,EAAKE,eAAeK,WAEpD,GAA4B,IAAxBZ,EAAKa,IAAIC,KAAKC,OAAwC,IAAzBf,EAAKa,IAAIC,KAAKE,OAC7C,OAGF,MAAMC,EAAuD,IAAtCrB,KAAKC,UAAUqB,QAAQC,WAC5C,EAAId,EAAKe,SAASC,eAEdC,EAAqBC,OAAOC,iBAAiB5B,KAAKC,UAAUa,QAAQC,eACpEc,EAAsBC,SAASJ,EAAmBK,iBAAiB,WACnEC,EAAqBC,KAAKC,IAAI,EAAGJ,SAASJ,EAAmBK,iBAAiB,WAC9EI,EAAeR,OAAOC,iBAAiB5B,KAAKC,UAAUa,SAStDsB,EAAkBP,GAPjBC,SAASK,EAAaJ,iBAAiB,gBACpCD,SAASK,EAAaJ,iBAAiB,oBAO3CM,EAAiBL,GANdF,SAASK,EAAaJ,iBAAiB,kBACxCD,SAASK,EAAaJ,iBAAiB,kBAKiBV,EAKhE,MAJiB,CACfd,KAAM0B,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMD,EAAiBjC,EAAKa,IAAIC,KAAKC,QACvEX,KAAMyB,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMF,EAAkBhC,EAAKa,IAAIC,KAAKE,SAG5E,E","sources":["webpack://FitAddon/webpack/universalModuleDefinition","webpack://FitAddon/./src/FitAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FitAddon\"] = factory();\n\telse\n\t\troot[\"FitAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal, ITerminalAddon } from 'xterm';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\n\ninterface ITerminalDimensions {\n  /**\n   * The number of rows in the terminal.\n   */\n  rows: number;\n\n  /**\n   * The number of columns in the terminal.\n   */\n  cols: number;\n}\n\nconst MINIMUM_COLS = 2;\nconst MINIMUM_ROWS = 1;\n\nexport class FitAddon implements ITerminalAddon {\n  private _terminal: Terminal | undefined;\n\n  public activate(terminal: Terminal): void {\n    this._terminal = terminal;\n  }\n\n  public dispose(): void {}\n\n  public fit(): void {\n    const dims = this.proposeDimensions();\n    if (!dims || !this._terminal || isNaN(dims.cols) || isNaN(dims.rows)) {\n      return;\n    }\n\n    // TODO: Remove reliance on private API\n    const core = (this._terminal as any)._core;\n\n    // Force a full render\n    if (this._terminal.rows !== dims.rows || this._terminal.cols !== dims.cols) {\n      core._renderService.clear();\n      this._terminal.resize(dims.cols, dims.rows);\n    }\n  }\n\n  public proposeDimensions(): ITerminalDimensions | undefined {\n    if (!this._terminal) {\n      return undefined;\n    }\n\n    if (!this._terminal.element || !this._terminal.element.parentElement) {\n      return undefined;\n    }\n\n    // TODO: Remove reliance on private API\n    const core = (this._terminal as any)._core;\n    const dims: IRenderDimensions = core._renderService.dimensions;\n\n    if (dims.css.cell.width === 0 || dims.css.cell.height === 0) {\n      return undefined;\n    }\n\n    const scrollbarWidth = this._terminal.options.scrollback === 0 ?\n      0 : core.viewport.scrollBarWidth;\n\n    const parentElementStyle = window.getComputedStyle(this._terminal.element.parentElement);\n    const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));\n    const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));\n    const elementStyle = window.getComputedStyle(this._terminal.element);\n    const elementPadding = {\n      top: parseInt(elementStyle.getPropertyValue('padding-top')),\n      bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),\n      right: parseInt(elementStyle.getPropertyValue('padding-right')),\n      left: parseInt(elementStyle.getPropertyValue('padding-left'))\n    };\n    const elementPaddingVer = elementPadding.top + elementPadding.bottom;\n    const elementPaddingHor = elementPadding.right + elementPadding.left;\n    const availableHeight = parentElementHeight - elementPaddingVer;\n    const availableWidth = parentElementWidth - elementPaddingHor - scrollbarWidth;\n    const geometry = {\n      cols: Math.max(MINIMUM_COLS, Math.floor(availableWidth / dims.css.cell.width)),\n      rows: Math.max(MINIMUM_ROWS, Math.floor(availableHeight / dims.css.cell.height))\n    };\n    return geometry;\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","self","activate","terminal","this","_terminal","dispose","fit","dims","proposeDimensions","isNaN","cols","rows","core","_core","_renderService","clear","resize","element","parentElement","dimensions","css","cell","width","height","scrollbarWidth","options","scrollback","viewport","scrollBarWidth","parentElementStyle","window","getComputedStyle","parentElementHeight","parseInt","getPropertyValue","parentElementWidth","Math","max","elementStyle","availableHeight","availableWidth","floor"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/www/xterm-addon-webgl.js b/src/www/xterm-addon-webgl.js
deleted file mode 100644 (file)
index d020f0d..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebglAddon=t():e.WebglAddon=t()}(self,(()=>(()=>{"use strict";var e={965:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.GlyphRenderer=void 0;const r=i(374),o=i(509),n=i(855),a=i(859),h=i(776),l=i(381),c=11,d=c*Float32Array.BYTES_PER_ELEMENT;let _,u=0,g=0,v=0;class f extends a.Disposable{constructor(e,t,i){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const s=this._gl;void 0===o.TextureAtlas.maxAtlasPages&&(o.TextureAtlas.maxAtlasPages=Math.min(32,(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS))),o.TextureAtlas.maxTextureSize=(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_SIZE))),this._program=(0,r.throwIfFalsy)((0,l.createProgram)(s,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(e){let t="";for(let i=1;i<e;i++)t+=` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;return`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${e}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${t}\n}`}(o.TextureAtlas.maxAtlasPages))),this.register((0,a.toDisposable)((()=>s.deleteProgram(this._program)))),this._projectionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=s.createVertexArray(),s.bindVertexArray(this._vertexArrayObject);const n=new Float32Array([0,0,1,0,0,1,1,1]),h=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(h)))),s.bindBuffer(s.ARRAY_BUFFER,h),s.bufferData(s.ARRAY_BUFFER,n,s.STATIC_DRAW),s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(_)))),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,_),s.bufferData(s.ELEMENT_ARRAY_BUFFER,c,s.STATIC_DRAW),this._attributesBuffer=(0,r.throwIfFalsy)(s.createBuffer()),this.register((0,a.toDisposable)((()=>s.deleteBuffer(this._attributesBuffer)))),s.bindBuffer(s.ARRAY_BUFFER,this._attributesBuffer),s.enableVertexAttribArray(2),s.vertexAttribPointer(2,2,s.FLOAT,!1,d,0),s.vertexAttribDivisor(2,1),s.enableVertexAttribArray(3),s.vertexAttribPointer(3,2,s.FLOAT,!1,d,2*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(3,1),s.enableVertexAttribArray(4),s.vertexAttribPointer(4,1,s.FLOAT,!1,d,4*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(4,1),s.enableVertexAttribArray(5),s.vertexAttribPointer(5,2,s.FLOAT,!1,d,5*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(5,1),s.enableVertexAttribArray(6),s.vertexAttribPointer(6,2,s.FLOAT,!1,d,7*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(6,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,2,s.FLOAT,!1,d,9*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(1,1),s.useProgram(this._program);const u=new Int32Array(o.TextureAtlas.maxAtlasPages);for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++)u[e]=e;s.uniform1iv(this._textureLocation,u),s.uniformMatrix4fv(this._projectionLocation,!1,l.PROJECTION_MATRIX),this._atlasTextures=[];for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++){const t=new l.GLTexture((0,r.throwIfFalsy)(s.createTexture()));this.register((0,a.toDisposable)((()=>s.deleteTexture(t.texture)))),s.activeTexture(s.TEXTURE0+e),s.bindTexture(s.TEXTURE_2D,t.texture),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,1,1,0,s.RGBA,s.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[e]=t}s.enable(s.BLEND),s.blendFunc(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.beginFrame()}updateCell(e,t,i,s,r,o,n,a){this._updateCell(this._vertices.attributes,e,t,i,s,r,o,n,a)}_updateCell(e,t,i,s,r,o,a,h,l){u=(i*this._terminal.cols+t)*c,s!==n.NULL_CELL_CODE&&void 0!==s?this._atlas&&(_=h&&h.length>1?this._atlas.getRasterizedGlyphCombinedChar(h,r,o,a,!1):this._atlas.getRasterizedGlyph(s,r,o,a,!1),g=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),r!==l&&_.offset.x>g?(v=_.offset.x-g,e[u]=-(_.offset.x-v)+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=(_.size.x-v)/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x+v/this._atlas.pages[_.texturePage].canvas.width,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x-v/this._atlas.pages[_.texturePage].canvas.width,e[u+8]=_.sizeClipSpace.y):(e[u]=-_.offset.x+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=_.size.x/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x,e[u+8]=_.sizeClipSpace.y)):e.fill(0,u,u+c-1-2)}clear(){const e=this._terminal,t=e.cols*e.rows*c;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let i=0;for(;i<this._vertices.attributesBuffers.length;i++)this._vertices.count!==t?this._vertices.attributesBuffers[i]=new Float32Array(t):this._vertices.attributesBuffers[i].fill(0);this._vertices.count=t,i=0;for(let t=0;t<e.rows;t++)for(let s=0;s<e.cols;s++)this._vertices.attributes[i+9]=s/e.cols,this._vertices.attributes[i+10]=t/e.rows,i+=c}handleResize(){const e=this._gl;e.useProgram(this._program),e.viewport(0,0,e.canvas.width,e.canvas.height),e.uniform2f(this._resolutionLocation,e.canvas.width,e.canvas.height),this.clear()}render(e){if(!this._atlas)return;const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),this._activeBuffer=(this._activeBuffer+1)%2;const i=this._vertices.attributesBuffers[this._activeBuffer];let s=0;for(let t=0;t<e.lineLengths.length;t++){const r=t*this._terminal.cols*c,o=this._vertices.attributes.subarray(r,r+e.lineLengths[t]*c);i.set(o,s),s+=o.length}t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,i.subarray(0,s),t.STREAM_DRAW);for(let e=0;e<this._atlas.pages.length;e++)this._atlas.pages[e].version!==this._atlasTextures[e].version&&this._bindAtlasPageTexture(t,this._atlas,e);t.drawElementsInstanced(t.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,s/c)}setAtlas(e){this._atlas=e;for(const e of this._atlasTextures)e.version=-1}_bindAtlasPageTexture(e,t,i){e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,this._atlasTextures[i].texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.pages[i].canvas),e.generateMipmap(e.TEXTURE_2D),this._atlasTextures[i].version=t.pages[i].version}setDimensions(e){this._dimensions=e}}t.GlyphRenderer=f,s([h.traceCall],f.prototype,"updateCell",null)},742:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RectangleRenderer=void 0;const s=i(374),r=i(859),o=i(310),n=i(381),a=8*Float32Array.BYTES_PER_ELEMENT;class h{constructor(){this.attributes=new Float32Array(160),this.count=0}}let l=0,c=0,d=0,_=0,u=0,g=0,v=0;class f extends r.Disposable{constructor(e,t,i,o){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._themeService=o,this._vertices=new h,this._verticesCursor=new h;const l=this._gl;this._program=(0,s.throwIfFalsy)((0,n.createProgram)(l,"#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}","#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}")),this.register((0,r.toDisposable)((()=>l.deleteProgram(this._program)))),this._projectionLocation=(0,s.throwIfFalsy)(l.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=l.createVertexArray(),l.bindVertexArray(this._vertexArrayObject);const c=new Float32Array([0,0,1,0,0,1,1,1]),d=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(d)))),l.bindBuffer(l.ARRAY_BUFFER,d),l.bufferData(l.ARRAY_BUFFER,c,l.STATIC_DRAW),l.enableVertexAttribArray(3),l.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),u=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(u)))),l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,u),l.bufferData(l.ELEMENT_ARRAY_BUFFER,_,l.STATIC_DRAW),this._attributesBuffer=(0,s.throwIfFalsy)(l.createBuffer()),this.register((0,r.toDisposable)((()=>l.deleteBuffer(this._attributesBuffer)))),l.bindBuffer(l.ARRAY_BUFFER,this._attributesBuffer),l.enableVertexAttribArray(0),l.vertexAttribPointer(0,2,l.FLOAT,!1,a,0),l.vertexAttribDivisor(0,1),l.enableVertexAttribArray(1),l.vertexAttribPointer(1,2,l.FLOAT,!1,a,2*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(1,1),l.enableVertexAttribArray(2),l.vertexAttribPointer(2,4,l.FLOAT,!1,a,4*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(2,1),this._updateCachedColors(o.colors),this.register(this._themeService.onChangeColors((e=>{this._updateCachedColors(e),this._updateViewportRectangle()})))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,n.PROJECTION_MATRIX),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){const t=this._terminal,i=this._vertices;let s,r,n,a,h,l,c,d,_,u,g,v=1;for(s=0;s<t.rows;s++){for(n=-1,a=0,h=0,l=!1,r=0;r<t.cols;r++)c=(s*t.cols+r)*o.RENDER_MODEL_INDICIES_PER_CELL,d=e.cells[c+o.RENDER_MODEL_BG_OFFSET],_=e.cells[c+o.RENDER_MODEL_FG_OFFSET],u=!!(67108864&_),(d!==a||_!==h&&(l||u))&&((0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,r,s)),n=r,a=d,h=_,l=u);(0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,t.cols,s))}i.count=v}updateCursor(e){const t=this._verticesCursor,i=e.cursor;if(!i||"block"===i.style)return void(t.count=0);let s,r=0;"bar"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,"bar"===i.style?i.dpr*i.cursorWidth:i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),"underline"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,(i.y+1)*this._dimensions.device.cell.height-i.dpr,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat)),"outline"===i.style&&(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat),s=8*r++,this._addRectangleFloat(t.attributes,s,(i.x+i.width)*this._dimensions.device.cell.width-i.dpr,i.y*this._dimensions.device.cell.height,i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=r}_updateRectangle(e,t,i,s,r,o,a){if(67108864&i)switch(50331648&i){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&i].rgba;break;case 50331648:l=(16777215&i)<<8;break;default:l=this._themeService.colors.foreground.rgba}else switch(50331648&s){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&s].rgba;break;case 50331648:l=(16777215&s)<<8;break;default:l=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=(0,n.expandFloat32Array)(e.attributes,this._terminal.rows*this._terminal.cols*8)),c=r*this._dimensions.device.cell.width,d=a*this._dimensions.device.cell.height,_=(l>>24&255)/255,u=(l>>16&255)/255,g=(l>>8&255)/255,v=1,this._addRectangle(e.attributes,t,c,d,(o-r)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,_,u,g,v)}_addRectangle(e,t,i,s,r,o,n,a,h,l){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n,e[t+5]=a,e[t+6]=h,e[t+7]=l}_addRectangleFloat(e,t,i,s,r,o,n){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n[0],e[t+5]=n[1],e[t+6]=n[2],e[t+7]=n[3]}_colorToFloat32Array(e){return new Float32Array([(e.rgba>>24&255)/255,(e.rgba>>16&255)/255,(e.rgba>>8&255)/255,(255&e.rgba)/255])}}t.RectangleRenderer=f},310:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderModel=t.COMBINED_CHAR_BIT_MASK=t.RENDER_MODEL_EXT_OFFSET=t.RENDER_MODEL_FG_OFFSET=t.RENDER_MODEL_BG_OFFSET=t.RENDER_MODEL_INDICIES_PER_CELL=void 0;const s=i(296);t.RENDER_MODEL_INDICIES_PER_CELL=4,t.RENDER_MODEL_BG_OFFSET=1,t.RENDER_MODEL_FG_OFFSET=2,t.RENDER_MODEL_EXT_OFFSET=3,t.COMBINED_CHAR_BIT_MASK=2147483648,t.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(e,i){const s=e*i*t.RENDER_MODEL_INDICIES_PER_CELL;s!==this.cells.length&&(this.cells=new Uint32Array(s),this.lineLengths=new Uint32Array(i))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},666:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.JoinedCellData=t.WebglRenderer=void 0;const r=i(820),o=i(274),n=i(627),a=i(457),h=i(56),l=i(374),c=i(345),d=i(859),_=i(147),u=i(782),g=i(855),v=i(776),f=i(965),p=i(742),C=i(310),m=i(733);class L extends d.Disposable{constructor(e,t,i,s,a,_,g,v,f){super(),this._terminal=e,this._characterJoinerService=t,this._charSizeService=i,this._coreBrowserService=s,this._coreService=a,this._decorationService=_,this._optionsService=g,this._themeService=v,this._cursorBlinkStateManager=new d.MutableDisposable,this._charAtlasDisposable=this.register(new d.MutableDisposable),this._model=new C.RenderModel,this._workCell=new u.CellData,this._rectangleRenderer=this.register(new d.MutableDisposable),this._glyphRenderer=this.register(new d.MutableDisposable),this._onChangeTextureAtlas=this.register(new c.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new c.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new c.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onRequestRedraw=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRequestRedraw.event,this._onContextLoss=this.register(new c.EventEmitter),this.onContextLoss=this._onContextLoss.event,this.register(this._themeService.onChangeColors((()=>this._handleColorChange()))),this._cellColorResolver=new o.CellColorResolver(this._terminal,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new m.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier2,this._coreBrowserService,g,this._themeService)],this.dimensions=(0,l.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this.register(g.onOptionChange((()=>this._handleOptionsChanged()))),this._canvas=document.createElement("canvas");const p={antialias:!1,depth:!1,preserveDrawingBuffer:f};if(this._gl=this._canvas.getContext("webgl2",p),!this._gl)throw new Error("WebGL2 not supported "+this._gl);this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextlost",(e=>{console.log("webglcontextlost event received"),e.preventDefault(),this._contextRestorationTimeout=setTimeout((()=>{this._contextRestorationTimeout=void 0,console.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(e)}),3e3)}))),this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextrestored",(e=>{console.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,n.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()}))),this.register((0,h.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,((e,t)=>this._setCanvasDevicePixelDimensions(e,t)))),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._coreBrowserService.window.document.body.contains(this._core.screenElement),this.register((0,d.toDisposable)((()=>{var e;for(const e of this._renderLayers)e.dispose();null===(e=this._canvas.parentElement)||void 0===e||e.removeChild(this._canvas),(0,n.removeTerminalFromCache)(this._terminal)})))}get textureAtlas(){var e;return null===(e=this._charAtlas)||void 0===e?void 0:e.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(e,t){var i,s,r,o;this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows);for(const e of this._renderLayers)e.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,null===(i=this._rectangleRenderer.value)||void 0===i||i.setDimensions(this.dimensions),null===(s=this._rectangleRenderer.value)||void 0===s||s.handleResize(),null===(r=this._glyphRenderer.value)||void 0===r||r.setDimensions(this.dimensions),null===(o=this._glyphRenderer.value)||void 0===o||o.handleResize(),this._refreshCharAtlas(),this._clearModel(!1)}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){var e;for(const e of this._renderLayers)e.handleBlur(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.pause(),this._requestRedrawViewport()}handleFocus(){var e;for(const e of this._renderLayers)e.handleFocus(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.resume(),this._requestRedrawViewport()}handleSelectionChanged(e,t,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,e,t,i);this._model.selection.update(this._terminal,e,t,i),this._requestRedrawViewport()}handleCursorMove(){var e;for(const e of this._renderLayers)e.handleCursorMove(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new p.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService),this._glyphRenderer.value=new f.GlyphRenderer(this._terminal,this._gl,this.dimensions),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){var e;if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,n.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,d.getDisposeArrayDisposable)([(0,c.forwardEvent)(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),(0,c.forwardEvent)(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)])),this._charAtlas=t,this._charAtlas.warmUp(),null===(e=this._glyphRenderer.value)||void 0===e||e.setAtlas(this._charAtlas)}_clearModel(e){var t;this._model.clear(),e&&(null===(t=this._glyphRenderer.value)||void 0===t||t.clear())}clearTextureAtlas(){var e;null===(e=this._charAtlas)||void 0===e||e.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){var e;this._clearModel(!0);for(const e of this._renderLayers)e.reset(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation(),this._updateCursorBlink()}registerCharacterJoiner(e){return-1}deregisterCharacterJoiner(e){return!1}renderRows(e,t){if(!this._isAttached){if(!(this._coreBrowserService.window.document.body.contains(this._core.screenElement)&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,e,t);this._glyphRenderer.value&&this._rectangleRenderer.value&&(this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(e,t),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor())}_updateCursorBlink(){this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager((()=>{this._requestRedrawCursor()}),this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(e,t){const i=this._core;let s,r,o,n,a,h,l,c,d,_,u,v,f,p=this._workCell;e=w(e,i.rows-1,0),t=w(t,i.rows-1,0);const m=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,L=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let b=-1;const R=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let M=!1;for(r=e;r<=t;r++)for(o=r+i.buffer.ydisp,n=i.buffer.lines.get(o),this._model.lineLengths[r]=0,a=this._characterJoinerService.getJoinedCharacters(o),v=0;v<i.cols;v++)if(s=this._cellColorResolver.result.bg,n.loadCell(v,p),0===v&&(s=this._cellColorResolver.result.bg),h=!1,l=v,a.length>0&&v===a[0][0]&&(h=!0,c=a.shift(),p=new x(p,n.translateToString(!0,c[0],c[1]),c[1]-c[0]),l=c[1]-1),d=p.getChars(),_=p.getCode(),u=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._cellColorResolver.resolve(p,v,o),R&&o===m&&(v===L&&(this._model.cursor={x:L,y:this._terminal.buffer.active.cursorY,width:p.getWidth(),style:this._coreBrowserService.isFocused?i.options.cursorStyle||"block":i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},b=L+p.getWidth()-1),v>=L&&v<=b&&(this._coreBrowserService.isFocused&&"block"===(i.options.cursorStyle||"block")||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),_!==g.NULL_CELL_CODE&&(this._model.lineLengths[r]=v+1),(this._model.cells[u]!==_||this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]!==this._cellColorResolver.result.bg||this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]!==this._cellColorResolver.result.fg||this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]!==this._cellColorResolver.result.ext)&&(M=!0,d.length>1&&(_|=C.COMBINED_CHAR_BIT_MASK),this._model.cells[u]=_,this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext,this._glyphRenderer.value.updateCell(v,r,_,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,d,s),h))for(p=this._workCell,v++;v<l;v++)f=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._glyphRenderer.value.updateCell(v,r,g.NULL_CELL_CODE,0,0,0,g.NULL_CELL_CHAR,0),this._model.cells[f]=g.NULL_CELL_CODE,this._model.cells[f+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[f+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[f+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext;M&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(e,t){this._canvas.width===e&&this._canvas.height===t||(this._canvas.width=e,this._canvas.height=t,this._requestRedrawViewport())}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const e=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:e,end:e})}}t.WebglRenderer=L,s([v.traceCall],L.prototype,"renderRows",null);class x extends _.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function w(e,t,i=0){return Math.max(Math.min(e,t),i)}t.JoinedCellData=x},381:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GLTexture=t.expandFloat32Array=t.createShader=t.createProgram=t.PROJECTION_MATRIX=void 0;const s=i(374);function r(e,t,i){const r=(0,s.throwIfFalsy)(e.createShader(t));if(e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.error(e.getShaderInfoLog(r)),e.deleteShader(r)}t.PROJECTION_MATRIX=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]),t.createProgram=function(e,t,i){const o=(0,s.throwIfFalsy)(e.createProgram());if(e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.VERTEX_SHADER,t))),e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.FRAGMENT_SHADER,i))),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;console.error(e.getProgramInfoLog(o)),e.deleteProgram(o)},t.createShader=r,t.expandFloat32Array=function(e,t){const i=Math.min(2*e.length,t),s=new Float32Array(i);for(let t=0;t<e.length;t++)s[t]=e[t];return s},t.GLTexture=class{constructor(e){this.texture=e,this.version=-1}}},592:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BaseRenderLayer=void 0;const s=i(627),r=i(237),o=i(374),n=i(859);class a extends n.Disposable{constructor(e,t,i,s,r,o,a,h){super(),this._container=t,this._alpha=r,this._coreBrowserService=o,this._optionsService=a,this._themeService=h,this._deviceCharWidth=0,this._deviceCharHeight=0,this._deviceCellWidth=0,this._deviceCellHeight=0,this._deviceCharLeft=0,this._deviceCharTop=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add(`xterm-${i}-layer`),this._canvas.style.zIndex=s.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this.register(this._themeService.onChangeColors((t=>{this._refreshCharAtlas(e,t),this.reset(e)}))),this.register((0,n.toDisposable)((()=>{this._canvas.remove()})))}_initCanvas(){this._ctx=(0,o.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(e){}handleFocus(e){}handleCursorMove(e){}handleGridChanged(e,t,i){}handleSelectionChanged(e,t,i,s=!1){}_setTransparency(e,t){if(t===this._alpha)return;const i=this._canvas;this._alpha=t,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(e,this._themeService.colors),this.handleGridChanged(e,0,e.rows-1)}_refreshCharAtlas(e,t){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(e,this._optionsService.rawOptions,t,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr),this._charAtlas.warmUp())}resize(e,t){this._deviceCellWidth=t.device.cell.width,this._deviceCellHeight=t.device.cell.height,this._deviceCharWidth=t.device.char.width,this._deviceCharHeight=t.device.char.height,this._deviceCharLeft=t.device.char.left,this._deviceCharTop=t.device.char.top,this._canvas.width=t.device.canvas.width,this._canvas.height=t.device.canvas.height,this._canvas.style.width=`${t.css.canvas.width}px`,this._canvas.style.height=`${t.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(e,this._themeService.colors)}_fillBottomLineAtCells(e,t,i=1){this._ctx.fillRect(e*this._deviceCellWidth,(t+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(e,t,i,s){this._alpha?this._ctx.clearRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(e,t,i,s){this._ctx.font=this._getFont(e,!1,!1),this._ctx.textBaseline=r.TEXT_BASELINE,this._clipCell(i,s,t.getWidth()),this._ctx.fillText(t.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(e,t,i){this._ctx.beginPath(),this._ctx.rect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(e,t,i){return`${i?"italic":""} ${t?e.options.fontWeightBold:e.options.fontWeight} ${e.options.fontSize*this._coreBrowserService.dpr}px ${e.options.fontFamily}`}}t.BaseRenderLayer=a},733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkRenderLayer=void 0;const s=i(197),r=i(237),o=i(592);class n extends o.BaseRenderLayer{constructor(e,t,i,s,r,o,n){super(i,e,"link",t,!0,r,o,n),this.register(s.onShowLinkUnderline((e=>this._handleShowLinkUnderline(e)))),this.register(s.onHideLinkUnderline((e=>this._handleHideLinkUnderline(e))))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==e.fg&&(0,s.is256Color)(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e}_handleHideLinkUnderline(e){this._clearCurrentLink()}}t.LinkRenderLayer=n},820:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},274:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellColorResolver=void 0;let i,s=0,r=0,o=!1,n=!1,a=!1;t.CellColorResolver=class{constructor(e,t,i,s,r){this._terminal=e,this._selectionRenderModel=t,this._decorationService=i,this._coreBrowserService=s,this._themeService=r,this.result={fg:0,bg:0,ext:0}}resolve(e,t,h){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=268435456&e.bg?e.extended.ext:0,r=0,s=0,n=!1,o=!1,a=!1,i=this._themeService.colors,this._decorationService.forEachDecorationAtCell(t,h,"bottom",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),a=this._selectionRenderModel.isCellSelected(this._terminal,t,h),a&&(r=(this._coreBrowserService.isFocused?i.selectionBackgroundOpaque:i.selectionInactiveBackgroundOpaque).rgba>>8&16777215,n=!0,i.selectionForeground&&(s=i.selectionForeground.rgba>>8&16777215,o=!0)),this._decorationService.forEachDecorationAtCell(t,h,"top",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),n&&(r=a?-16777216&e.bg&-134217729|r|50331648:-16777216&e.bg|r|50331648),o&&(s=-16777216&e.fg&-67108865|s|50331648),67108864&this.result.fg&&(n&&!o&&(s=0==(50331648&this.result.bg)?-134217728&this.result.fg|16777215&i.background.rgba>>8|50331648:-134217728&this.result.fg|67108863&this.result.bg,o=!0),!n&&o&&(r=0==(50331648&this.result.fg)?-67108864&this.result.bg|16777215&i.foreground.rgba>>8|50331648:-67108864&this.result.bg|67108863&this.result.fg,n=!0)),i=void 0,this.result.bg=n?r:this.result.bg,this.result.fg=o?s:this.result.fg}}},627:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.removeTerminalFromCache=t.acquireTextureAtlas=void 0;const s=i(509),r=i(197),o=[];t.acquireTextureAtlas=function(e,t,i,n,a,h,l,c){const d=(0,r.generateConfig)(n,a,h,l,t,i,c);for(let t=0;t<o.length;t++){const i=o[t],s=i.ownedBy.indexOf(e);if(s>=0){if((0,r.configEquals)(i.config,d))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),o.splice(t,1)):i.ownedBy.splice(s,1);break}}for(let t=0;t<o.length;t++){const i=o[t];if((0,r.configEquals)(i.config,d))return i.ownedBy.push(e),i.atlas}const _=e._core,u={atlas:new s.TextureAtlas(document,d,_.unicodeService),config:d,ownedBy:[e]};return o.push(u),u.atlas},t.removeTerminalFromCache=function(e){for(let t=0;t<o.length;t++){const i=o[t].ownedBy.indexOf(e);if(-1!==i){1===o[t].ownedBy.length?(o[t].atlas.dispose(),o.splice(t,1)):o[t].ownedBy.splice(i,1);break}}}},197:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.is256Color=t.configEquals=t.generateConfig=void 0;const s=i(160);t.generateConfig=function(e,t,i,r,o,n,a){const h={foreground:n.foreground,background:n.background,cursor:s.NULL_COLOR,cursorAccent:s.NULL_COLOR,selectionForeground:s.NULL_COLOR,selectionBackgroundTransparent:s.NULL_COLOR,selectionBackgroundOpaque:s.NULL_COLOR,selectionInactiveBackgroundTransparent:s.NULL_COLOR,selectionInactiveBackgroundOpaque:s.NULL_COLOR,ansi:n.ansi.slice(),contrastCache:n.contrastCache,halfContrastCache:n.halfContrastCache};return{customGlyphs:o.customGlyphs,devicePixelRatio:a,letterSpacing:o.letterSpacing,lineHeight:o.lineHeight,deviceCellWidth:e,deviceCellHeight:t,deviceCharWidth:i,deviceCharHeight:r,fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontWeightBold:o.fontWeightBold,allowTransparency:o.allowTransparency,drawBoldTextInBrightColors:o.drawBoldTextInBrightColors,minimumContrastRatio:o.minimumContrastRatio,colors:h}},t.configEquals=function(e,t){for(let i=0;i<e.colors.ansi.length;i++)if(e.colors.ansi[i].rgba!==t.colors.ansi[i].rgba)return!1;return e.devicePixelRatio===t.devicePixelRatio&&e.customGlyphs===t.customGlyphs&&e.lineHeight===t.lineHeight&&e.letterSpacing===t.letterSpacing&&e.fontFamily===t.fontFamily&&e.fontSize===t.fontSize&&e.fontWeight===t.fontWeight&&e.fontWeightBold===t.fontWeightBold&&e.allowTransparency===t.allowTransparency&&e.deviceCharWidth===t.deviceCharWidth&&e.deviceCharHeight===t.deviceCharHeight&&e.drawBoldTextInBrightColors===t.drawBoldTextInBrightColors&&e.minimumContrastRatio===t.minimumContrastRatio&&e.colors.foreground.rgba===t.colors.foreground.rgba&&e.colors.background.rgba===t.colors.background.rgba},t.is256Color=function(e){return 16777216==(50331648&e)||33554432==(50331648&e)}},237:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(399);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},457:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CursorBlinkStateManager=void 0;t.CursorBlinkStateManager=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this.isCursorVisible=!0,this._coreBrowserService.isFocused&&this._restartInterval()}get isPaused(){return!(this._blinkStartTimeout||this._blinkInterval)}dispose(){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}restartBlinkAnimation(){this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,e>0)return void this._restartInterval(e)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0})),this._blinkInterval=this._coreBrowserService.window.setInterval((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(e)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))}),600)}),e)}pause(){this.isCursorVisible=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()}}},860:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tryDrawCustomChar=t.powerlineDefinitions=t.boxDrawingDefinitions=t.blockElementDefinitions=void 0;const s=i(374);t.blockElementDefinitions={"▀":[{x:0,y:0,w:8,h:4}],"▁":[{x:0,y:7,w:8,h:1}],"▂":[{x:0,y:6,w:8,h:2}],"▃":[{x:0,y:5,w:8,h:3}],"▄":[{x:0,y:4,w:8,h:4}],"▅":[{x:0,y:3,w:8,h:5}],"▆":[{x:0,y:2,w:8,h:6}],"▇":[{x:0,y:1,w:8,h:7}],"█":[{x:0,y:0,w:8,h:8}],"▉":[{x:0,y:0,w:7,h:8}],"▊":[{x:0,y:0,w:6,h:8}],"▋":[{x:0,y:0,w:5,h:8}],"▌":[{x:0,y:0,w:4,h:8}],"▍":[{x:0,y:0,w:3,h:8}],"▎":[{x:0,y:0,w:2,h:8}],"▏":[{x:0,y:0,w:1,h:8}],"▐":[{x:4,y:0,w:4,h:8}],"▔":[{x:0,y:0,w:8,h:1}],"▕":[{x:7,y:0,w:1,h:8}],"▖":[{x:0,y:4,w:4,h:4}],"▗":[{x:4,y:4,w:4,h:4}],"▘":[{x:0,y:0,w:4,h:4}],"▙":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"▚":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],"▛":[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}],"▜":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],"▝":[{x:4,y:0,w:4,h:4}],"▞":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],"▟":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"🭰":[{x:1,y:0,w:1,h:8}],"🭱":[{x:2,y:0,w:1,h:8}],"🭲":[{x:3,y:0,w:1,h:8}],"🭳":[{x:4,y:0,w:1,h:8}],"🭴":[{x:5,y:0,w:1,h:8}],"🭵":[{x:6,y:0,w:1,h:8}],"🭶":[{x:0,y:1,w:8,h:1}],"🭷":[{x:0,y:2,w:8,h:1}],"🭸":[{x:0,y:3,w:8,h:1}],"🭹":[{x:0,y:4,w:8,h:1}],"🭺":[{x:0,y:5,w:8,h:1}],"🭻":[{x:0,y:6,w:8,h:1}],"🭼":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🭽":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭾":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭿":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🮀":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮁":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮂":[{x:0,y:0,w:8,h:2}],"🮃":[{x:0,y:0,w:8,h:3}],"🮄":[{x:0,y:0,w:8,h:5}],"🮅":[{x:0,y:0,w:8,h:6}],"🮆":[{x:0,y:0,w:8,h:7}],"🮇":[{x:6,y:0,w:2,h:8}],"🮈":[{x:5,y:0,w:3,h:8}],"🮉":[{x:3,y:0,w:5,h:8}],"🮊":[{x:2,y:0,w:6,h:8}],"🮋":[{x:1,y:0,w:7,h:8}],"🮕":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],"🮖":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],"🮗":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]};const r={"░":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],"▒":[[1,0],[0,0],[0,1],[0,0]],"▓":[[0,1],[1,1],[1,0],[1,1]]};t.boxDrawingDefinitions={"─":{1:"M0,.5 L1,.5"},"━":{3:"M0,.5 L1,.5"},"│":{1:"M.5,0 L.5,1"},"┃":{3:"M.5,0 L.5,1"},"┌":{1:"M0.5,1 L.5,.5 L1,.5"},"┏":{3:"M0.5,1 L.5,.5 L1,.5"},"┐":{1:"M0,.5 L.5,.5 L.5,1"},"┓":{3:"M0,.5 L.5,.5 L.5,1"},"└":{1:"M.5,0 L.5,.5 L1,.5"},"┗":{3:"M.5,0 L.5,.5 L1,.5"},"┘":{1:"M.5,0 L.5,.5 L0,.5"},"┛":{3:"M.5,0 L.5,.5 L0,.5"},"├":{1:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┣":{3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┤":{1:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┫":{3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┬":{1:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┳":{3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┴":{1:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┻":{3:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┼":{1:"M0,.5 L1,.5 M.5,0 L.5,1"},"╋":{3:"M0,.5 L1,.5 M.5,0 L.5,1"},"╴":{1:"M.5,.5 L0,.5"},"╸":{3:"M.5,.5 L0,.5"},"╵":{1:"M.5,.5 L.5,0"},"╹":{3:"M.5,.5 L.5,0"},"╶":{1:"M.5,.5 L1,.5"},"╺":{3:"M.5,.5 L1,.5"},"╷":{1:"M.5,.5 L.5,1"},"╻":{3:"M.5,.5 L.5,1"},"═":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"║":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╒":{1:(e,t)=>`M.5,1 L.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╓":{1:(e,t)=>`M${.5-e},1 L${.5-e},.5 L1,.5 M${.5+e},.5 L${.5+e},1`},"╔":{1:(e,t)=>`M1,${.5-t} L${.5-e},${.5-t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╕":{1:(e,t)=>`M0,${.5-t} L.5,${.5-t} L.5,1 M0,${.5+t} L.5,${.5+t}`},"╖":{1:(e,t)=>`M${.5+e},1 L${.5+e},.5 L0,.5 M${.5-e},.5 L${.5-e},1`},"╗":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5+e},${.5-t} L${.5+e},1`},"╘":{1:(e,t)=>`M.5,0 L.5,${.5+t} L1,${.5+t} M.5,${.5-t} L1,${.5-t}`},"╙":{1:(e,t)=>`M1,.5 L${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╚":{1:(e,t)=>`M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0 M1,${.5+t} L${.5-e},${.5+t} L${.5-e},0`},"╛":{1:(e,t)=>`M0,${.5+t} L.5,${.5+t} L.5,0 M0,${.5-t} L.5,${.5-t}`},"╜":{1:(e,t)=>`M0,.5 L${.5+e},.5 L${.5+e},0 M${.5-e},.5 L${.5-e},0`},"╝":{1:(e,t)=>`M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M0,${.5+t} L${.5+e},${.5+t} L${.5+e},0`},"╞":{1:(e,t)=>`M.5,0 L.5,1 M.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╟":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1 M${.5+e},.5 L1,.5`},"╠":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╡":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L.5,${.5-t} M0,${.5+t} L.5,${.5+t}`},"╢":{1:(e,t)=>`M0,.5 L${.5-e},.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╣":{1:(e,t)=>`M${.5+e},0 L${.5+e},1 M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0`},"╤":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t} M.5,${.5+t} L.5,1`},"╥":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},1 M${.5+e},.5 L${.5+e},1`},"╦":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╧":{1:(e,t)=>`M.5,0 L.5,${.5-t} M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╨":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╩":{1:(e,t)=>`M0,${.5+t} L1,${.5+t} M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╪":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╫":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╬":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╱":{1:"M1,0 L0,1"},"╲":{1:"M0,0 L1,1"},"╳":{1:"M1,0 L0,1 M0,0 L1,1"},"╼":{1:"M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"╽":{1:"M.5,.5 L.5,0",3:"M.5,.5 L.5,1"},"╾":{1:"M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"╿":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┍":{1:"M.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┎":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┑":{1:"M.5,.5 L.5,1",3:"M.5,.5 L0,.5"},"┒":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┕":{1:"M.5,.5 L.5,0",3:"M.5,.5 L1,.5"},"┖":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┙":{1:"M.5,.5 L.5,0",3:"M.5,.5 L0,.5"},"┚":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,0"},"┝":{1:"M.5,0 L.5,1",3:"M.5,.5 L1,.5"},"┞":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┟":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┠":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1"},"┡":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"┢":{1:"M.5,.5 L.5,0",3:"M0.5,1 L.5,.5 L1,.5"},"┥":{1:"M.5,0 L.5,1",3:"M.5,.5 L0,.5"},"┦":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┧":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┨":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1"},"┩":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L0,.5"},"┪":{1:"M.5,.5 L.5,0",3:"M0,.5 L.5,.5 L.5,1"},"┭":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┮":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┯":{1:"M.5,.5 L.5,1",3:"M0,.5 L1,.5"},"┰":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"┱":{1:"M.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"┲":{1:"M.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"┵":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┶":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┷":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5"},"┸":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,0"},"┹":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"┺":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,.5 L1,.5"},"┽":{1:"M.5,0 L.5,1 M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┾":{1:"M.5,0 L.5,1 M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┿":{1:"M.5,0 L.5,1",3:"M0,.5 L1,.5"},"╀":{1:"M0,.5 L1,.5 M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"╁":{1:"M.5,.5 L.5,0 M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"╂":{1:"M0,.5 L1,.5",3:"M.5,0 L.5,1"},"╃":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"╄":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"╅":{1:"M.5,0 L.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"╆":{1:"M.5,0 L.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"╇":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0 M0,.5 L1,.5"},"╈":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"╉":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"╊":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"╌":{1:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"╍":{3:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"┄":{1:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┅":{3:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┈":{1:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"┉":{3:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"╎":{1:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"╏":{3:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"┆":{1:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┇":{3:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┊":{1:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"┋":{3:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"╭":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,1,.5`},"╮":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,0,.5`},"╯":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,0,.5`},"╰":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,1,.5`}},t.powerlineDefinitions={"":{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2},"":{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2},"":{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1},"":{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1},"":{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1},"":{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0},"":{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.tryDrawCustomChar=function(e,i,n,l,c,d,_,u){const g=t.blockElementDefinitions[i];if(g)return function(e,t,i,s,r,o){for(let n=0;n<t.length;n++){const a=t[n],h=r/8,l=o/8;e.fillRect(i+a.x*h,s+a.y*l,a.w*h,a.h*l)}}(e,g,n,l,c,d),!0;const v=r[i];if(v)return function(e,t,i,r,n,a){let h=o.get(t);h||(h=new Map,o.set(t,h));const l=e.fillStyle;if("string"!=typeof l)throw new Error(`Unexpected fillStyle type "${l}"`);let c=h.get(l);if(!c){const i=t[0].length,r=t.length,o=document.createElement("canvas");o.width=i,o.height=r;const n=(0,s.throwIfFalsy)(o.getContext("2d")),a=new ImageData(i,r);let d,_,u,g;if(l.startsWith("#"))d=parseInt(l.slice(1,3),16),_=parseInt(l.slice(3,5),16),u=parseInt(l.slice(5,7),16),g=l.length>7&&parseInt(l.slice(7,9),16)||1;else{if(!l.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${l}" when drawing pattern glyph`);[d,_,u,g]=l.substring(5,l.length-1).split(",").map((e=>parseFloat(e)))}for(let e=0;e<r;e++)for(let s=0;s<i;s++)a.data[4*(e*i+s)]=d,a.data[4*(e*i+s)+1]=_,a.data[4*(e*i+s)+2]=u,a.data[4*(e*i+s)+3]=t[e][s]*(255*g);n.putImageData(a,0,0),c=(0,s.throwIfFalsy)(e.createPattern(o,null)),h.set(l,c)}e.fillStyle=c,e.fillRect(i,r,n,a)}(e,v,n,l,c,d),!0;const f=t.boxDrawingDefinitions[i];if(f)return function(e,t,i,s,r,o,n){e.strokeStyle=e.fillStyle;for(const[l,c]of Object.entries(t)){let t;e.beginPath(),e.lineWidth=n*Number.parseInt(l),t="function"==typeof c?c(.15,.15/o*r):c;for(const l of t.split(" ")){const t=l[0],c=a[t];if(!c){console.error(`Could not find drawing instructions for "${t}"`);continue}const d=l.substring(1).split(",");d[0]&&d[1]&&c(e,h(d,r,o,i,s,!0,n))}e.stroke(),e.closePath()}}(e,f,n,l,c,d,u),!0;const p=t.powerlineDefinitions[i];return!!p&&(function(e,t,i,s,r,o,n,l){var c,d;const _=new Path2D;_.rect(i,s,r,o),e.clip(_),e.beginPath();const u=n/12;e.lineWidth=l*u;for(const n of t.d.split(" ")){const _=n[0],g=a[_];if(!g){console.error(`Could not find drawing instructions for "${_}"`);continue}const v=n.substring(1).split(",");v[0]&&v[1]&&g(e,h(v,r,o,i,s,!1,l,(null!==(c=t.leftPadding)&&void 0!==c?c:0)*(u/2),(null!==(d=t.rightPadding)&&void 0!==d?d:0)*(u/2)))}1===t.type?(e.strokeStyle=e.fillStyle,e.stroke()):e.fill(),e.closePath()}(e,p,n,l,c,d,_,u),!0)};const o=new Map;function n(e,t,i=0){return Math.max(Math.min(e,t),i)}const a={C:(e,t)=>e.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5]),L:(e,t)=>e.lineTo(t[0],t[1]),M:(e,t)=>e.moveTo(t[0],t[1])};function h(e,t,i,s,r,o,a,h=0,l=0){const c=e.map((e=>parseFloat(e)||parseInt(e)));if(c.length<2)throw new Error("Too few arguments for instruction");for(let e=0;e<c.length;e+=2)c[e]*=t-h*a-l*a,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,t,0)),c[e]+=s+h*a;for(let e=1;e<c.length;e+=2)c[e]*=i,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,i,0)),c[e]+=r;return c}},56:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.observeDevicePixelDimensions=void 0;const s=i(859);t.observeDevicePixelDimensions=function(e,t,i){let r=new t.ResizeObserver((t=>{const s=t.find((t=>t.target===e));if(!s)return;if(!("devicePixelContentBoxSize"in s))return null==r||r.disconnect(),void(r=void 0);const o=s.devicePixelContentBoxSize[0].inlineSize,n=s.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&i(o,n)}));try{r.observe(e,{box:["device-pixel-content-box"]})}catch(e){r.disconnect(),r=void 0}return(0,s.toDisposable)((()=>null==r?void 0:r.disconnect()))}},374:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},296:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=t[1]-e.buffer.active.viewportY,o=i[1]-e.buffer.active.viewportY,n=Math.max(r,0),a=Math.min(o,e.rows-1);n>=e.rows||a<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=r,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=a,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t<this.endCol&&i<=this.viewportCappedEndRow:t<this.startCol&&i>=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},509:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.TextureAtlas=void 0;const r=i(237),o=i(860),n=i(374),a=i(160),h=i(345),l=i(485),c=i(385),d=i(147),_=i(855),u=i(776),g={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let v;class f{get pages(){return this._pages}constructor(e,t,i){this._document=e,this._config=t,this._unicodeService=i,this._didWarmUp=!1,this._cacheMap=new l.FourKeyMap,this._cacheMapCombined=new l.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new d.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new h.EventEmitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new h.EventEmitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=m(e,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,n.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){for(const e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const e=new c.IdleTaskQueue;for(let t=33;t<126;t++)e.enqueue((()=>{if(!this._cacheMap.get(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT)){const e=this._drawToCache(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT);this._cacheMap.set(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT,e)}}))}beginFrame(){return this._requestClearModel}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(f.maxAtlasPages&&this._pages.length>=Math.max(4,f.maxAtlasPages)){const e=this._pages.filter((e=>2*e.canvas.width<=(f.maxTextureSize||4096))).sort(((e,t)=>t.canvas.width!==e.canvas.width?t.canvas.width-e.canvas.width:t.percentageUsed-e.percentageUsed));let t=-1,i=0;for(let s=0;s<e.length;s++)if(e[s].canvas.width!==i)t=s,i=e[s].canvas.width;else if(s-t==3)break;const s=e.slice(t,t+4),r=s.map((e=>e.glyphs[0].texturePage)).sort(((e,t)=>e>t?1:-1)),o=this.pages.length-s.length,n=this._mergePages(s,o);n.version++;for(let e=r.length-1;e>=0;e--)this._deletePage(r[e]);this.pages.push(n),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(n.canvas)}const e=new p(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){const i=2*e[0].canvas.width,s=new p(this._document,i,e);for(const[r,o]of e.entries()){const e=r*o.canvas.width%i,n=Math.floor(r/2)*o.canvas.height;s.ctx.drawImage(o.canvas,e,n);for(const s of o.glyphs)s.texturePage=t,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=e,s.texturePosition.y+=n,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(o.canvas);const a=this._activePages.indexOf(o);-1!==a&&this._activePages.splice(a,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t<this._pages.length;t++){const e=this._pages[t];for(const t of e.glyphs)t.texturePage--;e.version++}}getRasterizedGlyphCombinedChar(e,t,i,s,r){return this._getFromCacheMap(this._cacheMapCombined,e,t,i,s,r)}getRasterizedGlyph(e,t,i,s,r){return this._getFromCacheMap(this._cacheMap,e,t,i,s,r)}_getFromCacheMap(e,t,i,s,r,o=!1){return v=e.get(t,i,s,r),v||(v=this._drawToCache(t,i,s,r,o),e.set(t,i,s,r,v)),v}_getColorFromAnsiIndex(e){if(e>=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,i,s){if(this._config.allowTransparency)return a.NULL_COLOR;let r;switch(e){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(t);break;case 50331648:const e=d.AttributeData.toColorRGB(t);r=a.rgba.toColor(e[0],e[1],e[2]);break;default:r=i?a.color.opaque(this._config.colors.foreground):this._config.colors.background}return r}_getForegroundColor(e,t,i,s,o,n,h,l,c,_){const u=this._getMinimumContrastColor(e,t,i,s,o,n,!1,c,l,_);if(u)return u;let g;switch(o){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&c&&n<8&&(n+=8),g=this._getColorFromAnsiIndex(n);break;case 50331648:const e=d.AttributeData.toColorRGB(n);g=a.rgba.toColor(e[0],e[1],e[2]);break;default:g=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(g=a.color.opaque(g)),l&&(g=a.color.multiplyOpacity(g,r.DIM_OPACITY)),g}_resolveBackgroundRgba(e,t,i){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,i,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,i,s,r,o,n,h,l,c){if(1===this._config.minimumContrastRatio||c)return;const d=this._getContrastCache(l),_=d.getColor(e,s);if(void 0!==_)return _||void 0;const u=this._resolveBackgroundRgba(t,i,n),g=this._resolveForegroundRgba(r,o,n,h),v=a.rgba.ensureContrastRatio(u,g,this._config.minimumContrastRatio/(l?2:1));if(!v)return void d.setColor(e,s,null);const f=a.rgba.toColor(v>>24&255,v>>16&255,v>>8&255);return d.setColor(e,s,f),f}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,i,s,a=!1){const h="number"==typeof e?String.fromCharCode(e):e,l=Math.min(this._config.deviceCellWidth*Math.max(h.length,2)+4,this._textureSize);this._tmpCanvas.width<l&&(this._tmpCanvas.width=l);const c=Math.min(this._config.deviceCellHeight+8,this._textureSize);if(this._tmpCanvas.height<c&&(this._tmpCanvas.height=c),this._tmpCtx.save(),this._workAttributeData.fg=i,this._workAttributeData.bg=t,this._workAttributeData.extended.ext=s,this._workAttributeData.isInvisible())return g;const _=!!this._workAttributeData.isBold(),u=!!this._workAttributeData.isInverse(),v=!!this._workAttributeData.isDim(),p=!!this._workAttributeData.isItalic(),m=!!this._workAttributeData.isUnderline(),L=!!this._workAttributeData.isStrikethrough(),x=!!this._workAttributeData.isOverline();let w=this._workAttributeData.getFgColor(),b=this._workAttributeData.getFgColorMode(),R=this._workAttributeData.getBgColor(),M=this._workAttributeData.getBgColorMode();if(u){const e=w;w=R,R=e;const t=b;b=M,M=t}const y=this._getBackgroundColor(M,R,u,v);this._tmpCtx.globalCompositeOperation="copy",this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.globalCompositeOperation="source-over";const A=_?this._config.fontWeightBold:this._config.fontWeight,E=p?"italic":"";this._tmpCtx.font=`${E} ${A} ${this._config.fontSize*this._config.devicePixelRatio}px ${this._config.fontFamily}`,this._tmpCtx.textBaseline=r.TEXT_BASELINE;const S=1===h.length&&(0,n.isPowerlineGlyph)(h.charCodeAt(0)),T=1===h.length&&(0,n.isRestrictedPowerlineGlyph)(h.charCodeAt(0)),D=this._getForegroundColor(t,M,R,i,b,w,u,v,_,(0,n.excludeFromContrastRatioDemands)(h.charCodeAt(0)));this._tmpCtx.fillStyle=D.css;const P=T?0:4;let F=!1;!1!==this._config.customGlyphs&&(F=(0,o.tryDrawCustomChar)(this._tmpCtx,h,P,P,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.fontSize,this._config.devicePixelRatio));let B,I=!S;if(B="number"==typeof e?this._unicodeService.wcwidth(e):this._unicodeService.getStringCellWidth(e),m){this._tmpCtx.save();const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;if(this._tmpCtx.lineWidth=e,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())I=!1,this._tmpCtx.strokeStyle=`rgb(${d.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{I=!1;let e=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&e<8&&(e+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(e).css}this._tmpCtx.beginPath();const i=P,s=Math.ceil(P+this._config.deviceCharHeight)-t-(a?2*e:0),r=s+e,o=s+2*e;for(let n=0;n<B;n++){this._tmpCtx.save();const a=i+n*this._config.deviceCellWidth,h=i+(n+1)*this._config.deviceCellWidth,l=a+this._config.deviceCellWidth/2;switch(this._workAttributeData.extended.underlineStyle){case 2:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s),this._tmpCtx.moveTo(a,o),this._tmpCtx.lineTo(h,o);break;case 3:const i=e<=1?o:Math.ceil(P+this._config.deviceCharHeight-e/2)-t,n=e<=1?s:Math.ceil(P+this._config.deviceCharHeight+e/2)-t,c=new Path2D;c.rect(a,s,this._config.deviceCellWidth,o-s),this._tmpCtx.clip(c),this._tmpCtx.moveTo(a-this._config.deviceCellWidth/2,r),this._tmpCtx.bezierCurveTo(a-this._config.deviceCellWidth/2,n,a,n,a,r),this._tmpCtx.bezierCurveTo(a,i,l,i,l,r),this._tmpCtx.bezierCurveTo(l,n,h,n,h,r),this._tmpCtx.bezierCurveTo(h,i,h+this._config.deviceCellWidth/2,i,h+this._config.deviceCellWidth/2,r);break;case 4:this._tmpCtx.setLineDash([Math.round(e),Math.round(e)]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;case 5:this._tmpCtx.setLineDash([4*this._config.devicePixelRatio,3*this._config.devicePixelRatio]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;default:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s)}this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!F&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==h){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const t=this._tmpCtx.measureText(h);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in t&&t.actualBoundingBoxDescent>0){this._tmpCtx.save();const t=new Path2D;t.rect(i,s-Math.ceil(e/2),this._config.deviceCellWidth*B,o-s+Math.ceil(e/2)),this._tmpCtx.clip(t),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(h,P,P+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(x){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+t),this._tmpCtx.stroke()}if(F||this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight),"_"===h&&!this._config.allowTransparency){let e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I);if(e)for(let t=1;t<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight-t),e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I),e);t++);}if(L){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),t=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.stroke()}this._tmpCtx.restore();const O=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let $;if($=this._config.allowTransparency?function(e){for(let t=0;t<e.data.length;t+=4)if(e.data[t+3]>0)return!1;return!0}(O):C(O,y,D,I),$)return g;const k=this._findGlyphBoundingBox(O,this._workBoundingBox,l,T,F,P);let U,N;for(;;){if(0===this._activePages.length){const e=this._createNewPage();U=e,N=e.currentRow,N.height=k.size.y;break}U=this._activePages[this._activePages.length-1],N=U.currentRow;for(const e of this._activePages)k.size.y<=e.currentRow.height&&(U=e,N=e.currentRow);for(let e=this._activePages.length-1;e>=0;e--)for(const t of this._activePages[e].fixedRows)t.height<=N.height&&k.size.y<=t.height&&(U=this._activePages[e],N=t);if(N.y+k.size.y>=U.canvas.height||N.height>k.size.y+2){let e=!1;if(U.currentRow.y+U.currentRow.height+k.size.y>=U.canvas.height){let t;for(const e of this._activePages)if(e.currentRow.y+e.currentRow.height+k.size.y<e.canvas.height){t=e;break}if(t)U=t;else if(f.maxAtlasPages&&this._pages.length>=f.maxAtlasPages&&N.y+k.size.y<=U.canvas.height&&N.height>=k.size.y&&N.x+k.size.x<=U.canvas.width)e=!0;else{const t=this._createNewPage();U=t,N=t.currentRow,N.height=k.size.y,e=!0}}e||(U.currentRow.height>0&&U.fixedRows.push(U.currentRow),N={x:0,y:U.currentRow.y+U.currentRow.height,height:k.size.y},U.fixedRows.push(N),U.currentRow={x:0,y:N.y+N.height,height:0})}if(N.x+k.size.x<=U.canvas.width)break;N===U.currentRow?(N.x=0,N.y+=N.height,N.height=0):U.fixedRows.splice(U.fixedRows.indexOf(N),1)}return k.texturePage=this._pages.indexOf(U),k.texturePosition.x=N.x,k.texturePosition.y=N.y,k.texturePositionClipSpace.x=N.x/U.canvas.width,k.texturePositionClipSpace.y=N.y/U.canvas.height,k.sizeClipSpace.x/=U.canvas.width,k.sizeClipSpace.y/=U.canvas.height,N.height=Math.max(N.height,k.size.y),N.x+=k.size.x,U.ctx.putImageData(O,k.texturePosition.x-this._workBoundingBox.left,k.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,k.size.x,k.size.y),U.addGlyph(k),U.version++,k}_findGlyphBoundingBox(e,t,i,s,r,o){t.top=0;const n=s?this._config.deviceCellHeight:this._tmpCanvas.height,a=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i<n;i++){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.top=i,h=!0;break}}if(h)break}t.left=0,h=!1;for(let i=0;i<o+a;i++){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.left=i,h=!0;break}}if(h)break}t.right=a,h=!1;for(let i=o+a-1;i>=o;i--){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.right=i,h=!0;break}}if(h)break}t.bottom=n,h=!1;for(let i=n-1;i>=0;i--){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.bottom=i,h=!0;break}}if(h)break}return{texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},size:{x:t.right-t.left+1,y:t.bottom-t.top+1},sizeClipSpace:{x:t.right-t.left+1,y:t.bottom-t.top+1},offset:{x:-t.left+o+(s||r?Math.floor((this._config.deviceCellWidth-this._config.deviceCharWidth)/2):0),y:-t.top+o+(s||r?1===this._config.lineHeight?0:Math.round((this._config.deviceCellHeight-this._config.deviceCharHeight)/2):0)}}}}t.TextureAtlas=f,s([u.traceCall],f.prototype,"_drawToCache",null);class p{get percentageUsed(){return this._usedPixels/(this.canvas.width*this.canvas.height)}get glyphs(){return this._glyphs}addGlyph(e){this._glyphs.push(e),this._usedPixels+=e.size.x*e.size.y}constructor(e,t,i){if(this._usedPixels=0,this._glyphs=[],this.version=0,this.currentRow={x:0,y:0,height:0},this.fixedRows=[],i)for(const e of i)this._glyphs.push(...e.glyphs),this._usedPixels+=e._usedPixels;this.canvas=m(e,t,t),this.ctx=(0,n.throwIfFalsy)(this.canvas.getContext("2d",{alpha:!0}))}clear(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.currentRow.x=0,this.currentRow.y=0,this.currentRow.height=0,this.fixedRows.length=0,this.version++}}function C(e,t,i,s){const r=t.rgba>>>24,o=t.rgba>>>16&255,n=t.rgba>>>8&255,a=i.rgba>>>24,h=i.rgba>>>16&255,l=i.rgba>>>8&255,c=Math.floor((Math.abs(r-a)+Math.abs(o-h)+Math.abs(n-l))/12);let d=!0;for(let t=0;t<e.data.length;t+=4)e.data[t]===r&&e.data[t+1]===o&&e.data[t+2]===n||s&&Math.abs(e.data[t]-r)+Math.abs(e.data[t+1]-o)+Math.abs(e.data[t+2]-n)<c?e.data[t+3]=0:d=!1;return d}function m(e,t,i){const s=e.createElement("canvas");return s.width=t,s.height=i,s}},160:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(399);let r=0,o=0,n=0,a=0;var h,l,c,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function g(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${u(e)}${u(t)}${u(i)}${u(s)}`:`#${u(e)}${u(t)}${u(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,o,n]=_.toChannels(e.rgba),{css:h.toCss(r,o,n,a),rgba:h.toRgba(r,o,n,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=c+Math.round((i-c)*a),o=d+Math.round((s-d)*a),n=_+Math.round((l-_)*a),{css:h.toCss(r,o,n),rgba:h.toRgba(r,o,n)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,o,n]=_.toChannels(t),{css:h.toCss(r,o,n),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(l||(t.color=l={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,o,n);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,o,n,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),o=parseInt(s[2]),n=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,o,n,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,o,n,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,o,n,a),css:e}}}(c||(t.css=c={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n>0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n<255||a<255||h<255);)n=Math.min(255,n+Math.ceil(.1*(255-n))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,s,r){const o=d.relativeLuminance(e>>8),n=d.relativeLuminance(s>>8);if(g(o,n)<r){if(n<o){const n=t(e,s,r),a=g(o,d.relativeLuminance(n>>8));if(a<r){const t=i(e,s,r);return a>g(o,d.relativeLuminance(t>>8))?n:t}return n}const a=i(e,s,r),h=g(o,d.relativeLuminance(a>>8));if(h<r){const i=t(e,s,r);return h>g(o,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=g},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},399:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},385:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(399);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class o extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=o,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:o,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},147:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},782:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(133),r=i(855),o=i(147);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=n},855:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},133:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let o=r;o<i;++o){const r=e.charCodeAt(o);if(55296<=r&&r<=56319){if(++o>=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a=0,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=63&this.interim[++n])&&n<4;)r<<=6,r|=o;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=h-n;for(;l<c;){if(l>=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===h?r<128?l--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d<i;){for(;!(!(d<c)||128&(s=e[d])||128&(r=e[d+1])||128&(o=e[d+2])||128&(n=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=o,t[a++]=n,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&o,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,h<65536||h>1114111)continue;t[a++]=h}}return a}}},776:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const o=i(859),n=i(97),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h,l=t.LogService=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.TRACE&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.trace.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}debug(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.DEBUG&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.debug.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}info(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.INFO&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.info.bind(this._optionsService.options.logger))&&void 0!==s?s:console.info,e,t)}warn(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.WARN&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.warn.bind(this._optionsService.options.logger))&&void 0!==s?s:console.warn,e,t)}error(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.ERROR&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.error.bind(this._optionsService.options.logger))&&void 0!==s?s:console.error,e,t)}};t.LogService=l=s([r(0,n.IOptionsService)],l),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==n.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},726:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,o){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,o)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},97:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(726);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.WebglAddon=void 0;const t=i(345),r=i(859),o=i(399),n=i(666),a=i(776);class h extends r.Disposable{constructor(e){if(o.isSafari&&(0,o.getSafariVersion)()<16)throw new Error("Webgl2 is only supported on Safari 16 and above");super(),this._preserveDrawingBuffer=e,this._onChangeTextureAtlas=this.register(new t.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new t.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new t.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this.register(new t.EventEmitter),this.onContextLoss=this._onContextLoss.event}activate(e){const i=e._core;if(!e.element)return void this.register(i.onWillOpen((()=>this.activate(e))));this._terminal=e;const s=i.coreService,o=i.optionsService,h=i,l=h._renderService,c=h._characterJoinerService,d=h._charSizeService,_=h._coreBrowserService,u=h._decorationService,g=h._logService,v=h._themeService;(0,a.setTraceLogger)(g),this._renderer=this.register(new n.WebglRenderer(e,c,d,_,s,u,o,v,this._preserveDrawingBuffer)),this.register((0,t.forwardEvent)(this._renderer.onContextLoss,this._onContextLoss)),this.register((0,t.forwardEvent)(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this.register((0,t.forwardEvent)(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this.register((0,t.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),l.setRenderer(this._renderer),this.register((0,r.toDisposable)((()=>{const t=this._terminal._core._renderService;t.setRenderer(this._terminal._core._createRenderer()),t.handleResize(e.cols,e.rows)})))}get textureAtlas(){var e;return null===(e=this._renderer)||void 0===e?void 0:e.textureAtlas}clearTextureAtlas(){var e;null===(e=this._renderer)||void 0===e||e.clearTextureAtlas()}}e.WebglAddon=h})(),s})()));
-//# sourceMappingURL=xterm-addon-webgl.js.map
\ No newline at end of file
diff --git a/src/www/xterm-addon-webgl.js.map b/src/www/xterm-addon-webgl.js.map
deleted file mode 100644 (file)
index 76b373b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"xterm-addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/../../src/browser/Lifecycle.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CellColorResolver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasCache.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/Constants.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CursorBlinkStateManager.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CustomGlyphs.ts","webpack://WebglAddon/../../src/browser/renderer/shared/DevicePixelObserver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/RendererUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/SelectionRenderModel.ts","webpack://WebglAddon/../../src/browser/renderer/shared/TextureAtlas.ts","webpack://WebglAddon/../../src/common/Color.ts","webpack://WebglAddon/../../src/common/EventEmitter.ts","webpack://WebglAddon/../../src/common/Lifecycle.ts","webpack://WebglAddon/../../src/common/MultiKeyMap.ts","webpack://WebglAddon/../../src/common/Platform.ts","webpack://WebglAddon/../../src/common/TaskQueue.ts","webpack://WebglAddon/../../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../../src/common/buffer/CellData.ts","webpack://WebglAddon/../../src/common/buffer/Constants.ts","webpack://WebglAddon/../../src/common/input/TextDecoder.ts","webpack://WebglAddon/../../src/common/services/LogService.ts","webpack://WebglAddon/../../src/common/services/ServiceRegistry.ts","webpack://WebglAddon/../../src/common/services/Services.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { traceCall } from 'common/services/LogService';\nimport { Terminal } from 'xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\n\ninterface IVertices {\n  attributes: Float32Array;\n  /**\n   * These buffers are the ones used to bind to WebGL, the reason there are\n   * multiple is to allow double buffering to work as you cannot modify the\n   * buffer while it's being used by the GPU. Having multiple lets us start\n   * working on the next frame.\n   */\n  attributesBuffers: Float32Array[];\n  count: number;\n}\n\nconst enum VertexAttribLocations {\n  UNIT_QUAD = 0,\n  CELL_POSITION = 1,\n  OFFSET = 2,\n  SIZE = 3,\n  TEXPAGE = 4,\n  TEXCOORD = 5,\n  TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n  let textureConditionals = '';\n  for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n    textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n  }\n  return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n  private readonly _program: WebGLProgram;\n  private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n  private readonly _projectionLocation: WebGLUniformLocation;\n  private readonly _resolutionLocation: WebGLUniformLocation;\n  private readonly _textureLocation: WebGLUniformLocation;\n  private readonly _atlasTextures: GLTexture[];\n  private readonly _attributesBuffer: WebGLBuffer;\n\n  private _atlas: ITextureAtlas | undefined;\n  private _activeBuffer: number = 0;\n  private readonly _vertices: IVertices = {\n    count: 0,\n    attributes: new Float32Array(0),\n    attributesBuffers: [\n      new Float32Array(0),\n      new Float32Array(0)\n    ]\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    if (TextureAtlas.maxAtlasPages === undefined) {\n      // Typically 8 or 16\n      TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n      // Almost all clients will support >= 4096\n      TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n    }\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n    this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n    this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n    gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n    // Setup static uniforms\n    gl.useProgram(this._program);\n    const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      textureUnits[i] = i;\n    }\n    gl.uniform1iv(this._textureLocation, textureUnits);\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n    // is ever drawn it will show characters as red rectangles.\n    this._atlasTextures = [];\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n      this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n      gl.activeTexture(gl.TEXTURE0 + i);\n      gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n      this._atlasTextures[i] = glTexture;\n    }\n\n    // Allow drawing of transparent texture\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    // Set viewport\n    this.handleResize();\n  }\n\n  public beginFrame(): boolean {\n    return this._atlas ? this._atlas.beginFrame() : true;\n  }\n\n  @traceCall\n  public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n    // should not instantiate any variables unless a new glyph is drawn to the cache where the\n    // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n    // each glyph.\n    this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg);\n  }\n\n  private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n    // Exit early if this is a null character, allow space character to continue as it may have\n    // underline/strikethrough styles\n    if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n      array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n      return;\n    }\n\n    if (!this._atlas) {\n      return;\n    }\n\n    // Get the glyph\n    if (chars && chars.length > 1) {\n      $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n    } else {\n      $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n    }\n\n    $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n    if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n      $clippedPixels = $glyph.offset.x - $leftCellPadding;\n      // a_origin\n      array[$i    ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    } else {\n      // a_origin\n      array[$i    ] = -$glyph.offset.x + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    }\n    // a_cellpos only changes on resize\n  }\n\n  public clear(): void {\n    const terminal = this._terminal;\n    const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n    // Clear vertices\n    if (this._vertices.count !== newCount) {\n      this._vertices.attributes = new Float32Array(newCount);\n    } else {\n      this._vertices.attributes.fill(0);\n    }\n    let i = 0;\n    for (; i < this._vertices.attributesBuffers.length; i++) {\n      if (this._vertices.count !== newCount) {\n        this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n      } else {\n        this._vertices.attributesBuffers[i].fill(0);\n      }\n    }\n    this._vertices.count = newCount;\n    i = 0;\n    for (let y = 0; y < terminal.rows; y++) {\n      for (let x = 0; x < terminal.cols; x++) {\n        this._vertices.attributes[i + 9] = x / terminal.cols;\n        this._vertices.attributes[i + 10] = y / terminal.rows;\n        i += INDICES_PER_CELL;\n      }\n    }\n  }\n\n  public handleResize(): void {\n    const gl = this._gl;\n    gl.useProgram(this._program);\n    gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n    gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n    this.clear();\n  }\n\n  public render(renderModel: IRenderModel): void {\n    if (!this._atlas) {\n      return;\n    }\n\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n    this._activeBuffer = (this._activeBuffer + 1) % 2;\n    const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n    // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n    // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n    // The reasons for this are as follows:\n    // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n    // - To copy either the normal attributes buffer or the selection attributes buffer when there\n    //   is a selection\n    // - So we don't send vertices for all the line-ending whitespace to the GPU\n    let bufferLength = 0;\n    for (let y = 0; y < renderModel.lineLengths.length; y++) {\n      const si = y * this._terminal.cols * INDICES_PER_CELL;\n      const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n      activeBuffer.set(sub, bufferLength);\n      bufferLength += sub.length;\n    }\n\n    // Bind the attributes buffer\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n    // Bind the atlas page texture if they have changed\n    for (let i = 0; i < this._atlas.pages.length; i++) {\n      if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n        this._bindAtlasPageTexture(gl, this._atlas, i);\n      }\n    }\n\n    // Draw the viewport\n    gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n  }\n\n  public setAtlas(atlas: ITextureAtlas): void {\n    this._atlas = atlas;\n    for (const glTexture of this._atlasTextures) {\n      glTexture.version = -1;\n    }\n  }\n\n  private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n    gl.activeTexture(gl.TEXTURE0 + i);\n    gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n    gl.generateMipmap(gl.TEXTURE_2D);\n    this._atlasTextures[i].version = atlas.pages[i].version;\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from 'xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n  POSITION = 0,\n  SIZE = 1,\n  COLOR = 2,\n  UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n  public attributes: Float32Array;\n  public count: number;\n\n  constructor() {\n    this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n    this.count = 0;\n  }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n  private _program: WebGLProgram;\n  private _vertexArrayObject: IWebGLVertexArrayObject;\n  private _attributesBuffer: WebGLBuffer;\n  private _projectionLocation: WebGLUniformLocation;\n  private _bgFloat!: Float32Array;\n  private _cursorFloat!: Float32Array;\n\n  private _vertices: Vertices = new Vertices();\n  private _verticesCursor: Vertices = new Vertices();\n\n  constructor(\n    private _terminal: Terminal,\n    private _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions,\n    private readonly _themeService: IThemeService\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n    gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n    this._updateCachedColors(_themeService.colors);\n    this.register(this._themeService.onChangeColors(e => {\n      this._updateCachedColors(e);\n      this._updateViewportRectangle();\n    }));\n  }\n\n  public renderBackgrounds(): void {\n    this._renderVertices(this._vertices);\n  }\n\n  public renderCursor(): void {\n    this._renderVertices(this._verticesCursor);\n  }\n\n  private _renderVertices(vertices: Vertices): void {\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Bind attributes buffer and draw\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n    gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n  }\n\n  public handleResize(): void {\n    this._updateViewportRectangle();\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n\n  private _updateCachedColors(colors: ReadonlyColorSet): void {\n    this._bgFloat = this._colorToFloat32Array(colors.background);\n    this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n  }\n\n  private _updateViewportRectangle(): void {\n    // Set first rectangle that clears the screen\n    this._addRectangleFloat(\n      this._vertices.attributes,\n      0,\n      0,\n      0,\n      this._terminal.cols * this._dimensions.device.cell.width,\n      this._terminal.rows * this._dimensions.device.cell.height,\n      this._bgFloat\n    );\n  }\n\n  public updateBackgrounds(model: IRenderModel): void {\n    const terminal = this._terminal;\n    const vertices = this._vertices;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let rectangleCount = 1;\n    let y: number;\n    let x: number;\n    let currentStartX: number;\n    let currentBg: number;\n    let currentFg: number;\n    let currentInverse: boolean;\n    let modelIndex: number;\n    let bg: number;\n    let fg: number;\n    let inverse: boolean;\n    let offset: number;\n\n    for (y = 0; y < terminal.rows; y++) {\n      currentStartX = -1;\n      currentBg = 0;\n      currentFg = 0;\n      currentInverse = false;\n      for (x = 0; x < terminal.cols; x++) {\n        modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n        bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n        fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n        inverse = !!(fg & FgFlags.INVERSE);\n        if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n          // A rectangle needs to be drawn if going from non-default to another color\n          if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n            offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n            this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n          }\n          currentStartX = x;\n          currentBg = bg;\n          currentFg = fg;\n          currentInverse = inverse;\n        }\n      }\n      // Finish rectangle if it's still going\n      if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n        offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n        this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n      }\n    }\n    vertices.count = rectangleCount;\n  }\n\n  public updateCursor(model: IRenderModel): void {\n    const vertices = this._verticesCursor;\n    const cursor = model.cursor;\n    if (!cursor || cursor.style === 'block') {\n      vertices.count = 0;\n      return;\n    }\n\n    let offset: number;\n    let rectangleCount = 0;\n\n    if (cursor.style === 'bar' || cursor.style === 'outline') {\n      // Left edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'underline' || cursor.style === 'outline') {\n      // Bottom edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'outline') {\n      // Top edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n      // Right edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n\n    vertices.count = rectangleCount;\n  }\n\n  private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n    if (fg & FgFlags.INVERSE) {\n      switch (fg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (fg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.foreground.rgba;\n      }\n    } else {\n      switch (bg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (bg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.background.rgba;\n      }\n    }\n\n    if (vertices.attributes.length < offset + 4) {\n      vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n    }\n    $x1 = startX * this._dimensions.device.cell.width;\n    $y1 = y * this._dimensions.device.cell.height;\n    $r = (($rgba >> 24) & 0xFF) / 255;\n    $g = (($rgba >> 16) & 0xFF) / 255;\n    $b = (($rgba >> 8 ) & 0xFF) / 255;\n    $a = 1;\n\n    this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n  }\n\n  private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = r;\n    array[offset + 5] = g;\n    array[offset + 6] = b;\n    array[offset + 7] = a;\n  }\n\n  private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = color[0];\n    array[offset + 5] = color[1];\n    array[offset + 6] = color[2];\n    array[offset + 7] = color[3];\n  }\n\n  private _colorToFloat32Array(color: IColor): Float32Array {\n    return new Float32Array([\n      ((color.rgba >> 24) & 0xFF) / 255,\n      ((color.rgba >> 16) & 0xFF) / 255,\n      ((color.rgba >> 8 ) & 0xFF) / 255,\n      ((color.rgba      ) & 0xFF) / 255\n    ]);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n  public cells: Uint32Array;\n  public lineLengths: Uint32Array;\n  public selection: ISelectionRenderModel;\n  public cursor?: ICursorRenderModel;\n\n  constructor() {\n    this.cells = new Uint32Array(0);\n    this.lineLengths = new Uint32Array(0);\n    this.selection = createSelectionRenderModel();\n  }\n\n  public resize(cols: number, rows: number): void {\n    const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n    if (indexCount !== this.cells.length) {\n      this.cells = new Uint32Array(indexCount);\n      this.lineLengths = new Uint32Array(rows);\n    }\n  }\n\n  public clear(): void {\n    this.cells.fill(0, 0);\n    this.lineLengths.fill(0, 0);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n  private _renderLayers: IRenderLayer[];\n  private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n  private _charAtlasDisposable = this.register(new MutableDisposable());\n  private _charAtlas: ITextureAtlas | undefined;\n  private _devicePixelRatio: number;\n\n  private _model: RenderModel = new RenderModel();\n  private _workCell: CellData = new CellData();\n  private _cellColorResolver: CellColorResolver;\n\n  private _canvas: HTMLCanvasElement;\n  private _gl: IWebGL2RenderingContext;\n  private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n  private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n  public readonly dimensions: IRenderDimensions;\n\n  private _core: ITerminal;\n  private _isAttached: boolean;\n  private _contextRestorationTimeout: number | undefined;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>());\n  public readonly onRequestRedraw = this._onRequestRedraw.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _terminal: Terminal,\n    private readonly _characterJoinerService: ICharacterJoinerService,\n    private readonly _charSizeService: ICharSizeService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _coreService: ICoreService,\n    private readonly _decorationService: IDecorationService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _themeService: IThemeService,\n    preserveDrawingBuffer?: boolean\n  ) {\n    super();\n\n    this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n    this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n    this._core = (this._terminal as any)._core;\n\n    this._renderLayers = [\n      new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier2, this._coreBrowserService, _optionsService, this._themeService)\n    ];\n    this.dimensions = createRenderDimensions();\n    this._devicePixelRatio = this._coreBrowserService.dpr;\n    this._updateDimensions();\n    this._updateCursorBlink();\n    this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this._canvas = document.createElement('canvas');\n\n    const contextAttributes = {\n      antialias: false,\n      depth: false,\n      preserveDrawingBuffer\n    };\n    this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n    if (!this._gl) {\n      throw new Error('WebGL2 not supported ' + this._gl);\n    }\n\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n      console.log('webglcontextlost event received');\n      // Prevent the default behavior in order to enable WebGL context restoration.\n      e.preventDefault();\n      // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n      // If not, dispatch the onContextLoss notification to observers.\n      this._contextRestorationTimeout = setTimeout(() => {\n        this._contextRestorationTimeout = undefined;\n        console.warn('webgl context not restored; firing onContextLoss');\n        this._onContextLoss.fire(e);\n      }, 3000 /* ms */);\n    }));\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n      console.warn('webglcontextrestored event received');\n      clearTimeout(this._contextRestorationTimeout);\n      this._contextRestorationTimeout = undefined;\n      // The texture atlas and glyph renderer must be fully reinitialized\n      // because their contents have been lost.\n      removeTerminalFromCache(this._terminal);\n      this._initializeWebGLState();\n      this._requestRedrawViewport();\n    }));\n\n    this.register(observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)));\n\n    this._core.screenElement!.appendChild(this._canvas);\n\n    [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n    this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n    this.register(toDisposable(() => {\n      for (const l of this._renderLayers) {\n        l.dispose();\n      }\n      this._canvas.parentElement?.removeChild(this._canvas);\n      removeTerminalFromCache(this._terminal);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._charAtlas?.pages[0].canvas;\n  }\n\n  private _handleColorChange(): void {\n    this._refreshCharAtlas();\n\n    // Force a full refresh\n    this._clearModel(true);\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // If the device pixel ratio changed, the char atlas needs to be regenerated\n    // and the terminal needs to refreshed\n    if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n      this._devicePixelRatio = this._coreBrowserService.dpr;\n      this.handleResize(this._terminal.cols, this._terminal.rows);\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    // Update character and canvas dimensions\n    this._updateDimensions();\n\n    this._model.resize(this._terminal.cols, this._terminal.rows);\n\n    // Resize all render layers\n    for (const l of this._renderLayers) {\n      l.resize(this._terminal, this.dimensions);\n    }\n\n    // Resize the canvas\n    this._canvas.width = this.dimensions.device.canvas.width;\n    this._canvas.height = this.dimensions.device.canvas.height;\n    this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    // Resize the screen\n    this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    this._rectangleRenderer.value?.setDimensions(this.dimensions);\n    this._rectangleRenderer.value?.handleResize();\n    this._glyphRenderer.value?.setDimensions(this.dimensions);\n    this._glyphRenderer.value?.handleResize();\n\n    this._refreshCharAtlas();\n\n    // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n    // so there is no need to clear it again here.\n    this._clearModel(false);\n  }\n\n  public handleCharSizeChanged(): void {\n    this.handleResize(this._terminal.cols, this._terminal.rows);\n  }\n\n  public handleBlur(): void {\n    for (const l of this._renderLayers) {\n      l.handleBlur(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.pause();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleFocus(): void {\n    for (const l of this._renderLayers) {\n      l.handleFocus(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.resume();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    for (const l of this._renderLayers) {\n      l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n    }\n    this._model.selection.update(this._terminal, start, end, columnSelectMode);\n    this._requestRedrawViewport();\n  }\n\n  public handleCursorMove(): void {\n    for (const l of this._renderLayers) {\n      l.handleCursorMove(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n  }\n\n  private _handleOptionsChanged(): void {\n    this._updateDimensions();\n    this._refreshCharAtlas();\n    this._updateCursorBlink();\n  }\n\n  /**\n   * Initializes members dependent on WebGL context state.\n   */\n  private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n    this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n    this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions);\n\n    // Update dimensions and acquire char atlas\n    this.handleCharSizeChanged();\n\n    return [this._rectangleRenderer.value, this._glyphRenderer.value];\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   */\n  private _refreshCharAtlas(): void {\n    if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n      // Mark as not attached so char atlas gets refreshed on next render\n      this._isAttached = false;\n      return;\n    }\n\n    const atlas = acquireTextureAtlas(\n      this._terminal,\n      this._optionsService.rawOptions,\n      this._themeService.colors,\n      this.dimensions.device.cell.width,\n      this.dimensions.device.cell.height,\n      this.dimensions.device.char.width,\n      this.dimensions.device.char.height,\n      this._coreBrowserService.dpr\n    );\n    if (this._charAtlas !== atlas) {\n      this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n      this._charAtlasDisposable.value = getDisposeArrayDisposable([\n        forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n        forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n      ]);\n    }\n    this._charAtlas = atlas;\n    this._charAtlas.warmUp();\n    this._glyphRenderer.value?.setAtlas(this._charAtlas);\n  }\n\n  /**\n   * Clear the model.\n   * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n   * should be true generally to make sure it is in the same state as the model.\n   */\n  private _clearModel(clearGlyphRenderer: boolean): void {\n    this._model.clear();\n    if (clearGlyphRenderer) {\n      this._glyphRenderer.value?.clear();\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    this._charAtlas?.clearTexture();\n    this._clearModel(true);\n    this._requestRedrawViewport();\n  }\n\n  public clear(): void {\n    this._clearModel(true);\n    for (const l of this._renderLayers) {\n      l.reset(this._terminal);\n    }\n\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n    this._updateCursorBlink();\n  }\n\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    return -1;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): boolean {\n    return false;\n  }\n\n  @traceCall\n  public renderRows(start: number, end: number): void {\n    if (!this._isAttached) {\n      if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n        this._updateDimensions();\n        this._refreshCharAtlas();\n        this._isAttached = true;\n      } else {\n        return;\n      }\n    }\n\n    // Update render layers\n    for (const l of this._renderLayers) {\n      l.handleGridChanged(this._terminal, start, end);\n    }\n\n    if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n      return;\n    }\n\n    // Tell renderer the frame is beginning\n    // upon a model clear also refresh the full viewport model\n    // (also triggered by an atlas page merge, part of #4480)\n    if (this._glyphRenderer.value.beginFrame()) {\n      this._clearModel(true);\n      this._updateModel(0, this._terminal.rows - 1);\n    } else {\n      // just update changed lines to draw\n      this._updateModel(start, end);\n    }\n\n    // Render\n    this._rectangleRenderer.value.renderBackgrounds();\n    this._glyphRenderer.value.render(this._model);\n    if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n      this._rectangleRenderer.value.renderCursor();\n    }\n  }\n\n  private _updateCursorBlink(): void {\n    if (this._terminal.options.cursorBlink) {\n      this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n        this._requestRedrawCursor();\n      }, this._coreBrowserService);\n    } else {\n      this._cursorBlinkStateManager.clear();\n    }\n    // Request a refresh from the terminal as management of rendering is being\n    // moved back to the terminal\n    this._requestRedrawCursor();\n  }\n\n  private _updateModel(start: number, end: number): void {\n    const terminal = this._core;\n    let cell: ICellData = this._workCell;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let lastBg: number;\n    let y: number;\n    let row: number;\n    let line: IBufferLine;\n    let joinedRanges: [number, number][];\n    let isJoined: boolean;\n    let lastCharX: number;\n    let range: [number, number];\n    let chars: string;\n    let code: number;\n    let i: number;\n    let x: number;\n    let j: number;\n    start = clamp(start, terminal.rows - 1, 0);\n    end = clamp(end, terminal.rows - 1, 0);\n\n    const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n    // in case cursor.x == cols adjust visual cursor to cols - 1\n    const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n    let lastCursorX = -1;\n    const isCursorVisible =\n      this._coreService.isCursorInitialized &&\n      !this._coreService.isCursorHidden &&\n      (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n    this._model.cursor = undefined;\n    let modelUpdated = false;\n\n    for (y = start; y <= end; y++) {\n      row = y + terminal.buffer.ydisp;\n      line = terminal.buffer.lines.get(row)!;\n      this._model.lineLengths[y] = 0;\n      joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n      for (x = 0; x < terminal.cols; x++) {\n        lastBg = this._cellColorResolver.result.bg;\n        line.loadCell(x, cell);\n\n        if (x === 0) {\n          lastBg = this._cellColorResolver.result.bg;\n        }\n\n        // If true, indicates that the current character(s) to draw were joined.\n        isJoined = false;\n        lastCharX = x;\n\n        // Process any joined character ranges as needed. Because of how the\n        // ranges are produced, we know that they are valid for the characters\n        // and attributes of our input.\n        if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n          isJoined = true;\n          range = joinedRanges.shift()!;\n\n          // We already know the exact start and end column of the joined range,\n          // so we get the string and width representing it directly.\n          cell = new JoinedCellData(\n            cell,\n            line!.translateToString(true, range[0], range[1]),\n            range[1] - range[0]\n          );\n\n          // Skip over the cells occupied by this range in the loop\n          lastCharX = range[1] - 1;\n        }\n\n        chars = cell.getChars();\n        code = cell.getCode();\n        i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n        // Load colors/resolve overrides into work colors\n        this._cellColorResolver.resolve(cell, x, row);\n\n        // Override colors for cursor cell\n        if (isCursorVisible && row === cursorY) {\n          if (x === cursorX) {\n            this._model.cursor = {\n              x: cursorX,\n              y: this._terminal.buffer.active.cursorY,\n              width: cell.getWidth(),\n              style: this._coreBrowserService.isFocused ?\n                (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n              cursorWidth: terminal.options.cursorWidth,\n              dpr: this._devicePixelRatio\n            };\n            lastCursorX = cursorX + cell.getWidth() - 1;\n          }\n          if (x >= cursorX && x <= lastCursorX &&\n              ((this._coreBrowserService.isFocused &&\n              (terminal.options.cursorStyle || 'block') === 'block') ||\n              (this._coreBrowserService.isFocused === false &&\n              terminal.options.cursorInactiveStyle === 'block'))) {\n            this._cellColorResolver.result.fg =\n              Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n            this._cellColorResolver.result.bg =\n              Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n          }\n        }\n\n        if (code !== NULL_CELL_CODE) {\n          this._model.lineLengths[y] = x + 1;\n        }\n\n        // Nothing has changed, no updates needed\n        if (this._model.cells[i] === code &&\n            this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n            this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n            this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n          continue;\n        }\n\n        modelUpdated = true;\n\n        // Flag combined chars with a bit mask so they're easily identifiable\n        if (chars.length > 1) {\n          code |= COMBINED_CHAR_BIT_MASK;\n        }\n\n        // Cache the results in the model\n        this._model.cells[i] = code;\n        this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n        this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n        this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n        this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg);\n\n        if (isJoined) {\n          // Restore work cell\n          cell = this._workCell;\n\n          // Null out non-first cells\n          for (x++; x < lastCharX; x++) {\n            j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n            this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0);\n            this._model.cells[j] = NULL_CELL_CODE;\n            this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n            this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n            this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n          }\n        }\n      }\n    }\n    if (modelUpdated) {\n      this._rectangleRenderer.value!.updateBackgrounds(this._model);\n    }\n    this._rectangleRenderer.value!.updateCursor(this._model);\n  }\n\n  /**\n   * Recalculates the character and canvas dimensions.\n   */\n  private _updateDimensions(): void {\n    // Perform a new measure if the CharMeasure dimensions are not yet available\n    if (!this._charSizeService.width || !this._charSizeService.height) {\n      return;\n    }\n\n    // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n    // in order for the char atlas glyphs to not be blurry.\n    this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n    // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n    // floating point number in order to ensure there is enough space to draw the character to the\n    // cell.\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n    // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n    // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n    // will always be larger than device char height.\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n    // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n    // Calculate the device cell width, taking the letterSpacing into account.\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n    // Calculate the x offset with a cell that text should draw from in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n    // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n    // the canvas\n    this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n    this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n    // The the size of the canvas on the page. It's important that this rounds to nearest integer\n    // and not ceils as browsers often have floating point precision issues where\n    // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n    // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n    // large for the canvas element size.\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n    // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n    // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n    // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n    // size on the canvas can differ.\n    this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n    this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n  }\n\n  private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n    if (this._canvas.width === width && this._canvas.height === height) {\n      return;\n    }\n    // While the actual canvas size has changed, keep device canvas dimensions as the value before\n    // the change as it's an exact multiple of the cell sizes.\n    this._canvas.width = width;\n    this._canvas.height = height;\n    this._requestRedrawViewport();\n  }\n\n  private _requestRedrawViewport(): void {\n    this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n  }\n\n  private _requestRedrawCursor(): void {\n    const cursorY = this._terminal.buffer.active.cursorY;\n    this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n  }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n  private _width: number;\n  // .content carries no meaning for joined CellData, simply nullify it\n  // thus we have to overload all other .content accessors\n  public content: number = 0;\n  public fg: number;\n  public bg: number;\n  public combinedData: string = '';\n\n  constructor(firstCell: ICellData, chars: string, width: number) {\n    super();\n    this.fg = firstCell.fg;\n    this.bg = firstCell.bg;\n    this.combinedData = chars;\n    this._width = width;\n  }\n\n  public isCombined(): number {\n    // always mark joined cell data as combined\n    return Content.IS_COMBINED_MASK;\n  }\n\n  public getWidth(): number {\n    return this._width;\n  }\n\n  public getChars(): string {\n    return this.combinedData;\n  }\n\n  public getCode(): number {\n    // code always gets the highest possible fake codepoint (read as -1)\n    // this is needed as code is used by caches as identifier\n    return 0x1FFFFF;\n  }\n\n  public setFromCharData(value: CharData): void {\n    throw new Error('not implemented');\n  }\n\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n  2, 0, 0, 0,\n  0, -2, 0, 0,\n  0, 0, 1, 0,\n  -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n  const program = throwIfFalsy(gl.createProgram());\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n  gl.linkProgram(program);\n  const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n  if (success) {\n    return program;\n  }\n\n  console.error(gl.getProgramInfoLog(program));\n  gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n  const shader = throwIfFalsy(gl.createShader(type));\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n  if (success) {\n    return shader;\n  }\n\n  console.error(gl.getShaderInfoLog(shader));\n  gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n  const newLength = Math.min(source.length * 2, max);\n  const newArray = new Float32Array(newLength);\n  for (let i = 0; i < source.length; i++) {\n    newArray[i] = source[i];\n  }\n  return newArray;\n}\n\nexport class GLTexture {\n  public texture: WebGLTexture;\n  public version: number;\n\n  constructor(texture: WebGLTexture) {\n    this.texture = texture;\n    this.version = -1;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n  private _canvas: HTMLCanvasElement;\n  protected _ctx!: CanvasRenderingContext2D;\n  private _deviceCharWidth: number = 0;\n  private _deviceCharHeight: number = 0;\n  private _deviceCellWidth: number = 0;\n  private _deviceCellHeight: number = 0;\n  private _deviceCharLeft: number = 0;\n  private _deviceCharTop: number = 0;\n\n  protected _charAtlas: ITextureAtlas | undefined;\n\n  constructor(\n    terminal: Terminal,\n    private _container: HTMLElement,\n    id: string,\n    zIndex: number,\n    private _alpha: boolean,\n    protected readonly _coreBrowserService: ICoreBrowserService,\n    protected readonly _optionsService: IOptionsService,\n    protected readonly _themeService: IThemeService\n  ) {\n    super();\n    this._canvas = document.createElement('canvas');\n    this._canvas.classList.add(`xterm-${id}-layer`);\n    this._canvas.style.zIndex = zIndex.toString();\n    this._initCanvas();\n    this._container.appendChild(this._canvas);\n    this.register(this._themeService.onChangeColors(e => {\n      this._refreshCharAtlas(terminal, e);\n      this.reset(terminal);\n    }));\n    this.register(toDisposable(() => {\n      this._canvas.remove();\n    }));\n  }\n\n  private _initCanvas(): void {\n    this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n  }\n\n  public handleBlur(terminal: Terminal): void {}\n  public handleFocus(terminal: Terminal): void {}\n  public handleCursorMove(terminal: Terminal): void {}\n  public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n  public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n  protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n    // Do nothing when alpha doesn't change\n    if (alpha === this._alpha) {\n      return;\n    }\n\n    // Create new canvas and replace old one\n    const oldCanvas = this._canvas;\n    this._alpha = alpha;\n    // Cloning preserves properties\n    this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n    this._initCanvas();\n    this._container.replaceChild(this._canvas, oldCanvas);\n\n    // Regenerate char atlas and force a full redraw\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n    this.handleGridChanged(terminal, 0, terminal.rows - 1);\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   * @param terminal The terminal.\n   * @param colorSet The color set to use for the char atlas.\n   */\n  private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n    if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n      return;\n    }\n    this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n    this._charAtlas.warmUp();\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    this._deviceCellWidth = dim.device.cell.width;\n    this._deviceCellHeight = dim.device.cell.height;\n    this._deviceCharWidth = dim.device.char.width;\n    this._deviceCharHeight = dim.device.char.height;\n    this._deviceCharLeft = dim.device.char.left;\n    this._deviceCharTop = dim.device.char.top;\n    this._canvas.width = dim.device.canvas.width;\n    this._canvas.height = dim.device.canvas.height;\n    this._canvas.style.width = `${dim.css.canvas.width}px`;\n    this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n  }\n\n  public abstract reset(terminal: Terminal): void;\n\n  /**\n   * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n   * existing fillStyle on the context.\n   * @param x The column to fill.\n   * @param y The row to fill.\n   */\n  protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n    this._ctx.fillRect(\n      x * this._deviceCellWidth,\n      (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n      width * this._deviceCellWidth,\n      this._coreBrowserService.dpr);\n  }\n\n  /**\n   * Clears the entire canvas.\n   */\n  protected _clearAll(): void {\n    if (this._alpha) {\n      this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n    }\n  }\n\n  /**\n   * Clears 1+ cells completely.\n   * @param x The column to start at.\n   * @param y The row to start at.\n   * @param width The number of columns to clear.\n   * @param height The number of rows to clear.\n   */\n  protected _clearCells(x: number, y: number, width: number, height: number): void {\n    if (this._alpha) {\n      this._ctx.clearRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    }\n  }\n\n  /**\n   * Draws a truecolor character at the cell. The character will be clipped to\n   * ensure that it fits with the cell, including the cell to the right if it's\n   * a wide character. This uses the existing fillStyle on the context.\n   * @param terminal The terminal.\n   * @param cell The cell data for the character to draw.\n   * @param x The column to draw at.\n   * @param y The row to draw at.\n   */\n  protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n    this._ctx.font = this._getFont(terminal, false, false);\n    this._ctx.textBaseline = TEXT_BASELINE;\n    this._clipCell(x, y, cell.getWidth());\n    this._ctx.fillText(\n      cell.getChars(),\n      x * this._deviceCellWidth + this._deviceCharLeft,\n      y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n  }\n\n  /**\n   * Clips a cell to ensure no pixels will be drawn outside of it.\n   * @param x The column to clip.\n   * @param y The row to clip.\n   * @param width The number of columns to clip.\n   */\n  private _clipCell(x: number, y: number, width: number): void {\n    this._ctx.beginPath();\n    this._ctx.rect(\n      x * this._deviceCellWidth,\n      y * this._deviceCellHeight,\n      width * this._deviceCellWidth,\n      this._deviceCellHeight);\n    this._ctx.clip();\n  }\n\n  /**\n   * Gets the current font.\n   * @param terminal The terminal.\n   * @param isBold If we should use the bold fontWeight.\n   */\n  protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n    const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n    const fontStyle = isItalic ? 'italic' : '';\n\n    return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n  }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n  private _state: ILinkifierEvent | undefined;\n\n  constructor(\n    container: HTMLElement,\n    zIndex: number,\n    terminal: Terminal,\n    linkifier2: ILinkifier2,\n    coreBrowserService: ICoreBrowserService,\n    optionsService: IOptionsService,\n    themeService: IThemeService\n  ) {\n    super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n    this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n    this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    super.resize(terminal, dim);\n    // Resizing the canvas discards the contents of the canvas so clear state\n    this._state = undefined;\n  }\n\n  public reset(terminal: Terminal): void {\n    this._clearCurrentLink();\n  }\n\n  private _clearCurrentLink(): void {\n    if (this._state) {\n      this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n      const middleRowCount = this._state.y2 - this._state.y1 - 1;\n      if (middleRowCount > 0) {\n        this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n      }\n      this._clearCells(0, this._state.y2, this._state.x2, 1);\n      this._state = undefined;\n    }\n  }\n\n  private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n    if (e.fg === INVERTED_DEFAULT_COLOR) {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n    } else if (e.fg !== undefined && is256Color(e.fg)) {\n      // 256 color support\n      this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.foreground.css;\n    }\n\n    if (e.y1 === e.y2) {\n      // Single line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n    } else {\n      // Multi-line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n      for (let y = e.y1 + 1; y < e.y2; y++) {\n        this._fillBottomLineAtCells(0, y, e.cols);\n      }\n      this._fillBottomLineAtCells(0, e.y2, e.x2);\n    }\n    this._state = e;\n  }\n\n  private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n    this._clearCurrentLink();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n  node: Element | Window | Document,\n  type: string,\n  handler: (e: any) => void,\n  options?: boolean | AddEventListenerOptions\n): IDisposable {\n  node.addEventListener(type, handler, options);\n  let disposed = false;\n  return {\n    dispose: () => {\n      if (disposed) {\n        return;\n      }\n      disposed = true;\n      node.removeEventListener(type, handler, options);\n    }\n  };\n}\n","import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, FgFlags } from 'common/buffer/Constants';\nimport { IDecorationService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from 'xterm';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\n\nexport class CellColorResolver {\n  /**\n   * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n   * any other calls will share object.\n   */\n  public readonly result: { fg: number, bg: number, ext: number } = {\n    fg: 0,\n    bg: 0,\n    ext: 0\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _selectionRenderModel: ISelectionRenderModel,\n    private readonly _decorationService: IDecorationService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _themeService: IThemeService\n  ) {\n  }\n\n  /**\n   * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n   * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n   */\n  public resolve(cell: ICellData, x: number, y: number): void {\n    this.result.bg = cell.bg;\n    this.result.fg = cell.fg;\n    this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n    // Get any foreground/background overrides, this happens on the model to avoid spreading\n    // override logic throughout the different sub-renderers\n\n    // Reset overrides work variables\n    $bg = 0;\n    $fg = 0;\n    $hasBg = false;\n    $hasFg = false;\n    $isSelected = false;\n    $colors = this._themeService.colors;\n\n    // Apply decorations on the bottom layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Apply the selection color if needed\n    $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n    if ($isSelected) {\n      $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & 0xFFFFFF;\n      $hasBg = true;\n      if ($colors.selectionForeground) {\n        $fg = $colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    }\n\n    // Apply decorations on the top layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n    // ahead of time in order to use the correct cache key\n    if ($hasBg) {\n      if ($isSelected) {\n        // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n      } else {\n        // Non-RGB attributes from model + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n      }\n    }\n    if ($hasFg) {\n      // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n      $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n    }\n\n    // Handle case where inverse was specified by only one of bg override or fg override was set,\n    // resolving the other inverse color and setting the inverse flag if needed.\n    if (this.result.fg & FgFlags.INVERSE) {\n      if ($hasBg && !$hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasFg = true;\n      }\n      if (!$hasBg && $hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasBg = true;\n      }\n    }\n\n    // Release object\n    $colors = undefined;\n\n    // Use the override if it exists\n    this.result.bg = $hasBg ? $bg : this.result.bg;\n    this.result.fg = $hasFg ? $fg : this.result.fg;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from 'xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n  atlas: ITextureAtlas;\n  config: ICharAtlasConfig;\n  // N.B. This implementation potentially holds onto copies of the terminal forever, so\n  // this may cause memory leaks.\n  ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n  terminal: Terminal,\n  options: Required<ITerminalOptions>,\n  colors: ReadonlyColorSet,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  deviceCharWidth: number,\n  deviceCharHeight: number,\n  devicePixelRatio: number\n): ITextureAtlas {\n  const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n  // Check to see if the terminal already owns this config\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    const ownedByIndex = entry.ownedBy.indexOf(terminal);\n    if (ownedByIndex >= 0) {\n      if (configEquals(entry.config, newConfig)) {\n        return entry.atlas;\n      }\n      // The configs differ, release the terminal from the entry\n      if (entry.ownedBy.length === 1) {\n        entry.atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        entry.ownedBy.splice(ownedByIndex, 1);\n      }\n      break;\n    }\n  }\n\n  // Try match a char atlas from the cache\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    if (configEquals(entry.config, newConfig)) {\n      // Add the terminal to the cache entry and return\n      entry.ownedBy.push(terminal);\n      return entry.atlas;\n    }\n  }\n\n  const core: ITerminal = (terminal as any)._core;\n  const newEntry: ITextureAtlasCacheEntry = {\n    atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n    config: newConfig,\n    ownedBy: [terminal]\n  };\n  charAtlasCache.push(newEntry);\n  return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n    if (index !== -1) {\n      if (charAtlasCache[i].ownedBy.length === 1) {\n        // Remove the cache entry if it's the only terminal\n        charAtlasCache[i].atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        // Remove the reference from the cache entry\n        charAtlasCache[i].ownedBy.splice(index, 1);\n      }\n      break;\n    }\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from 'xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n  // null out some fields that don't matter\n  const clonedColors: IColorSet = {\n    foreground: colors.foreground,\n    background: colors.background,\n    cursor: NULL_COLOR,\n    cursorAccent: NULL_COLOR,\n    selectionForeground: NULL_COLOR,\n    selectionBackgroundTransparent: NULL_COLOR,\n    selectionBackgroundOpaque: NULL_COLOR,\n    selectionInactiveBackgroundTransparent: NULL_COLOR,\n    selectionInactiveBackgroundOpaque: NULL_COLOR,\n    // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n    // dynamic character atlas.\n    ansi: colors.ansi.slice(),\n    contrastCache: colors.contrastCache,\n    halfContrastCache: colors.halfContrastCache\n  };\n  return {\n    customGlyphs: options.customGlyphs,\n    devicePixelRatio,\n    letterSpacing: options.letterSpacing,\n    lineHeight: options.lineHeight,\n    deviceCellWidth: deviceCellWidth,\n    deviceCellHeight: deviceCellHeight,\n    deviceCharWidth: deviceCharWidth,\n    deviceCharHeight: deviceCharHeight,\n    fontFamily: options.fontFamily,\n    fontSize: options.fontSize,\n    fontWeight: options.fontWeight,\n    fontWeightBold: options.fontWeightBold,\n    allowTransparency: options.allowTransparency,\n    drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n    minimumContrastRatio: options.minimumContrastRatio,\n    colors: clonedColors\n  };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n  for (let i = 0; i < a.colors.ansi.length; i++) {\n    if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n      return false;\n    }\n  }\n  return a.devicePixelRatio === b.devicePixelRatio &&\n      a.customGlyphs === b.customGlyphs &&\n      a.lineHeight === b.lineHeight &&\n      a.letterSpacing === b.letterSpacing &&\n      a.fontFamily === b.fontFamily &&\n      a.fontSize === b.fontSize &&\n      a.fontWeight === b.fontWeight &&\n      a.fontWeightBold === b.fontWeightBold &&\n      a.allowTransparency === b.allowTransparency &&\n      a.deviceCharWidth === b.deviceCharWidth &&\n      a.deviceCharHeight === b.deviceCharHeight &&\n      a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n      a.minimumContrastRatio === b.minimumContrastRatio &&\n      a.colors.foreground.rgba === b.colors.foreground.rgba &&\n      a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n  return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n  public isCursorVisible: boolean;\n\n  private _animationFrame: number | undefined;\n  private _blinkStartTimeout: number | undefined;\n  private _blinkInterval: number | undefined;\n\n  /**\n   * The time at which the animation frame was restarted, this is used on the\n   * next render to restart the timers so they don't need to restart the timers\n   * multiple times over a short period.\n   */\n  private _animationTimeRestarted: number | undefined;\n\n  constructor(\n    private _renderCallback: () => void,\n    private _coreBrowserService: ICoreBrowserService\n  ) {\n    this.isCursorVisible = true;\n    if (this._coreBrowserService.isFocused) {\n      this._restartInterval();\n    }\n  }\n\n  public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n  public dispose(): void {\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public restartBlinkAnimation(): void {\n    if (this.isPaused) {\n      return;\n    }\n    // Save a timestamp so that the restart can be done on the next interval\n    this._animationTimeRestarted = Date.now();\n    // Force a cursor render to ensure it's visible and in the correct position\n    this.isCursorVisible = true;\n    if (!this._animationFrame) {\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n    }\n  }\n\n  private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n    // Clear any existing interval\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n\n    // Setup the initial timeout which will hide the cursor, this is done before\n    // the regular interval is setup in order to support restarting the blink\n    // animation in a lightweight way (without thrashing clearInterval and\n    // setInterval).\n    this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n      // Check if another animation restart was requested while this was being\n      // started\n      if (this._animationTimeRestarted) {\n        const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n        this._animationTimeRestarted = undefined;\n        if (time > 0) {\n          this._restartInterval(time);\n          return;\n        }\n      }\n\n      // Hide the cursor\n      this.isCursorVisible = false;\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n\n      // Setup the blink interval\n      this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n        // Adjust the animation time if it was restarted\n        if (this._animationTimeRestarted) {\n          // calc time diff\n          // Make restart interval do a setTimeout initially?\n          const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n          this._animationTimeRestarted = undefined;\n          this._restartInterval(time);\n          return;\n        }\n\n        // Invert visibility and render\n        this.isCursorVisible = !this.isCursorVisible;\n        this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n          this._renderCallback();\n          this._animationFrame = undefined;\n        });\n      }, BLINK_INTERVAL);\n    }, timeToStart);\n  }\n\n  public pause(): void {\n    this.isCursorVisible = true;\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public resume(): void {\n    // Clear out any existing timers just in case\n    this.pause();\n\n    this._animationTimeRestarted = undefined;\n    this._restartInterval();\n    this.restartBlinkAnimation();\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n  // Block elements (0x2580-0x2590)\n  '▀': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n  '▁': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n  '▂': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n  '▃': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n  '▄': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n  '▅': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n  '▆': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n  '▇': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n  '█': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n  '▉': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n  '▊': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n  '▋': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n  '▌': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n  '▍': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n  '▎': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n  '▏': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n  '▐': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n  // Block elements (0x2594-0x2595)\n  '▔': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n  '▕': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n  // Terminal graphic characters (0x2596-0x259F)\n  '▖': [{ x: 0, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER LEFT\n  '▗': [{ x: 4, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER RIGHT\n  '▘': [{ x: 0, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER LEFT\n  '▙': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n  '▚': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n  '▛': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n  '▜': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n  '▝': [{ x: 4, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER RIGHT\n  '▞': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n  '▟': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n  // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n  '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n  '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n  '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n  '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n  '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n  '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n  // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n  '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n  '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n  '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n  '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n  '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n  '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n  // LEFT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // LEFT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // UPPER AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // HORIZONTAL ONE EIGHTH BLOCK-1358\n  '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n  // UPPER ONE QUARTER BLOCK\n  '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n  // UPPER THREE EIGHTHS BLOCK\n  '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n  // UPPER FIVE EIGHTHS BLOCK\n  '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n  // UPPER THREE QUARTERS BLOCK\n  '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n  // UPPER SEVEN EIGHTHS BLOCK\n  '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n  // RIGHT ONE QUARTER BLOCK\n  '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n  // RIGHT THREE EIGHTHS B0OCK\n  '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n  // RIGHT FIVE EIGHTHS BL0CK\n  '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n  // RIGHT THREE QUARTERS 0LOCK\n  '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n  // RIGHT SEVEN EIGHTHS B0OCK\n  '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n  // CHECKER BOARD FILL\n  '\\u{1FB95}': [\n    { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n    { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n    { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n    { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n  ],\n  // INVERSE CHECKER BOARD FILL\n  '\\u{1FB96}': [\n    { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n    { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n    { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n    { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n  ],\n  // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n  '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n  // Shade characters (0x2591-0x2593)\n  '░': [ // LIGHT SHADE (25%)\n    [1, 0, 0, 0],\n    [0, 0, 0, 0],\n    [0, 0, 1, 0],\n    [0, 0, 0, 0]\n  ],\n  '▒': [ // MEDIUM SHADE (50%)\n    [1, 0],\n    [0, 0],\n    [0, 1],\n    [0, 0]\n  ],\n  '▓': [ // DARK SHADE (75%)\n    [0, 1],\n    [1, 1],\n    [1, 0],\n    [1, 1]\n  ]\n};\n\nconst enum Shapes {\n  /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n  /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n  /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n  /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n  /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n  /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n  /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n  /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n  /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n  /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n  /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n  /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n  /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n  /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n  /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n  /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n  /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n  /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n  /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n  /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n  /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n  NORMAL = 1,\n  BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n  // Uniform normal and bold\n  '─': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n  '━': { [Style.BOLD]:   Shapes.LEFT_TO_RIGHT },\n  '│': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n  '┃': { [Style.BOLD]:   Shapes.TOP_TO_BOTTOM },\n  '┌': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n  '┏': { [Style.BOLD]:   Shapes.RIGHT_TO_BOTTOM },\n  '┐': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n  '┓': { [Style.BOLD]:   Shapes.LEFT_TO_BOTTOM },\n  '└': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n  '┗': { [Style.BOLD]:   Shapes.TOP_TO_RIGHT },\n  '┘': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n  '┛': { [Style.BOLD]:   Shapes.TOP_TO_LEFT },\n  '├': { [Style.NORMAL]: Shapes.T_RIGHT },\n  '┣': { [Style.BOLD]:   Shapes.T_RIGHT },\n  '┤': { [Style.NORMAL]: Shapes.T_LEFT },\n  '┫': { [Style.BOLD]:   Shapes.T_LEFT },\n  '┬': { [Style.NORMAL]: Shapes.T_BOTTOM },\n  '┳': { [Style.BOLD]:   Shapes.T_BOTTOM },\n  '┴': { [Style.NORMAL]: Shapes.T_TOP },\n  '┻': { [Style.BOLD]:   Shapes.T_TOP },\n  '┼': { [Style.NORMAL]: Shapes.CROSS },\n  '╋': { [Style.BOLD]:   Shapes.CROSS },\n  '╴': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n  '╸': { [Style.BOLD]:   Shapes.MIDDLE_TO_LEFT },\n  '╵': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n  '╹': { [Style.BOLD]:   Shapes.MIDDLE_TO_TOP },\n  '╶': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n  '╺': { [Style.BOLD]:   Shapes.MIDDLE_TO_RIGHT },\n  '╷': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n  '╻': { [Style.BOLD]:   Shapes.MIDDLE_TO_BOTTOM },\n\n  // Double border\n  '═': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '║': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╒': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╓': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╔': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╕': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╖': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n  '╗': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n  '╘': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n  '╙': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╚': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n  '╛': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n  '╜': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n  '╝': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n  '╞': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╟': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n  '╠': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╡': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╢': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╣': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n  '╤': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n  '╥': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╦': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╧': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╨': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╩': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╪': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╫': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╬': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n  // Diagonal\n  '╱': { [Style.NORMAL]: 'M1,0 L0,1' },\n  '╲': { [Style.NORMAL]: 'M0,0 L1,1' },\n  '╳': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n  // Mixed weight\n  '╼': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '╽': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╾': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '╿': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┍': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┎': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┑': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┒': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┕': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┖': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┙': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┚': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┝': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┞': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┟': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┠': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┡': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┢': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┥': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┦': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┧': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┨': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┩': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┪': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┭': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┮': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┯': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┰': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┱': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┲': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┵': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┶': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┷': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┸': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┹': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┺': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┽': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`,  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┾': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`,   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┿': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '╀': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '╁': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`,    [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╂': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '╃': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '╄': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '╅': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '╆': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '╇': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n  '╈': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n  '╉': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n  '╊': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n  // Dashed\n  '╌': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n  '╍': { [Style.BOLD]:   Shapes.TWO_DASHES_HORIZONTAL },\n  '┄': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n  '┅': { [Style.BOLD]:   Shapes.THREE_DASHES_HORIZONTAL },\n  '┈': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n  '┉': { [Style.BOLD]:   Shapes.FOUR_DASHES_HORIZONTAL },\n  '╎': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n  '╏': { [Style.BOLD]:   Shapes.TWO_DASHES_VERTICAL },\n  '┆': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL  },\n  '┇': { [Style.BOLD]:   Shapes.THREE_DASHES_VERTICAL },\n  '┊': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n  '┋': { [Style.BOLD]:   Shapes.FOUR_DASHES_VERTICAL },\n\n  // Curved\n  '╭': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n  '╮': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n  '╯': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n  '╰': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n  d: string;\n  type: VectorType;\n  leftPadding?: number;\n  rightPadding?: number;\n}\n\nconst enum VectorType {\n  FILL,\n  STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n  // Right triangle solid\n  '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n  // Right triangle line\n  '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Left triangle solid\n  '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n  // Left triangle line\n  '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Right semi-circle solid\n  '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n  // Right semi-circle line\n  '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n  // Left semi-circle solid\n  '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n  // Left semi-circle line\n  '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n  // Lower left triangle\n  '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n  // Backslash separator\n  '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Lower right triangle\n  '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n  // Upper left triangle\n  '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n  // Forward slash separator\n  '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Upper right triangle\n  '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n  ctx: CanvasRenderingContext2D,\n  c: string,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): boolean {\n  const blockElementDefinition = blockElementDefinitions[c];\n  if (blockElementDefinition) {\n    drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const patternDefinition = patternCharacterDefinitions[c];\n  if (patternDefinition) {\n    drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const boxDrawingDefinition = boxDrawingDefinitions[c];\n  if (boxDrawingDefinition) {\n    drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n    return true;\n  }\n\n  const powerlineDefinition = powerlineDefinitions[c];\n  if (powerlineDefinition) {\n    drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n    return true;\n  }\n\n  return false;\n}\n\nfunction drawBlockElementChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IBlockVector[],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  for (let i = 0; i < charDefinition.length; i++) {\n    const box = charDefinition[i];\n    const xEighth = deviceCellWidth / 8;\n    const yEighth = deviceCellHeight / 8;\n    ctx.fillRect(\n      xOffset + box.x * xEighth,\n      yOffset + box.y * yEighth,\n      box.w * xEighth,\n      box.h * yEighth\n    );\n  }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: number[][],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  let patternSet = cachedPatterns.get(charDefinition);\n  if (!patternSet) {\n    patternSet = new Map();\n    cachedPatterns.set(charDefinition, patternSet);\n  }\n  const fillStyle = ctx.fillStyle;\n  if (typeof fillStyle !== 'string') {\n    throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n  }\n  let pattern = patternSet.get(fillStyle);\n  if (!pattern) {\n    const width = charDefinition[0].length;\n    const height = charDefinition.length;\n    const tmpCanvas = document.createElement('canvas');\n    tmpCanvas.width = width;\n    tmpCanvas.height = height;\n    const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n    const imageData = new ImageData(width, height);\n\n    // Extract rgba from fillStyle\n    let r: number;\n    let g: number;\n    let b: number;\n    let a: number;\n    if (fillStyle.startsWith('#')) {\n      r = parseInt(fillStyle.slice(1, 3), 16);\n      g = parseInt(fillStyle.slice(3, 5), 16);\n      b = parseInt(fillStyle.slice(5, 7), 16);\n      a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n    } else if (fillStyle.startsWith('rgba')) {\n      ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n    } else {\n      throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n    }\n\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        imageData.data[(y * width + x) * 4    ] = r;\n        imageData.data[(y * width + x) * 4 + 1] = g;\n        imageData.data[(y * width + x) * 4 + 2] = b;\n        imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n      }\n    }\n    tmpCtx.putImageData(imageData, 0, 0);\n    pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n    patternSet.set(fillStyle, pattern);\n  }\n  ctx.fillStyle = pattern;\n  ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles:       ┎┰┒┍┯┑╓╥╖╒╤╕ ┏┳┓┌┲┓┌┬┐┏┱┐\n * ┌─┬─┐ ┏━┳━┓ ╔═╦═╗ ┠╂┨┝┿┥╟╫╢╞╪╡ ┡╇┩├╊┫┢╈┪┣╉┤\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┖┸┚┕┷┙╙╨╜╘╧╛ └┴┘└┺┛┗┻┛┗┹┘\n * ├─┼─┤ ┣━╋━┫ ╠═╬═╣ ┏┱┐┌┲┓┌┬┐┌┬┐ ┏┳┓┌┮┓┌┬┐┏┭┐\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┡╃┤├╄┩├╆┪┢╅┤ ┞╀┦├┾┫┟╁┧┣┽┤\n * └─┴─┘ ┗━┻━┛ ╚═╩═╝ └┴┘└┴┘└┺┛┗┹┘ └┴┘└┶┛┗┻┛┗┵┘\n *\n * Other:\n * ╭─╮ ╲ ╱ ╷╻╎╏┆┇┊┋ ╺╾╴ ╌╌╌ ┄┄┄ ┈┈┈\n * │ │  ╳  ╽╿╎╏┆┇┊┋ ╶╼╸ ╍╍╍ ┅┅┅ ┉┉┉\n * ╰─╯ ╱ ╲ ╹╵╎╏┆┇┊┋\n *\n * All box drawing characters:\n * ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n * ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n * ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n * ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n * ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n * ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n * ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n * ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n *\n * ---\n *\n * Box drawing alignment tests:                                          █\n *                                                                       ▉\n *   ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳\n *   ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳\n *   ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳\n *   ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n *   ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎\n *   ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏\n *   ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  devicePixelRatio: number\n): void {\n  ctx.strokeStyle = ctx.fillStyle;\n  for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n    ctx.beginPath();\n    ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n    let actualInstructions: string;\n    if (typeof instructions === 'function') {\n      const xp = .15;\n      const yp = .15 / deviceCellHeight * deviceCellWidth;\n      actualInstructions = instructions(xp, yp);\n    } else {\n      actualInstructions = instructions;\n    }\n    for (const instruction of actualInstructions.split(' ')) {\n      const type = instruction[0];\n      const f = svgToCanvasInstructionMap[type];\n      if (!f) {\n        console.error(`Could not find drawing instructions for \"${type}\"`);\n        continue;\n      }\n      const args: string[] = instruction.substring(1).split(',');\n      if (!args[0] || !args[1]) {\n        continue;\n      }\n      f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n    }\n    ctx.stroke();\n    ctx.closePath();\n  }\n}\n\nfunction drawPowerlineChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IVectorShape,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): void {\n  // Clip the cell to make sure drawing doesn't occur beyond bounds\n  const clipRegion = new Path2D();\n  clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n  ctx.clip(clipRegion);\n\n  ctx.beginPath();\n  // Scale the stroke with DPR and font size\n  const cssLineWidth = fontSize / 12;\n  ctx.lineWidth = devicePixelRatio * cssLineWidth;\n  for (const instruction of charDefinition.d.split(' ')) {\n    const type = instruction[0];\n    const f = svgToCanvasInstructionMap[type];\n    if (!f) {\n      console.error(`Could not find drawing instructions for \"${type}\"`);\n      continue;\n    }\n    const args: string[] = instruction.substring(1).split(',');\n    if (!args[0] || !args[1]) {\n      continue;\n    }\n    f(ctx, translateArgs(\n      args,\n      deviceCellWidth,\n      deviceCellHeight,\n      xOffset,\n      yOffset,\n      false,\n      devicePixelRatio,\n      (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n      (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n    ));\n  }\n  if (charDefinition.type === VectorType.STROKE) {\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.stroke();\n  } else {\n    ctx.fill();\n  }\n  ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n  'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n  'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n  'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n  const result = args.map(e => parseFloat(e) || parseInt(e));\n\n  if (result.length < 2) {\n    throw new Error('Too few arguments for instruction');\n  }\n\n  for (let x = 0; x < result.length; x += 2) {\n    // Translate from 0-1 to 0-cellWidth\n    result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[x] !== 0) {\n      result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n    }\n    // Apply the cell's offset (ie. x*cellWidth)\n    result[x] += xOffset + (leftPadding * devicePixelRatio);\n  }\n\n  for (let y = 1; y < result.length; y += 2) {\n    // Translate from 0-1 to 0-cellHeight\n    result[y] *= cellHeight;\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[y] !== 0) {\n      result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n    }\n    // Apply the cell's offset (ie. x*cellHeight)\n    result[y] += yOffset;\n  }\n\n  return result;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n  // Observe any resizes to the element and extract the actual pixel size of the element if the\n  // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n  // converting between CSS pixels and device pixels which causes blurry rendering when device\n  // pixel ratio is not a round number.\n  let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n    const entry = entries.find((entry) => entry.target === element);\n    if (!entry) {\n      return;\n    }\n\n    // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n    if (!('devicePixelContentBoxSize' in entry)) {\n      observer?.disconnect();\n      observer = undefined;\n      return;\n    }\n\n    // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n    const width = entry.devicePixelContentBoxSize[0].inlineSize;\n    const height = entry.devicePixelContentBoxSize[0].blockSize;\n    if (width > 0 && height > 0) {\n      callback(width, height);\n    }\n  });\n  try {\n    observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n  } catch {\n    observer.disconnect();\n    observer = undefined;\n  }\n  return toDisposable(() => observer?.disconnect());\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n  if (!value) {\n    throw new Error('value must not be falsy');\n  }\n  return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n  // Only return true for Powerline symbols which require\n  // different padding and should be excluded from minimum contrast\n  // ratio standards\n  return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n  return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n  return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n  return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from 'xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n  public hasSelection!: boolean;\n  public columnSelectMode!: boolean;\n  public viewportStartRow!: number;\n  public viewportEndRow!: number;\n  public viewportCappedStartRow!: number;\n  public viewportCappedEndRow!: number;\n  public startCol!: number;\n  public endCol!: number;\n  public selectionStart: [number, number] | undefined;\n  public selectionEnd: [number, number] | undefined;\n\n  constructor() {\n    this.clear();\n  }\n\n  public clear(): void {\n    this.hasSelection = false;\n    this.columnSelectMode = false;\n    this.viewportStartRow = 0;\n    this.viewportEndRow = 0;\n    this.viewportCappedStartRow = 0;\n    this.viewportCappedEndRow = 0;\n    this.startCol = 0;\n    this.endCol = 0;\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n  }\n\n  public update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n    this.selectionStart = start;\n    this.selectionEnd = end;\n    // Selection does not exist\n    if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n      this.clear();\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportStartRow = start[1] - terminal.buffer.active.viewportY;\n    const viewportEndRow = end[1] - terminal.buffer.active.viewportY;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n      this.clear();\n      return;\n    }\n\n    this.hasSelection = true;\n    this.columnSelectMode = columnSelectMode;\n    this.viewportStartRow = viewportStartRow;\n    this.viewportEndRow = viewportEndRow;\n    this.viewportCappedStartRow = viewportCappedStartRow;\n    this.viewportCappedEndRow = viewportCappedEndRow;\n    this.startCol = start[0];\n    this.endCol = end[0];\n  }\n\n  public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n    if (!this.hasSelection) {\n      return false;\n    }\n    y -= terminal.buffer.active.viewportY;\n    if (this.columnSelectMode) {\n      if (this.startCol <= this.endCol) {\n        return x >= this.startCol && y >= this.viewportCappedStartRow &&\n          x < this.endCol && y <= this.viewportCappedEndRow;\n      }\n      return x < this.startCol && y >= this.viewportCappedStartRow &&\n        x >= this.endCol && y <= this.viewportCappedEndRow;\n    }\n    return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n      (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n  }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n  return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, color, rgba } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { IUnicodeService } from 'common/services/Services';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n  texturePage: 0,\n  texturePosition: { x: 0, y: 0 },\n  texturePositionClipSpace: { x: 0, y: 0 },\n  offset: { x: 0, y: 0 },\n  size: { x: 0, y: 0 },\n  sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n  /**\n   * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n   * page pack as tightly as possible, but more pages would end up being created as a result.\n   */\n  ROW_PIXEL_THRESHOLD = 2,\n  /**\n   * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n   * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n   * 4096 squared image takes up 16MB of GPU memory.\n   */\n  FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n  x: number;\n  y: number;\n  height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n  private _didWarmUp: boolean = false;\n\n  private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n  private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n  // The texture that the atlas is drawn to\n  private _pages: AtlasPage[] = [];\n  public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n  // The set of atlas pages that can be written to\n  private _activePages: AtlasPage[] = [];\n\n  private _tmpCanvas: HTMLCanvasElement;\n  // A temporary context that glyphs are drawn to before being transfered to the atlas.\n  private _tmpCtx: CanvasRenderingContext2D;\n\n  private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n  private _workAttributeData: AttributeData = new AttributeData();\n\n  private _textureSize: number = 512;\n\n  public static maxAtlasPages: number | undefined;\n  public static maxTextureSize: number | undefined;\n\n  private readonly _onAddTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n  constructor(\n    private readonly _document: Document,\n    private readonly _config: ICharAtlasConfig,\n    private readonly _unicodeService: IUnicodeService\n  ) {\n    this._createNewPage();\n    this._tmpCanvas = createCanvas(\n      _document,\n      this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n      this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n    );\n    this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n      alpha: this._config.allowTransparency,\n      willReadFrequently: true\n    }));\n  }\n\n  public dispose(): void {\n    for (const page of this.pages) {\n      page.canvas.remove();\n    }\n    this._onAddTextureAtlasCanvas.dispose();\n  }\n\n  public warmUp(): void {\n    if (!this._didWarmUp) {\n      this._doWarmUp();\n      this._didWarmUp = true;\n    }\n  }\n\n  private _doWarmUp(): void {\n    // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n    const queue = new IdleTaskQueue();\n    for (let i = 33; i < 126; i++) {\n      queue.enqueue(() => {\n        if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n          const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n          this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n        }\n      });\n    }\n  }\n\n  private _requestClearModel = false;\n  public beginFrame(): boolean {\n    return this._requestClearModel;\n  }\n\n  public clearTexture(): void {\n    if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n      return;\n    }\n    for (const page of this._pages) {\n      page.clear();\n    }\n    this._cacheMap.clear();\n    this._cacheMapCombined.clear();\n    this._didWarmUp = false;\n  }\n\n  private _createNewPage(): AtlasPage {\n    // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n    // microtask to ensure it does not interrupt textures that will be rendered in the current\n    // animation frame which would result in blank rendered areas. This is actually not that\n    // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n    if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n      // Find the set of the largest 4 images, below the maximum size, with the highest\n      // percentages used\n      const pagesBySize = this._pages.filter(e => {\n        return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n      }).sort((a, b) => {\n        if (b.canvas.width !== a.canvas.width) {\n          return b.canvas.width - a.canvas.width;\n        }\n        return b.percentageUsed - a.percentageUsed;\n      });\n      let sameSizeI = -1;\n      let size = 0;\n      for (let i = 0; i < pagesBySize.length; i++) {\n        if (pagesBySize[i].canvas.width !== size) {\n          sameSizeI = i;\n          size = pagesBySize[i].canvas.width;\n        } else if (i - sameSizeI === 3) {\n          break;\n        }\n      }\n\n      // Gather details of the merge\n      const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n      const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n      const mergedPageIndex = this.pages.length - mergingPages.length;\n\n      // Merge into the new page\n      const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n      mergedPage.version++;\n\n      // Delete the pages, shifting glyph texture pages as needed\n      for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n        this._deletePage(sortedMergingPagesIndexes[i]);\n      }\n\n      // Add the new merged page to the end\n      this.pages.push(mergedPage);\n\n      // Request the model to be cleared to refresh all texture pages.\n      this._requestClearModel = true;\n      this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n    }\n\n    // All new atlas pages are created small as they are highly dynamic\n    const newPage = new AtlasPage(this._document, this._textureSize);\n    this._pages.push(newPage);\n    this._activePages.push(newPage);\n    this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n    return newPage;\n  }\n\n  private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n    const mergedSize = mergingPages[0].canvas.width * 2;\n    const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n    for (const [i, p] of mergingPages.entries()) {\n      const xOffset = i * p.canvas.width % mergedSize;\n      const yOffset = Math.floor(i / 2) * p.canvas.height;\n      mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n      for (const g of p.glyphs) {\n        g.texturePage = mergedPageIndex;\n        g.sizeClipSpace.x = g.size.x / mergedSize;\n        g.sizeClipSpace.y = g.size.y / mergedSize;\n        g.texturePosition.x += xOffset;\n        g.texturePosition.y += yOffset;\n        g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n        g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n      }\n\n      this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n      // Remove the merging page from active pages if it was there\n      const index = this._activePages.indexOf(p);\n      if (index !== -1) {\n        this._activePages.splice(index, 1);\n      }\n    }\n    return mergedPage;\n  }\n\n  private _deletePage(pageIndex: number): void {\n    this._pages.splice(pageIndex, 1);\n    for (let j = pageIndex; j < this._pages.length; j++) {\n      const adjustingPage = this._pages[j];\n      for (const g of adjustingPage.glyphs) {\n        g.texturePage--;\n      }\n      adjustingPage.version++;\n    }\n  }\n\n  public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n  }\n\n  public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n  }\n\n  /**\n   * Gets the glyphs texture coords, drawing the texture if it's not already\n   */\n  private _getFromCacheMap(\n    cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n    key: string | number,\n    bg: number,\n    fg: number,\n    ext: number,\n    restrictToCellHeight: boolean = false\n  ): IRasterizedGlyph {\n    $glyph = cacheMap.get(key, bg, fg, ext);\n    if (!$glyph) {\n      $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n      cacheMap.set(key, bg, fg, ext, $glyph);\n    }\n    return $glyph;\n  }\n\n  private _getColorFromAnsiIndex(idx: number): IColor {\n    if (idx >= this._config.colors.ansi.length) {\n      throw new Error('No color found for idx ' + idx);\n    }\n    return this._config.colors.ansi[idx];\n  }\n\n  private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n    if (this._config.allowTransparency) {\n      // The background color might have some transparency, so we need to render it as fully\n      // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n      // around the anti-aliased edges of the glyph, and it would look too dark.\n      return NULL_COLOR;\n    }\n\n    let result: IColor;\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        result = this._getColorFromAnsiIndex(bgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(bgColor);\n        // TODO: This object creation is slow\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = color.opaque(this._config.colors.foreground);\n        } else {\n          result = this._config.colors.background;\n        }\n        break;\n    }\n\n    return result;\n  }\n\n  private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n    const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, false, bold, dim, excludeFromContrastRatioDemands);\n    if (minimumContrastColor) {\n      return minimumContrastColor;\n    }\n\n    let result: IColor;\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        result = this._getColorFromAnsiIndex(fgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(fgColor);\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = this._config.colors.background;\n        } else {\n          result = this._config.colors.foreground;\n        }\n    }\n\n    // Always use an opaque color regardless of allowTransparency\n    if (this._config.allowTransparency) {\n      result = color.opaque(result);\n    }\n\n    // Apply dim to the color, opacity is fine to use for the foreground color\n    if (dim) {\n      result = color.multiplyOpacity(result, DIM_OPACITY);\n    }\n\n    return result;\n  }\n\n  private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        return this._getColorFromAnsiIndex(bgColor).rgba;\n      case Attributes.CM_RGB:\n        return bgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.foreground.rgba;\n        }\n        return this._config.colors.background.rgba;\n    }\n  }\n\n  private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        return this._getColorFromAnsiIndex(fgColor).rgba;\n      case Attributes.CM_RGB:\n        return fgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.background.rgba;\n        }\n        return this._config.colors.foreground.rgba;\n    }\n  }\n\n  private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n    if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n      return undefined;\n    }\n\n    // Try get from cache first\n    const cache = this._getContrastCache(dim);\n    const adjustedColor = cache.getColor(bg, fg);\n    if (adjustedColor !== undefined) {\n      return adjustedColor || undefined;\n    }\n\n    const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n    const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n    // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n    // non-dim cells\n    const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n    if (!result) {\n      cache.setColor(bg, fg, null);\n      return undefined;\n    }\n\n    const color = rgba.toColor(\n      (result >> 24) & 0xFF,\n      (result >> 16) & 0xFF,\n      (result >> 8) & 0xFF\n    );\n    cache.setColor(bg, fg, color);\n\n    return color;\n  }\n\n  private _getContrastCache(dim: boolean): IColorContrastCache {\n    if (dim) {\n      return this._config.colors.halfContrastCache;\n    }\n    return this._config.colors.contrastCache;\n  }\n\n  @traceCall\n  private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n    const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n    // Uncomment for debugging\n    // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n    // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n    // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n    // giant ligatures (eg. =====>) don't impact overall performance.\n    const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n    if (this._tmpCanvas.width < allowedWidth) {\n      this._tmpCanvas.width = allowedWidth;\n    }\n    // Include line height when drawing glyphs\n    const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n    if (this._tmpCanvas.height < allowedHeight) {\n      this._tmpCanvas.height = allowedHeight;\n    }\n    this._tmpCtx.save();\n\n    this._workAttributeData.fg = fg;\n    this._workAttributeData.bg = bg;\n    this._workAttributeData.extended.ext = ext;\n\n    const invisible = !!this._workAttributeData.isInvisible();\n    if (invisible) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const bold = !!this._workAttributeData.isBold();\n    const inverse = !!this._workAttributeData.isInverse();\n    const dim = !!this._workAttributeData.isDim();\n    const italic = !!this._workAttributeData.isItalic();\n    const underline = !!this._workAttributeData.isUnderline();\n    const strikethrough = !!this._workAttributeData.isStrikethrough();\n    const overline = !!this._workAttributeData.isOverline();\n    let fgColor = this._workAttributeData.getFgColor();\n    let fgColorMode = this._workAttributeData.getFgColorMode();\n    let bgColor = this._workAttributeData.getBgColor();\n    let bgColorMode = this._workAttributeData.getBgColorMode();\n    if (inverse) {\n      const temp = fgColor;\n      fgColor = bgColor;\n      bgColor = temp;\n      const temp2 = fgColorMode;\n      fgColorMode = bgColorMode;\n      bgColorMode = temp2;\n    }\n\n    // draw the background\n    const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n    // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n    // regardless of transparency in backgroundColor\n    this._tmpCtx.globalCompositeOperation = 'copy';\n    this._tmpCtx.fillStyle = backgroundColor.css;\n    this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n    this._tmpCtx.globalCompositeOperation = 'source-over';\n\n    // draw the foreground/glyph\n    const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n    const fontStyle = italic ? 'italic' : '';\n    this._tmpCtx.font =\n      `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n    this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n    const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n    const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n    const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, excludeFromContrastRatioDemands(chars.charCodeAt(0)));\n    this._tmpCtx.fillStyle = foregroundColor.css;\n\n    // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n    const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n    // Draw custom characters if applicable\n    let customGlyph = false;\n    if (this._config.customGlyphs !== false) {\n      customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n    }\n\n    // Whether to clear pixels based on a threshold difference between the glyph color and the\n    // background color. This should be disabled when the glyph contains multiple colors such as\n    // underline colors to prevent important colors could get cleared.\n    let enableClearThresholdCheck = !powerlineGlyph;\n\n    let chWidth: number;\n    if (typeof codeOrChars === 'number') {\n      chWidth = this._unicodeService.wcwidth(codeOrChars);\n    } else {\n      chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n    }\n\n    // Draw underline\n    if (underline) {\n      this._tmpCtx.save();\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      // When the line width is odd, draw at a 0.5 position\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n\n      // Underline color\n      if (this._workAttributeData.isUnderlineColorDefault()) {\n        this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      } else if (this._workAttributeData.isUnderlineColorRGB()) {\n        enableClearThresholdCheck = false;\n        this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n      } else {\n        enableClearThresholdCheck = false;\n        let fg = this._workAttributeData.getUnderlineColor();\n        if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n          fg += 8;\n        }\n        this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n      }\n\n      // Underline style/stroke\n      this._tmpCtx.beginPath();\n      const xLeft = padding;\n      const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n      const yMid = yTop + lineWidth;\n      const yBot = yTop + lineWidth * 2;\n\n      for (let i = 0; i < chWidth; i++) {\n        this._tmpCtx.save();\n        const xChLeft = xLeft + i * this._config.deviceCellWidth;\n        const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n        const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n        switch (this._workAttributeData.extended.underlineStyle) {\n          case UnderlineStyle.DOUBLE:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            this._tmpCtx.moveTo(xChLeft, yBot);\n            this._tmpCtx.lineTo(xChRight, yBot);\n            break;\n          case UnderlineStyle.CURLY:\n            // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n            // made taller when the line width is  as otherwise it's not very clear otherwise.\n            const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n            const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n            // Clip the left and right edges of the underline such that it can be drawn just outside\n            // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n            // glyphs adjacent to one another.\n            const clipRegion = new Path2D();\n            clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n            this._tmpCtx.clip(clipRegion);\n            // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n            // cells\n            this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n            this._tmpCtx.bezierCurveTo(\n              xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n              xChLeft, yCurlyTop,\n              xChLeft, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChLeft, yCurlyBot,\n              xChMid, yCurlyBot,\n              xChMid, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChMid, yCurlyTop,\n              xChRight, yCurlyTop,\n              xChRight, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChRight, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yMid\n            );\n            break;\n          case UnderlineStyle.DOTTED:\n            this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.DASHED:\n            this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.SINGLE:\n          default:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n        }\n        this._tmpCtx.stroke();\n        this._tmpCtx.restore();\n      }\n      this._tmpCtx.restore();\n\n      // Draw stroke in the background color for non custom characters in order to give an outline\n      // between the text and the underline. Only do this when font size is >= 12 as the underline\n      // looks odd when the font size is too small\n      if (!customGlyph && this._config.fontSize >= 12) {\n        // This only works when transparency is disabled because it's not clear how to clear stroked\n        // text\n        if (!this._config.allowTransparency && chars !== ' ') {\n          // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n          // baseline\n          this._tmpCtx.save();\n          this._tmpCtx.textBaseline = 'alphabetic';\n          const metrics = this._tmpCtx.measureText(chars);\n          this._tmpCtx.restore();\n          if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n            // This translates to 1/2 the line width in either direction\n            this._tmpCtx.save();\n            // Clip the region to only draw in valid pixels near the underline to avoid a slight\n            // outline around the whole glyph, as well as additional pixels in the glyph at the top\n            // which would increase GPU memory demands\n            const clipRegion = new Path2D();\n            clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n            this._tmpCtx.clip(clipRegion);\n            this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n            this._tmpCtx.strokeStyle = backgroundColor.css;\n            this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n            this._tmpCtx.restore();\n          }\n        }\n      }\n    }\n\n    // Overline\n    if (overline) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    // Draw the character\n    if (!customGlyph) {\n      this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n    }\n\n    // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n    // even on the bottom row, try for a maximum of 5 pixels.\n    if (chars === '_' && !this._config.allowTransparency) {\n      let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n      if (isBeyondCellBounds) {\n        for (let offset = 1; offset <= 5; offset++) {\n          this._tmpCtx.save();\n          this._tmpCtx.fillStyle = backgroundColor.css;\n          this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n          this._tmpCtx.restore();\n          this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n          isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n          if (!isBeyondCellBounds) {\n            break;\n          }\n        }\n      }\n    }\n\n    // Draw strokethrough\n    if (strikethrough) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n      const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    this._tmpCtx.restore();\n\n    // clear the background from the character to avoid issues with drawing over the previous\n    // character if it extends past it's bounds\n    const imageData = this._tmpCtx.getImageData(\n      0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n    );\n\n    // Clear out the background color and determine if the glyph is empty.\n    let isEmpty: boolean;\n    if (!this._config.allowTransparency) {\n      isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n    } else {\n      isEmpty = checkCompletelyTransparent(imageData);\n    }\n\n    // Handle empty glyphs\n    if (isEmpty) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n    // Find the best atlas row to use\n    let activePage: AtlasPage;\n    let activeRow: ICharAtlasActiveRow;\n    while (true) {\n      // If there are no active pages (the last smallest 4 were merged), create a new one\n      if (this._activePages.length === 0) {\n        const newPage = this._createNewPage();\n        activePage = newPage;\n        activeRow = newPage.currentRow;\n        activeRow.height = rasterizedGlyph.size.y;\n        break;\n      }\n\n      // Get the best current row from all active pages\n      activePage = this._activePages[this._activePages.length - 1];\n      activeRow = activePage.currentRow;\n      for (const p of this._activePages) {\n        if (rasterizedGlyph.size.y <= p.currentRow.height) {\n          activePage = p;\n          activeRow = p.currentRow;\n        }\n      }\n\n      // TODO: This algorithm could be simplified:\n      // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n      // - Keep track of current/fixed rows in a Map\n\n      // Replace the best current row with a fixed row if there is one at least as good as the\n      // current row. Search in reverse to prioritize filling in older pages.\n      for (let i = this._activePages.length - 1; i >= 0; i--) {\n        for (const row of this._activePages[i].fixedRows) {\n          if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n            activePage = this._activePages[i];\n            activeRow = row;\n          }\n        }\n      }\n\n      // Create a new page if too much vertical space would be wasted or there is not enough room\n      // left in the page. The previous active row will become fixed in the process as it now has a\n      // fixed height\n      if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n        // Create the new fixed height row, creating a new page if there isn't enough room on the\n        // current page\n        let wasPageAndRowFound = false;\n        if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n          // Find the first page with room to create the new row on\n          let candidatePage: AtlasPage | undefined;\n          for (const p of this._activePages) {\n            if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n              candidatePage = p;\n              break;\n            }\n          }\n          if (candidatePage) {\n            activePage = candidatePage;\n          } else {\n            // Before creating a new atlas page that would trigger a page merge, check if the\n            // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n            // improve texture utilization by using the available space before the page is merged\n            // and becomes static.\n            if (\n              TextureAtlas.maxAtlasPages &&\n              this._pages.length >= TextureAtlas.maxAtlasPages &&\n              activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n              activeRow.height >= rasterizedGlyph.size.y &&\n              activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n            ) {\n              // activePage and activeRow is already valid\n              wasPageAndRowFound = true;\n            } else {\n              // Create a new page if there is no room\n              const newPage = this._createNewPage();\n              activePage = newPage;\n              activeRow = newPage.currentRow;\n              activeRow.height = rasterizedGlyph.size.y;\n              wasPageAndRowFound = true;\n            }\n          }\n        }\n        if (!wasPageAndRowFound) {\n          // Fix the current row as the new row is being added below\n          if (activePage.currentRow.height > 0) {\n            activePage.fixedRows.push(activePage.currentRow);\n          }\n          activeRow = {\n            x: 0,\n            y: activePage.currentRow.y + activePage.currentRow.height,\n            height: rasterizedGlyph.size.y\n          };\n          activePage.fixedRows.push(activeRow);\n\n          // Create the new current row below the new fixed height row\n          activePage.currentRow = {\n            x: 0,\n            y: activeRow.y + activeRow.height,\n            height: 0\n          };\n        }\n        // TODO: Remove pages from _activePages when all rows are filled\n      }\n\n      // Exit the loop if there is enough room in the row\n      if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n        break;\n      }\n\n      // If there is not enough room in the current row, finish it and try again\n      if (activeRow === activePage.currentRow) {\n        activeRow.x = 0;\n        activeRow.y += activeRow.height;\n        activeRow.height = 0;\n      } else {\n        activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n      }\n    }\n\n    // Record texture position\n    rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n    rasterizedGlyph.texturePosition.x = activeRow.x;\n    rasterizedGlyph.texturePosition.y = activeRow.y;\n    rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n    rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n    // Fix the clipspace position as pages may be of differing size\n    rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n    rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n    // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n    // height\n    activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n    activeRow.x += rasterizedGlyph.size.x;\n\n    // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n    activePage.ctx.putImageData(\n      imageData,\n      rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n      rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n      this._workBoundingBox.left,\n      this._workBoundingBox.top,\n      rasterizedGlyph.size.x,\n      rasterizedGlyph.size.y\n    );\n    activePage.addGlyph(rasterizedGlyph);\n    activePage.version++;\n\n    return rasterizedGlyph;\n  }\n\n  /**\n   * Given an ImageData object, find the bounding box of the non-transparent\n   * portion of the texture and return an IRasterizedGlyph with these\n   * dimensions.\n   * @param imageData The image data to read.\n   * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n   */\n  private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n    boundingBox.top = 0;\n    const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n    const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n    let found = false;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.top = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.left = 0;\n    found = false;\n    for (let x = 0; x < padding + width; x++) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.left = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.right = width;\n    found = false;\n    for (let x = padding + width - 1; x >= padding; x--) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.right = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.bottom = height;\n    found = false;\n    for (let y = height - 1; y >= 0; y--) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.bottom = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    return {\n      texturePage: 0,\n      texturePosition: { x: 0, y: 0 },\n      texturePositionClipSpace: { x: 0, y: 0 },\n      size: {\n        x: boundingBox.right - boundingBox.left + 1,\n        y: boundingBox.bottom - boundingBox.top + 1\n      },\n      sizeClipSpace: {\n        x: (boundingBox.right - boundingBox.left + 1),\n        y: (boundingBox.bottom - boundingBox.top + 1)\n      },\n      offset: {\n        x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n        y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n      }\n    };\n  }\n}\n\nclass AtlasPage {\n  public readonly canvas: HTMLCanvasElement;\n  public readonly ctx: CanvasRenderingContext2D;\n\n  private _usedPixels: number = 0;\n  public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n  private readonly _glyphs: IRasterizedGlyph[] = [];\n  public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n  public addGlyph(glyph: IRasterizedGlyph): void {\n    this._glyphs.push(glyph);\n    this._usedPixels += glyph.size.x * glyph.size.y;\n  }\n\n  /**\n   * Used to check whether the canvas of the atlas page has changed.\n   */\n  public version = 0;\n\n  // Texture atlas current positioning data. The texture packing strategy used is to fill from\n  // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n  // row's height, the following happens:\n  //\n  // - The current row becomes the fixed height row A\n  // - A new fixed height row B the exact size of the glyph is created below the current row\n  // - A new dynamic height current row is created below B\n  //\n  // This strategy does a good job preventing space being wasted for very short glyphs such as\n  // underscores, hyphens etc. or those with underlines rendered.\n  public currentRow: ICharAtlasActiveRow = {\n    x: 0,\n    y: 0,\n    height: 0\n  };\n  public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n  constructor(\n    document: Document,\n    size: number,\n    sourcePages?: AtlasPage[]\n  ) {\n    if (sourcePages) {\n      for (const p of sourcePages) {\n        this._glyphs.push(...p.glyphs);\n        this._usedPixels += p._usedPixels;\n      }\n    }\n    this.canvas = createCanvas(document, size, size);\n    // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n    // It might also contain some characters with transparent backgrounds if allowTransparency is\n    // set.\n    this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n  }\n\n  public clear(): void {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n    this.currentRow.x = 0;\n    this.currentRow.y = 0;\n    this.currentRow.height = 0;\n    this.fixedRows.length = 0;\n    this.version++;\n  }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n  // Get color channels\n  const r = bg.rgba >>> 24;\n  const g = bg.rgba >>> 16 & 0xFF;\n  const b = bg.rgba >>> 8 & 0xFF;\n  const fgR = fg.rgba >>> 24;\n  const fgG = fg.rgba >>> 16 & 0xFF;\n  const fgB = fg.rgba >>> 8 & 0xFF;\n\n  // Calculate a threshold that when below a color will be treated as transpart when the sum of\n  // channel value differs. This helps improve rendering when glyphs overlap with others. This\n  // threshold is calculated relative to the difference between the background and foreground to\n  // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n  // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n  // were covered (fg=#8ae234, bg=#c4a000).\n  const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n  // Set alpha channel of relevent pixels to 0\n  let isEmpty = true;\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    // Check exact match\n    if (imageData.data[offset] === r &&\n        imageData.data[offset + 1] === g &&\n        imageData.data[offset + 2] === b) {\n      imageData.data[offset + 3] = 0;\n    } else {\n      // Check the threshold based difference\n      if (enableThresholdCheck &&\n          (Math.abs(imageData.data[offset] - r) +\n          Math.abs(imageData.data[offset + 1] - g) +\n          Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n        imageData.data[offset + 3] = 0;\n      } else {\n        isEmpty = false;\n      }\n    }\n  }\n\n  return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    if (imageData.data[offset + 3] > 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n  const canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n  export function toCss(r: number, g: number, b: number, a?: number): string {\n    if (a !== undefined) {\n      return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n    }\n    return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n  }\n\n  export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n    // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n    // on LE systems, before it can be used for direct 32-bit buffer writes.\n    // >>> 0 forces an unsigned int\n    return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n  }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n  export function blend(bg: IColor, fg: IColor): IColor {\n    $a = (fg.rgba & 0xFF) / 255;\n    if ($a === 1) {\n      return {\n        css: fg.css,\n        rgba: fg.rgba\n      };\n    }\n    const fgR = (fg.rgba >> 24) & 0xFF;\n    const fgG = (fg.rgba >> 16) & 0xFF;\n    const fgB = (fg.rgba >> 8) & 0xFF;\n    const bgR = (bg.rgba >> 24) & 0xFF;\n    const bgG = (bg.rgba >> 16) & 0xFF;\n    const bgB = (bg.rgba >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    const css = channels.toCss($r, $g, $b);\n    const rgba = channels.toRgba($r, $g, $b);\n    return { css, rgba };\n  }\n\n  export function isOpaque(color: IColor): boolean {\n    return (color.rgba & 0xFF) === 0xFF;\n  }\n\n  export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n    const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n    if (!result) {\n      return undefined;\n    }\n    return rgba.toColor(\n      (result >> 24 & 0xFF),\n      (result >> 16 & 0xFF),\n      (result >> 8  & 0xFF)\n    );\n  }\n\n  export function opaque(color: IColor): IColor {\n    const rgbaColor = (color.rgba | 0xFF) >>> 0;\n    [$r, $g, $b] = rgba.toChannels(rgbaColor);\n    return {\n      css: channels.toCss($r, $g, $b),\n      rgba: rgbaColor\n    };\n  }\n\n  export function opacity(color: IColor, opacity: number): IColor {\n    $a = Math.round(opacity * 0xFF);\n    [$r, $g, $b] = rgba.toChannels(color.rgba);\n    return {\n      css: channels.toCss($r, $g, $b, $a),\n      rgba: channels.toRgba($r, $g, $b, $a)\n    };\n  }\n\n  export function multiplyOpacity(color: IColor, factor: number): IColor {\n    $a = color.rgba & 0xFF;\n    return opacity(color, ($a * factor) / 0xFF);\n  }\n\n  export function toColorRGB(color: IColor): IColorRGB {\n    return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n  }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  if (!isNode) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return rgba.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $a = parseInt(css.slice(4, 5).repeat(2), 16);\n          return rgba.toColor($r, $g, $b, $a);\n        }\n        case 7: // #rrggbb\n          return {\n            css,\n            rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n          };\n        case 9: // #rrggbbaa\n          return {\n            css,\n            rgba: parseInt(css.slice(1), 16) >>> 0\n          };\n      }\n    }\n\n    // Formats: rgb() or rgba()\n    const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n    if (rgbaMatch) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return rgba.toColor($r, $g, $b, $a);\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param rgb The color to use.\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance(rgb: number): number {\n    return relativeLuminance2(\n      (rgb >> 16) & 0xFF,\n      (rgb >> 8 ) & 0xFF,\n      (rgb      ) & 0xFF);\n  }\n\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param r The red channel (0x00 to 0xFF).\n   * @param g The green channel (0x00 to 0xFF).\n   * @param b The blue channel (0x00 to 0xFF).\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance2(r: number, g: number, b: number): number {\n    const rs = r / 255;\n    const gs = g / 255;\n    const bs = b / 255;\n    const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n    const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n    const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n    return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n  /**\n   * Given a foreground color and a background color, either increase or reduce the luminance of the\n   * foreground color until the specified contrast ratio is met. If pure white or black is hit\n   * without the contrast ratio being met, go the other direction using the background color as the\n   * foreground color and take either the first or second result depending on which has the higher\n   * contrast ratio.\n   *\n   * `undefined` will be returned if the contrast ratio is already met.\n   *\n   * @param bgRgba The background color in rgba format.\n   * @param fgRgba The foreground color in rgba format.\n   * @param ratio The contrast ratio to achieve.\n   */\n  export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n    const bgL = rgb.relativeLuminance(bgRgba >> 8);\n    const fgL = rgb.relativeLuminance(fgRgba >> 8);\n    const cr = contrastRatio(bgL, fgL);\n    if (cr < ratio) {\n      if (fgL < bgL) {\n        const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n        if (resultARatio < ratio) {\n          const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n          const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n          return resultARatio > resultBRatio ? resultA : resultB;\n        }\n        return resultA;\n      }\n      const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n      const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n      if (resultARatio < ratio) {\n        const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n        return resultARatio > resultBRatio ? resultA : resultB;\n      }\n      return resultA;\n    }\n    return undefined;\n  }\n\n  export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to reducing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n      // Reduce by 10% until the ratio is hit\n      fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n      fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n      fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to increasing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n      // Increase by 10% until the ratio is hit\n      fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n      fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n      fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  // FIXME: Move this to channels NS?\n  export function toChannels(value: number): [number, number, number, number] {\n    return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n  }\n\n  export function toColor(r: number, g: number, b: number, a?: number): IColor {\n    return {\n      css: channels.toCss(r, g, b, a),\n      rgba: channels.toRgba(r, g, b, a)\n    };\n  }\n}\n\nexport function toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n  if (l1 < l2) {\n    return (l2 + 0.05) / (l1 + 0.05);\n  }\n  return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n  (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n  (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n  event: IEvent<T, U>;\n  fire(arg1: T, arg2: U): void;\n  dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n  private _listeners: IListener<T, U>[] = [];\n  private _event?: IEvent<T, U>;\n  private _disposed: boolean = false;\n\n  public get event(): IEvent<T, U> {\n    if (!this._event) {\n      this._event = (listener: (arg1: T, arg2: U) => any) => {\n        this._listeners.push(listener);\n        const disposable = {\n          dispose: () => {\n            if (!this._disposed) {\n              for (let i = 0; i < this._listeners.length; i++) {\n                if (this._listeners[i] === listener) {\n                  this._listeners.splice(i, 1);\n                  return;\n                }\n              }\n            }\n          }\n        };\n        return disposable;\n      };\n    }\n    return this._event;\n  }\n\n  public fire(arg1: T, arg2: U): void {\n    const queue: IListener<T, U>[] = [];\n    for (let i = 0; i < this._listeners.length; i++) {\n      queue.push(this._listeners[i]);\n    }\n    for (let i = 0; i < queue.length; i++) {\n      queue[i].call(undefined, arg1, arg2);\n    }\n  }\n\n  public dispose(): void {\n    this.clearListeners();\n    this._disposed = true;\n  }\n\n  public clearListeners(): void {\n    if (this._listeners) {\n      this._listeners.length = 0;\n    }\n  }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n  return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n  protected _disposables: IDisposable[] = [];\n  protected _isDisposed: boolean = false;\n\n  /**\n   * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n   */\n  public dispose(): void {\n    this._isDisposed = true;\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.length = 0;\n  }\n\n  /**\n   * Registers a disposable object.\n   * @param d The disposable to register.\n   * @returns The disposable.\n   */\n  public register<T extends IDisposable>(d: T): T {\n    this._disposables.push(d);\n    return d;\n  }\n\n  /**\n   * Unregisters a disposable object if it has been registered, if not do\n   * nothing.\n   * @param d The disposable to unregister.\n   */\n  public unregister<T extends IDisposable>(d: T): void {\n    const index = this._disposables.indexOf(d);\n    if (index !== -1) {\n      this._disposables.splice(index, 1);\n    }\n  }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value?: T;\n  private _isDisposed = false;\n\n  /**\n   * Gets the value if it exists.\n   */\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  /**\n   * Sets the value, disposing of the old value if it exists.\n   */\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  /**\n   * Resets the stored value and disposes of the previously stored value.\n   */\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\n  }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n  return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n  for (const d of disposables) {\n    d.dispose();\n  }\n  disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n  return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n  private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n  public set(first: TFirst, second: TSecond, value: TValue): void {\n    if (!this._data[first]) {\n      this._data[first] = {};\n    }\n    this._data[first as string | number]![second] = value;\n  }\n\n  public get(first: TFirst, second: TSecond): TValue | undefined {\n    return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n  }\n\n  public clear(): void {\n    this._data = {};\n  }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n  private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n  public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n    if (!this._data.get(first, second)) {\n      this._data.set(first, second, new TwoKeyMap());\n    }\n    this._data.get(first, second)!.set(third, fourth, value);\n  }\n\n  public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n    return this._data.get(first, second)?.get(third, fourth);\n  }\n\n  public clear(): void {\n    this._data.clear();\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n  userAgent: string;\n  language: string;\n  platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nexport const isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = Date.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n      // this is not an issue here as a clock change during a short running task is very unlikely\n      // in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, Date.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = Date.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - Date.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor() {\n    this._queue = new IdleTaskQueue();\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  public static toColorRGB(value: number): IColorRGB {\n    return [\n      value >>> Attributes.RED_SHIFT & 255,\n      value >>> Attributes.GREEN_SHIFT & 255,\n      value & 255\n    ];\n  }\n\n  public static fromColorRGB(value: IColorRGB): number {\n    return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n  }\n\n  public clone(): IAttributeData {\n    const newObj = new AttributeData();\n    newObj.fg = this.fg;\n    newObj.bg = this.bg;\n    newObj.extended = this.extended.clone();\n    return newObj;\n  }\n\n  // data\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n\n  // flags\n  public isInverse(): number       { return this.fg & FgFlags.INVERSE; }\n  public isBold(): number          { return this.fg & FgFlags.BOLD; }\n  public isUnderline(): number     {\n    if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n      return 1;\n    }\n    return this.fg & FgFlags.UNDERLINE;\n  }\n  public isBlink(): number         { return this.fg & FgFlags.BLINK; }\n  public isInvisible(): number     { return this.fg & FgFlags.INVISIBLE; }\n  public isItalic(): number        { return this.bg & BgFlags.ITALIC; }\n  public isDim(): number           { return this.bg & BgFlags.DIM; }\n  public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n  public isProtected(): number     { return this.bg & BgFlags.PROTECTED; }\n  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\n\n  // color modes\n  public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n  public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n  public isFgRGB(): boolean       { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isBgRGB(): boolean       { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isFgPalette(): boolean   { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isBgPalette(): boolean   { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isFgDefault(): boolean   { return (this.fg & Attributes.CM_MASK) === 0; }\n  public isBgDefault(): boolean   { return (this.bg & Attributes.CM_MASK) === 0; }\n  public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n  // colors\n  public getFgColor(): number {\n    switch (this.fg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.fg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.fg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n  public getBgColor(): number {\n    switch (this.bg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.bg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.bg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n\n  // extended attrs\n  public hasExtendedAttrs(): number {\n    return this.bg & BgFlags.HAS_EXTENDED;\n  }\n  public updateExtended(): void {\n    if (this.extended.isEmpty()) {\n      this.bg &= ~BgFlags.HAS_EXTENDED;\n    } else {\n      this.bg |= BgFlags.HAS_EXTENDED;\n    }\n  }\n  public getUnderlineColor(): number {\n    if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n      switch (this.extended.underlineColor & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:  return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n        case Attributes.CM_RGB:   return this.extended.underlineColor & Attributes.RGB_MASK;\n        default:                  return this.getFgColor();\n      }\n    }\n    return this.getFgColor();\n  }\n  public getUnderlineColorMode(): number {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? this.extended.underlineColor & Attributes.CM_MASK\n      : this.getFgColorMode();\n  }\n  public isUnderlineColorRGB(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n      : this.isFgRGB();\n  }\n  public isUnderlineColorPalette(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n          || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n      : this.isFgPalette();\n  }\n  public isUnderlineColorDefault(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n      : this.isFgDefault();\n  }\n  public getUnderlineStyle(): UnderlineStyle {\n    return this.fg & FgFlags.UNDERLINE\n      ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n      : UnderlineStyle.NONE;\n  }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n  private _ext: number = 0;\n  public get ext(): number {\n    if (this._urlId) {\n      return (\n        (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n        (this.underlineStyle << 26)\n      );\n    }\n    return this._ext;\n  }\n  public set ext(value: number) { this._ext = value; }\n\n  public get underlineStyle(): UnderlineStyle {\n    // Always return the URL style if it has one\n    if (this._urlId) {\n      return UnderlineStyle.DASHED;\n    }\n    return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n  }\n  public set underlineStyle(value: UnderlineStyle) {\n    this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n    this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n  }\n\n  public get underlineColor(): number {\n    return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n  public set underlineColor(value: number) {\n    this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n\n  private _urlId: number = 0;\n  public get urlId(): number {\n    return this._urlId;\n  }\n  public set urlId(value: number) {\n    this._urlId = value;\n  }\n\n  constructor(\n    ext: number = 0,\n    urlId: number = 0\n  ) {\n    this._ext = ext;\n    this._urlId = urlId;\n  }\n\n  public clone(): IExtendedAttrs {\n    return new ExtendedAttrs(this._ext, this._urlId);\n  }\n\n  /**\n   * Convenient method to indicate whether the object holds no additional information,\n   * that needs to be persistant in the buffer.\n   */\n  public isEmpty(): boolean {\n    return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n  /** Helper to create CellData from CharData. */\n  public static fromCharData(value: CharData): CellData {\n    const obj = new CellData();\n    obj.setFromCharData(value);\n    return obj;\n  }\n  /** Primitives from terminal buffer. */\n  public content = 0;\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n  public combinedData = '';\n  /** Whether cell contains a combined string. */\n  public isCombined(): number {\n    return this.content & Content.IS_COMBINED_MASK;\n  }\n  /** Width of the cell. */\n  public getWidth(): number {\n    return this.content >> Content.WIDTH_SHIFT;\n  }\n  /** JS string of the content. */\n  public getChars(): string {\n    if (this.content & Content.IS_COMBINED_MASK) {\n      return this.combinedData;\n    }\n    if (this.content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n    }\n    return '';\n  }\n  /**\n   * Codepoint of cell\n   * Note this returns the UTF32 codepoint of single chars,\n   * if content is a combined string it returns the codepoint\n   * of the last char in string to be in line with code in CharData.\n   */\n  public getCode(): number {\n    return (this.isCombined())\n      ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n      : this.content & Content.CODEPOINT_MASK;\n  }\n  /** Set data from CharData */\n  public setFromCharData(value: CharData): void {\n    this.fg = value[CHAR_DATA_ATTR_INDEX];\n    this.bg = 0;\n    let combined = false;\n    // surrogates and combined strings need special treatment\n    if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n      combined = true;\n    }\n    else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n      const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n      // if the 2-char string is a surrogate create single codepoint\n      // everything else is combined\n      if (0xD800 <= code && code <= 0xDBFF) {\n        const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n        }\n        else {\n          combined = true;\n        }\n      }\n      else {\n        combined = true;\n      }\n    }\n    else {\n      this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n    if (combined) {\n      this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n      this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n  /** Get data as CharData. */\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n  /**\n   * bit 1..21    codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n   *              read:   `codepoint = content & Content.codepointMask;`\n   *              write:  `content |= codepoint & Content.codepointMask;`\n   *                      shortcut if precondition `codepoint <= 0x10FFFF` is met:\n   *                      `content |= codepoint;`\n   */\n  CODEPOINT_MASK = 0x1FFFFF,\n\n  /**\n   * bit 22       flag indication whether a cell contains combined content\n   *              read:   `isCombined = content & Content.isCombined;`\n   *              set:    `content |= Content.isCombined;`\n   *              clear:  `content &= ~Content.isCombined;`\n   */\n  IS_COMBINED_MASK = 0x200000,  // 1 << 21\n\n  /**\n   * bit 1..22    mask to check whether a cell contains any string data\n   *              we need to check for codepoint and isCombined bits to see\n   *              whether a cell contains anything\n   *              read:   `isEmpty = !(content & Content.hasContent)`\n   */\n  HAS_CONTENT_MASK = 0x3FFFFF,\n\n  /**\n   * bit 23..24   wcwidth value of cell, takes 2 bits (ranges from 0..2)\n   *              read:   `width = (content & Content.widthMask) >> Content.widthShift;`\n   *                      `hasWidth = content & Content.widthMask;`\n   *                      as long as wcwidth is highest value in `content`:\n   *                      `width = content >> Content.widthShift;`\n   *              write:  `content |= (width << Content.widthShift) & Content.widthMask;`\n   *                      shortcut if precondition `0 <= width <= 3` is met:\n   *                      `content |= width << Content.widthShift;`\n   */\n  WIDTH_MASK = 0xC00000,   // 3 << 22\n  WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n  /**\n   * bit 1..8     blue in RGB, color in P256 and P16\n   */\n  BLUE_MASK = 0xFF,\n  BLUE_SHIFT = 0,\n  PCOLOR_MASK = 0xFF,\n  PCOLOR_SHIFT = 0,\n\n  /**\n   * bit 9..16    green in RGB\n   */\n  GREEN_MASK = 0xFF00,\n  GREEN_SHIFT = 8,\n\n  /**\n   * bit 17..24   red in RGB\n   */\n  RED_MASK = 0xFF0000,\n  RED_SHIFT = 16,\n\n  /**\n   * bit 25..26   color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n   */\n  CM_MASK = 0x3000000,\n  CM_DEFAULT = 0,\n  CM_P16 = 0x1000000,\n  CM_P256 = 0x2000000,\n  CM_RGB = 0x3000000,\n\n  /**\n   * bit 1..24  RGB room\n   */\n  RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n  /**\n   * bit 27..32\n   */\n  INVERSE = 0x4000000,\n  BOLD = 0x8000000,\n  UNDERLINE = 0x10000000,\n  BLINK = 0x20000000,\n  INVISIBLE = 0x40000000,\n  STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n  /**\n   * bit 27..32 (upper 2 unused)\n   */\n  ITALIC = 0x4000000,\n  DIM = 0x8000000,\n  HAS_EXTENDED = 0x10000000,\n  PROTECTED = 0x20000000,\n  OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n  /**\n   * bit 27..32 (upper 3 unused)\n   */\n  UNDERLINE_STYLE = 0x1C000000\n}\n\nexport const enum UnderlineStyle {\n  NONE = 0,\n  SINGLE = 1,\n  DOUBLE = 2,\n  CURLY = 3,\n  DOTTED = 4,\n  DASHED = 5\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n *       due to additional sanity checks. We can avoid them since\n *       we always operate on legal UTF32 (granted by the input decoders)\n *       and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n  if (codePoint > 0xFFFF) {\n    codePoint -= 0x10000;\n    return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n  }\n  return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n  let result = '';\n  for (let i = start; i < end; ++i) {\n    let codepoint = data[i];\n    if (codepoint > 0xFFFF) {\n      // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n      // pair conversion rules:\n      //  - subtract 0x10000 from code point, leaving a 20 bit number\n      //  - add high 10 bits to 0xD800  --> first surrogate\n      //  - add low 10 bits to 0xDC00   --> second surrogate\n      codepoint -= 0x10000;\n      result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n    } else {\n      result += String.fromCharCode(codepoint);\n    }\n  }\n  return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n  private _interim: number = 0;\n\n  /**\n   * Clears interim and resets decoder to clean state.\n   */\n  public clear(): void {\n    this._interim = 0;\n  }\n\n  /**\n   * Decode JS string to UTF32 codepoints.\n   * The methods assumes stream input and will store partly transmitted\n   * surrogate pairs and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided input data does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: string, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let startPos = 0;\n\n    // handle leftover surrogate high\n    if (this._interim) {\n      const second = input.charCodeAt(startPos++);\n      if (0xDC00 <= second && second <= 0xDFFF) {\n        target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n      } else {\n        // illegal codepoint (USC2 handling)\n        target[size++] = this._interim;\n        target[size++] = second;\n      }\n      this._interim = 0;\n    }\n\n    for (let i = startPos; i < length; ++i) {\n      const code = input.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          this._interim = code;\n          return size;\n        }\n        const second = input.charCodeAt(i);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          // illegal codepoint (USC2 handling)\n          target[size++] = code;\n          target[size++] = second;\n        }\n        continue;\n      }\n      if (code === 0xFEFF) {\n        // BOM\n        continue;\n      }\n      target[size++] = code;\n    }\n    return size;\n  }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n  public interim: Uint8Array = new Uint8Array(3);\n\n  /**\n   * Clears interim bytes and resets decoder to clean state.\n   */\n  public clear(): void {\n    this.interim.fill(0);\n  }\n\n  /**\n   * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n   * The methods assumes stream input and will store partly transmitted bytes\n   * and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided data chunk does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: Uint8Array, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let byte1: number;\n    let byte2: number;\n    let byte3: number;\n    let byte4: number;\n    let codepoint = 0;\n    let startPos = 0;\n\n    // handle leftover bytes\n    if (this.interim[0]) {\n      let discardInterim = false;\n      let cp = this.interim[0];\n      cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n      let pos = 0;\n      let tmp: number;\n      while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n        cp <<= 6;\n        cp |= tmp;\n      }\n      // missing bytes - read ahead from input\n      const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n      const missing = type - pos;\n      while (startPos < missing) {\n        if (startPos >= length) {\n          return 0;\n        }\n        tmp = input[startPos++];\n        if ((tmp & 0xC0) !== 0x80) {\n          // wrong continuation, discard interim bytes completely\n          startPos--;\n          discardInterim = true;\n          break;\n        } else {\n          // need to save so we can continue short inputs in next call\n          this.interim[pos++] = tmp;\n          cp <<= 6;\n          cp |= tmp & 0x3F;\n        }\n      }\n      if (!discardInterim) {\n        // final test is type dependent\n        if (type === 2) {\n          if (cp < 0x80) {\n            // wrong starter byte\n            startPos--;\n          } else {\n            target[size++] = cp;\n          }\n        } else if (type === 3) {\n          if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n            // illegal codepoint or BOM\n          } else {\n            target[size++] = cp;\n          }\n        } else {\n          if (cp < 0x010000 || cp > 0x10FFFF) {\n            // illegal codepoint\n          } else {\n            target[size++] = cp;\n          }\n        }\n      }\n      this.interim.fill(0);\n    }\n\n    // loop through input\n    const fourStop = length - 4;\n    let i = startPos;\n    while (i < length) {\n      /**\n       * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n       * This is a compromise between speed gain for ASCII\n       * and penalty for non ASCII:\n       * For best ASCII performance the char should be stored directly into target,\n       * but even a single attempt to write to target and compare afterwards\n       * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n       * which reduces ASCII performance by ~15%.\n       * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n       * compared to the gains.\n       * Note that this optimization only takes place for 4 consecutive ASCII chars,\n       * for any shorter it bails out. Worst case - all 4 bytes being read but\n       * thrown away due to the last being a non ASCII char (-10% performance).\n       */\n      while (i < fourStop\n        && !((byte1 = input[i]) & 0x80)\n        && !((byte2 = input[i + 1]) & 0x80)\n        && !((byte3 = input[i + 2]) & 0x80)\n        && !((byte4 = input[i + 3]) & 0x80))\n      {\n        target[size++] = byte1;\n        target[size++] = byte2;\n        target[size++] = byte3;\n        target[size++] = byte4;\n        i += 4;\n      }\n\n      // reread byte1\n      byte1 = input[i++];\n\n      // 1 byte\n      if (byte1 < 0x80) {\n        target[size++] = byte1;\n\n        // 2 bytes\n      } else if ((byte1 & 0xE0) === 0xC0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n        if (codepoint < 0x80) {\n          // wrong starter byte\n          i--;\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 3 bytes\n      } else if ((byte1 & 0xF0) === 0xE0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n        if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n          // illegal codepoint or BOM, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 4 bytes\n      } else if ((byte1 & 0xF8) === 0xF0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          this.interim[2] = byte3;\n          return size;\n        }\n        byte4 = input[i++];\n        if ((byte4 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n        if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n          // illegal codepoint, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n      } else {\n        // illegal byte, just skip\n      }\n    }\n    return size;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n  log: LogType;\n  error: LogType;\n  info: LogType;\n  trace: LogType;\n  warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n  trace: LogLevelEnum.TRACE,\n  debug: LogLevelEnum.DEBUG,\n  info: LogLevelEnum.INFO,\n  warn: LogLevelEnum.WARN,\n  error: LogLevelEnum.ERROR,\n  off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n    // For trace logging, assume the latest created log service is valid\n    traceLogger = this;\n  }\n\n  private _updateLogLevel(): void {\n    this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n  }\n\n  private _evalLazyOptionalParams(optionalParams: any[]): void {\n    for (let i = 0; i < optionalParams.length; i++) {\n      if (typeof optionalParams[i] === 'function') {\n        optionalParams[i] = optionalParams[i]();\n      }\n    }\n  }\n\n  private _log(type: LogType, message: string, optionalParams: any[]): void {\n    this._evalLazyOptionalParams(optionalParams);\n    type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n  traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n  if (typeof descriptor.value !== 'function') {\n    throw new Error('not supported');\n  }\n  const fnKey = 'value';\n  const fn = descriptor.value;\n  descriptor[fnKey] = function (...args: any[]) {\n    // Early exit\n    if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n      return fn.apply(this, args);\n    }\n\n    traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n    const result = fn.apply(this, args);\n    traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n    return result;\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n  return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n  if (serviceRegistry.has(id)) {\n    return serviceRegistry.get(id)!;\n  }\n\n  const decorator: any = function (target: Function, key: string, index: number): any {\n    if (arguments.length !== 3) {\n      throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n    }\n\n    storeServiceDependency(decorator, target, index);\n  };\n\n  decorator.toString = () => id;\n\n  serviceRegistry.set(id, decorator);\n  return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n  if ((target as any)[DI_TARGET] === target) {\n    (target as any)[DI_DEPENDENCIES].push({ id, index });\n  } else {\n    (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n    (target as any)[DI_TARGET] = target;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: undefined;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n  isUserScrolling: boolean;\n  onResize: IEvent<{ cols: number, rows: number }>;\n  onScroll: IEvent<number>;\n  scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n  scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n  resize(cols: number, rows: number): void;\n  reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n  activeProtocol: string;\n  activeEncoding: string;\n  areMouseEventsActive: boolean;\n  addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n  addEncoding(name: string, encoding: CoreMouseEncoding): void;\n  reset(): void;\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n  /**\n   * Event to announce changes in mouse tracking.\n   */\n  onProtocolChange: IEvent<CoreMouseEventType>;\n\n  /**\n   * Human readable version of mouse events.\n   */\n  explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n  serviceBrand: undefined;\n\n  /**\n   * Initially the cursor will not be visible until the first time the terminal\n   * is focused.\n   */\n  isCursorInitialized: boolean;\n  isCursorHidden: boolean;\n\n  readonly modes: IModes;\n  readonly decPrivateModes: IDecPrivateModes;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\n  readonly onBinary: IEvent<string>;\n  readonly onRequestScrollToBottom: IEvent<void>;\n\n  reset(): void;\n\n  /**\n   * Triggers the onData event in the public API.\n   * @param data The data that is being emitted.\n   * @param wasUserInput Whether the data originated from the user (as opposed to\n   * resulting from parsing incoming data). When true this will also:\n   * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n   * - Fire the `onUserInput` event (so selection can be cleared).\n   */\n  triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n  /**\n   * Triggers the onBinary event in the public API.\n   * @param data The data that is being emitted.\n   */\n  triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n  serviceBrand: undefined;\n\n  charset: ICharset | undefined;\n  readonly glevel: number;\n\n  reset(): void;\n\n  /**\n   * Set the G level of the terminal.\n   * @param g\n   */\n  setgLevel(g: number): void;\n\n  /**\n   * Set the charset for the given G level of the terminal.\n   * @param g\n   * @param charset\n   */\n  setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n    : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  serviceBrand: undefined;\n\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n  getService<T>(id: IServiceIdentifier<T>): T | undefined;\n  createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\n  debug(message: any, ...optionalParams: any[]): void;\n  info(message: any, ...optionalParams: any[]): void;\n  warn(message: any, ...optionalParams: any[]): void;\n  error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n  serviceBrand: undefined;\n\n  /**\n   * Read only access to the raw options object, this is an internal-only fast path for accessing\n   * single options without any validation as we trust TypeScript to enforce correct usage\n   * internally.\n   */\n  readonly rawOptions: Required<ITerminalOptions>;\n\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n  allowProposedApi?: boolean;\n  allowTransparency?: boolean;\n  altClickMovesCursor?: boolean;\n  cols?: number;\n  convertEol?: boolean;\n  cursorBlink?: boolean;\n  cursorStyle?: CursorStyle;\n  cursorWidth?: number;\n  cursorInactiveStyle?: CursorInactiveStyle;\n  customGlyphs?: boolean;\n  disableStdin?: boolean;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsMode?: boolean;\n  windowsPty?: IWindowsPty;\n  windowOptions?: IWindowOptions;\n  wordSeparator?: string;\n  overviewRulerWidth?: number;\n\n  [key: string]: any;\n  cancelEvents: boolean;\n  termName: string;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selectionForeground?: string;\n  selectionBackground?: string;\n  selectionInactiveBackground?: string;\n  black?: string;\n  red?: string;\n  green?: string;\n  yellow?: string;\n  blue?: string;\n  magenta?: string;\n  cyan?: string;\n  white?: string;\n  brightBlack?: string;\n  brightRed?: string;\n  brightGreen?: string;\n  brightYellow?: string;\n  brightBlue?: string;\n  brightMagenta?: string;\n  brightCyan?: string;\n  brightWhite?: string;\n  extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n  serviceBrand: undefined;\n  /**\n   * Registers a link to the service, returning the link ID. The link data is managed by this\n   * service and will be freed when this current cursor position is trimmed off the buffer.\n   */\n  registerLink(linkData: IOscLinkData): number;\n  /**\n   * Adds a line to a link if needed.\n   */\n  addLineToLink(linkId: number, y: number): void;\n  /** Get the link data associated with a link ID. */\n  getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n  serviceBrand: undefined;\n  /** Register an Unicode version provider. */\n  register(provider: IUnicodeVersionProvider): void;\n  /** Registered Unicode versions. */\n  readonly versions: string[];\n  /** Currently active version. */\n  activeVersion: string;\n  /** Event triggered, when activate version changed. */\n  readonly onChange: IEvent<string>;\n\n  /**\n   * Unicode version dependent\n   */\n  wcwidth(codepoint: number): number;\n  getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n  readonly version: string;\n  wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n  serviceBrand: undefined;\n  readonly decorations: IterableIterator<IInternalDecoration>;\n  readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n  readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n  registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n  reset(): void;\n  /**\n   * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n   * instead of an iterator as it's typically used in hot code paths.\n   */\n  forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n  readonly options: IDecorationOptions;\n  readonly backgroundColorRGB: IColor | undefined;\n  readonly foregroundColorRGB: IColor | undefined;\n  readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { ITerminalAddon, Terminal } from 'xterm';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon {\n  private _terminal?: Terminal;\n  private _renderer?: WebglRenderer;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _preserveDrawingBuffer?: boolean\n  ) {\n    if (isSafari && getSafariVersion() < 16) {\n      throw new Error('Webgl2 is only supported on Safari 16 and above');\n    }\n    super();\n  }\n\n  public activate(terminal: Terminal): void {\n    const core = (terminal as any)._core as ITerminal;\n    if (!terminal.element) {\n      this.register(core.onWillOpen(() => this.activate(terminal)));\n      return;\n    }\n\n    this._terminal = terminal;\n    const coreService: ICoreService = core.coreService;\n    const optionsService: IOptionsService = core.optionsService;\n\n    const unsafeCore = core as any;\n    const renderService: IRenderService = unsafeCore._renderService;\n    const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n    const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n    const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n    const decorationService: IDecorationService = unsafeCore._decorationService;\n    const logService: ILogService = unsafeCore._logService;\n    const themeService: IThemeService = unsafeCore._themeService;\n\n    // Set trace logger just in case it hasn't been yet which could happen when the addon is\n    // bundled separately to the core module\n    setTraceLogger(logService);\n\n    this._renderer = this.register(new WebglRenderer(\n      terminal,\n      characterJoinerService,\n      charSizeService,\n      coreBrowserService,\n      coreService,\n      decorationService,\n      optionsService,\n      themeService,\n      this._preserveDrawingBuffer\n    ));\n    this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss));\n    this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n    this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n    this.register(forwardEvent(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n    renderService.setRenderer(this._renderer);\n\n    this.register(toDisposable(() => {\n      const renderService: IRenderService = (this._terminal as any)._core._renderService;\n      renderService.setRenderer((this._terminal as any)._core._createRenderer());\n      renderService.handleResize(terminal.cols, terminal.rows);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._renderer?.textureAtlas;\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderer?.clearTextureAtlas();\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","self","INDICES_PER_CELL","BYTES_PER_CELL","Float32Array","BYTES_PER_ELEMENT","$glyph","$i","$leftCellPadding","$clippedPixels","GlyphRenderer","Disposable","constructor","_terminal","_gl","_dimensions","super","_activeBuffer","_vertices","count","attributes","attributesBuffers","gl","this","undefined","TextureAtlas","maxAtlasPages","Math","min","throwIfFalsy","getParameter","MAX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","_program","createProgram","maxFragmentShaderTextureUnits","textureConditionals","i","createFragmentShaderSource","register","toDisposable","deleteProgram","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","_vertexArrayObject","createVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","deleteBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","Uint8Array","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","useProgram","textureUnits","Int32Array","uniform1iv","uniformMatrix4fv","PROJECTION_MATRIX","_atlasTextures","glTexture","GLTexture","createTexture","deleteTexture","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","RGBA","UNSIGNED_BYTE","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","handleResize","beginFrame","_atlas","updateCell","x","y","code","bg","fg","ext","chars","lastBg","_updateCell","array","cols","NULL_CELL_CODE","length","getRasterizedGlyphCombinedChar","getRasterizedGlyph","floor","device","cell","width","char","offset","left","top","size","canvas","height","texturePage","texturePositionClipSpace","pages","sizeClipSpace","fill","clear","terminal","newCount","rows","viewport","uniform2f","render","renderModel","activeBuffer","bufferLength","lineLengths","si","sub","subarray","set","STREAM_DRAW","version","_bindAtlasPageTexture","drawElementsInstanced","TRIANGLE_STRIP","setAtlas","atlas","generateMipmap","setDimensions","dimensions","traceCall","BYTES_PER_RECTANGLE","Vertices","$rgba","$x1","$y1","$r","$g","$b","$a","RectangleRenderer","_themeService","_verticesCursor","_updateCachedColors","colors","onChangeColors","e","_updateViewportRectangle","renderBackgrounds","_renderVertices","renderCursor","vertices","DYNAMIC_DRAW","_bgFloat","_colorToFloat32Array","background","_cursorFloat","cursor","_addRectangleFloat","updateBackgrounds","model","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","rectangleCount","RENDER_MODEL_INDICIES_PER_CELL","cells","RENDER_MODEL_BG_OFFSET","RENDER_MODEL_FG_OFFSET","_updateRectangle","updateCursor","style","dpr","cursorWidth","startX","endX","ansi","rgba","foreground","expandFloat32Array","_addRectangle","x1","y1","r","g","b","a","color","RENDER_MODEL_EXT_OFFSET","COMBINED_CHAR_BIT_MASK","Uint32Array","selection","createSelectionRenderModel","resize","indexCount","WebglRenderer","_characterJoinerService","_charSizeService","_coreBrowserService","_coreService","_decorationService","_optionsService","preserveDrawingBuffer","_cursorBlinkStateManager","MutableDisposable","_charAtlasDisposable","_model","RenderModel","_workCell","CellData","_rectangleRenderer","_glyphRenderer","_onChangeTextureAtlas","EventEmitter","onChangeTextureAtlas","event","_onAddTextureAtlasCanvas","onAddTextureAtlasCanvas","_onRemoveTextureAtlasCanvas","onRemoveTextureAtlasCanvas","_onRequestRedraw","onRequestRedraw","_onContextLoss","onContextLoss","_handleColorChange","_cellColorResolver","CellColorResolver","_core","_renderLayers","LinkRenderLayer","screenElement","linkifier2","createRenderDimensions","_devicePixelRatio","_updateDimensions","_updateCursorBlink","onOptionChange","_handleOptionsChanged","_canvas","document","createElement","contextAttributes","antialias","depth","getContext","Error","addDisposableDomListener","console","log","preventDefault","_contextRestorationTimeout","setTimeout","warn","fire","clearTimeout","removeTerminalFromCache","_initializeWebGLState","_requestRedrawViewport","observeDevicePixelDimensions","window","w","h","_setCanvasDevicePixelDimensions","appendChild","value","_isAttached","body","contains","l","dispose","parentElement","removeChild","textureAtlas","_charAtlas","_refreshCharAtlas","_clearModel","handleDevicePixelRatioChange","css","handleCharSizeChanged","handleBlur","pause","handleFocus","resume","handleSelectionChanged","start","end","columnSelectMode","update","handleCursorMove","restartBlinkAnimation","acquireTextureAtlas","rawOptions","getDisposeArrayDisposable","forwardEvent","warmUp","clearGlyphRenderer","clearTextureAtlas","clearTexture","reset","registerCharacterJoiner","handler","deregisterCharacterJoiner","joinerId","renderRows","handleGridChanged","_updateModel","isCursorVisible","options","cursorBlink","CursorBlinkStateManager","_requestRedrawCursor","row","line","joinedRanges","isJoined","lastCharX","range","j","clamp","cursorY","buffer","active","baseY","cursorX","lastCursorX","isCursorInitialized","isCursorHidden","modelUpdated","ydisp","lines","get","getJoinedCharacters","result","loadCell","shift","JoinedCellData","translateToString","getChars","getCode","resolve","getWidth","isFocused","cursorStyle","cursorInactiveStyle","cursorAccent","NULL_CELL_CHAR","ceil","lineHeight","round","letterSpacing","AttributeData","firstCell","content","combinedData","_width","isCombined","setFromCharData","getAsCharData","max","createShader","type","source","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","error","getShaderInfoLog","deleteShader","vertexSource","fragmentSource","program","attachShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","newLength","newArray","BaseRenderLayer","_container","id","zIndex","_alpha","_deviceCharWidth","_deviceCharHeight","_deviceCellWidth","_deviceCellHeight","_deviceCharLeft","_deviceCharTop","classList","add","toString","_initCanvas","remove","_ctx","alpha","_clearAll","startRow","endRow","_setTransparency","oldCanvas","cloneNode","replaceChild","colorSet","dim","_fillBottomLineAtCells","fillRect","clearRect","fillStyle","_clearCells","_fillCharTrueColor","font","_getFont","textBaseline","TEXT_BASELINE","_clipCell","fillText","beginPath","rect","clip","isBold","isItalic","fontWeightBold","fontWeight","fontSize","fontFamily","container","coreBrowserService","optionsService","themeService","onShowLinkUnderline","_handleShowLinkUnderline","onHideLinkUnderline","_handleHideLinkUnderline","_state","_clearCurrentLink","middleRowCount","y2","x2","INVERTED_DEFAULT_COLOR","is256Color","node","addEventListener","disposed","removeEventListener","$colors","$fg","$bg","$hasFg","$hasBg","$isSelected","_selectionRenderModel","extended","forEachDecorationAtCell","d","backgroundColorRGB","foregroundColorRGB","isCellSelected","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","selectionForeground","charAtlasCache","deviceCellWidth","deviceCellHeight","deviceCharWidth","deviceCharHeight","devicePixelRatio","newConfig","generateConfig","entry","ownedByIndex","ownedBy","indexOf","configEquals","config","splice","push","core","newEntry","unicodeService","index","clonedColors","NULL_COLOR","selectionBackgroundTransparent","selectionInactiveBackgroundTransparent","slice","contrastCache","halfContrastCache","customGlyphs","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","DIM_OPACITY","isFirefox","isLegacyEdge","_renderCallback","_restartInterval","isPaused","_blinkStartTimeout","_blinkInterval","clearInterval","_animationFrame","cancelAnimationFrame","_animationTimeRestarted","Date","now","requestAnimationFrame","timeToStart","BLINK_INTERVAL","time","setInterval","blockElementDefinitions","patternCharacterDefinitions","boxDrawingDefinitions","xp","yp","powerlineDefinitions","rightPadding","leftPadding","ctx","c","xOffset","yOffset","blockElementDefinition","charDefinition","box","xEighth","yEighth","drawBlockElementChar","patternDefinition","patternSet","cachedPatterns","Map","pattern","tmpCanvas","tmpCtx","imageData","ImageData","startsWith","parseInt","substring","split","map","parseFloat","data","putImageData","createPattern","drawPatternChar","boxDrawingDefinition","strokeStyle","instructions","Object","entries","actualInstructions","lineWidth","Number","instruction","f","svgToCanvasInstructionMap","args","translateArgs","stroke","closePath","drawBoxDrawingChar","powerlineDefinition","clipRegion","Path2D","cssLineWidth","drawPowerlineChar","bezierCurveTo","lineTo","moveTo","cellWidth","cellHeight","doClamp","element","parentWindow","callback","observer","ResizeObserver","find","target","disconnect","devicePixelContentBoxSize","inlineSize","blockSize","observe","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","SelectionRenderModel","hasSelection","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startCol","endCol","selectionStart","selectionEnd","viewportY","NULL_RASTERIZED_GLYPH","texturePosition","_pages","_document","_config","_unicodeService","_didWarmUp","_cacheMap","FourKeyMap","_cacheMapCombined","_activePages","_workBoundingBox","bottom","right","_workAttributeData","_textureSize","_requestClearModel","_createNewPage","_tmpCanvas","createCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","willReadFrequently","page","_doWarmUp","queue","IdleTaskQueue","enqueue","DEFAULT_COLOR","DEFAULT_EXT","rasterizedGlyph","_drawToCache","currentRow","pagesBySize","filter","sort","percentageUsed","sameSizeI","mergingPages","sortedMergingPagesIndexes","glyphs","mergedPageIndex","mergedPage","_mergePages","_deletePage","newPage","AtlasPage","mergedSize","p","drawImage","pageIndex","adjustingPage","restrictToCellHeight","_getFromCacheMap","cacheMap","key","_getColorFromAnsiIndex","idx","_getBackgroundColor","bgColorMode","bgColor","arr","toColorRGB","toColor","opaque","_getForegroundColor","fgColorMode","fgColor","bold","excludeFromContrastRatioDemands","minimumContrastColor","_getMinimumContrastColor","multiplyOpacity","_resolveBackgroundRgba","_resolveForegroundRgba","cache","_getContrastCache","adjustedColor","getColor","bgRgba","fgRgba","ensureContrastRatio","setColor","codeOrChars","String","fromCharCode","allowedWidth","allowedHeight","save","isInvisible","isInverse","isDim","italic","underline","isUnderline","strikethrough","isStrikethrough","overline","isOverline","getFgColor","getFgColorMode","getBgColor","getBgColorMode","temp","temp2","backgroundColor","globalCompositeOperation","fontStyle","powerlineGlyph","charCodeAt","restrictedPowerlineGlyph","isRestrictedPowerlineGlyph","foregroundColor","padding","customGlyph","tryDrawCustomChar","chWidth","enableClearThresholdCheck","wcwidth","getStringCellWidth","isUnderlineColorDefault","isUnderlineColorRGB","getUnderlineColor","join","xLeft","yTop","yMid","yBot","xChLeft","xChRight","xChMid","underlineStyle","yCurlyBot","yCurlyTop","setLineDash","restore","metrics","measureText","actualBoundingBoxDescent","strokeText","isBeyondCellBounds","clearColor","getImageData","isEmpty","checkCompletelyTransparent","_findGlyphBoundingBox","activePage","activeRow","fixedRows","wasPageAndRowFound","candidatePage","addGlyph","boundingBox","restrictedGlyph","found","alphaOffset","_usedPixels","_glyphs","glyph","sourcePages","enableThresholdCheck","fgR","fgG","fgB","threshold","abs","channels","rgb","toPaddedHex","s","contrastRatio","l1","l2","toCss","toRgba","opacity","toChannels","blend","bgR","bgG","bgB","isOpaque","ratio","rgbaColor","factor","$ctx","$litmusColor","isNode","createLinearGradient","match","repeat","rgbaMatch","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","_listeners","_disposed","_event","listener","arg1","arg2","call","clearListeners","from","to","disposeArray","disposables","_disposables","_isDisposed","unregister","_value","TwoKeyMap","_data","first","second","third","fourth","navigator","userAgent","platform","includes","isSafari","test","majorVersion","isMac","isIpad","isIphone","isWindows","isLinux","isChromeOS","TaskQueue","_tasks","_i","task","_start","flush","_idleCallback","_cancelCallback","_requestCallback","_process","bind","deadline","taskDuration","longestTask","lastDeadlineRemaining","timeRemaining","deadlineRemaining","PriorityTaskQueue","_createDeadline","identifier","duration","requestIdleCallback","cancelIdleCallback","_queue","ExtendedAttrs","fromColorRGB","clone","newObj","hasExtendedAttrs","isBlink","isProtected","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","updateExtended","underlineColor","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","_urlId","_ext","urlId","fromCharData","obj","stringFromCodePoint","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","DEFAULT_ATTR","CHAR_DATA_CODE_INDEX","NULL_CELL_WIDTH","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","_interim","decode","input","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","missing","fourStop","optionsKeyToLogLevel","trace","LogLevelEnum","TRACE","debug","DEBUG","info","INFO","WARN","ERROR","off","OFF","traceLogger","LogService","logLevel","_logLevel","_updateLogLevel","onSpecificOptionChange","_evalLazyOptionalParams","optionalParams","_log","message","logger","IOptionsService","_target","descriptor","fn","apply","name","JSON","stringify","DI_TARGET","DI_DEPENDENCIES","serviceRegistry","ctor","has","decorator","arguments","storeServiceDependency","IBufferService","createDecorator","ICoreMouseService","ICoreService","ICharsetService","IInstantiationService","ILogService","IOscLinkService","IUnicodeService","IDecorationService","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","WebglAddon","_preserveDrawingBuffer","getSafariVersion","activate","onWillOpen","coreService","unsafeCore","renderService","_renderService","characterJoinerService","charSizeService","decorationService","logService","_logService","setTraceLogger","_renderer","setRenderer","_createRenderer"],"sourceRoot":""}
\ No newline at end of file
diff --git a/src/www/xterm.css b/src/www/xterm.css
deleted file mode 100644 (file)
index 74acc26..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-/**
- * Copyright (c) 2014 The xterm.js authors. All rights reserved.
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
- * https://github.com/chjj/term.js
- * @license MIT
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * Originally forked from (with the author's permission):
- *   Fabrice Bellard's javascript vt100 for jslinux:
- *   http://bellard.org/jslinux/
- *   Copyright (c) 2011 Fabrice Bellard
- *   The original design remains. The terminal itself
- *   has been extended to include xterm CSI codes, among
- *   other features.
- */
-
-/**
- *  Default styles for xterm.js
- */
-
-.xterm {
-    cursor: text;
-    position: relative;
-    user-select: none;
-    -ms-user-select: none;
-    -webkit-user-select: none;
-}
-
-.xterm.focus,
-.xterm:focus {
-    outline: none;
-}
-
-.xterm .xterm-helpers {
-    position: absolute;
-    top: 0;
-    /**
-     * The z-index of the helpers must be higher than the canvases in order for
-     * IMEs to appear on top.
-     */
-    z-index: 5;
-}
-
-.xterm .xterm-helper-textarea {
-    padding: 0;
-    border: 0;
-    margin: 0;
-    /* Move textarea out of the screen to the far left, so that the cursor is not visible */
-    position: absolute;
-    opacity: 0;
-    left: -9999em;
-    top: 0;
-    width: 0;
-    height: 0;
-    z-index: -5;
-    /** Prevent wrapping so the IME appears against the textarea at the correct position */
-    white-space: nowrap;
-    overflow: hidden;
-    resize: none;
-}
-
-.xterm .composition-view {
-    /* TODO: Composition position got messed up somewhere */
-    background: #000;
-    color: #FFF;
-    display: none;
-    position: absolute;
-    white-space: nowrap;
-    z-index: 1;
-}
-
-.xterm .composition-view.active {
-    display: block;
-}
-
-.xterm .xterm-viewport {
-    /* On OS X this is required in order for the scroll bar to appear fully opaque */
-    background-color: #000;
-    overflow-y: scroll;
-    cursor: default;
-    position: absolute;
-    right: 0;
-    left: 0;
-    top: 0;
-    bottom: 0;
-}
-
-.xterm .xterm-screen {
-    position: relative;
-}
-
-.xterm .xterm-screen canvas {
-    position: absolute;
-    left: 0;
-    top: 0;
-}
-
-.xterm .xterm-scroll-area {
-    visibility: hidden;
-}
-
-.xterm-char-measure-element {
-    display: inline-block;
-    visibility: hidden;
-    position: absolute;
-    top: 0;
-    left: -9999em;
-    line-height: normal;
-}
-
-.xterm.enable-mouse-events {
-    /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */
-    cursor: default;
-}
-
-.xterm.xterm-cursor-pointer,
-.xterm .xterm-cursor-pointer {
-    cursor: pointer;
-}
-
-.xterm.column-select.focus {
-    /* Column selection mode */
-    cursor: crosshair;
-}
-
-.xterm .xterm-accessibility,
-.xterm .xterm-message {
-    position: absolute;
-    left: 0;
-    top: 0;
-    bottom: 0;
-    right: 0;
-    z-index: 10;
-    color: transparent;
-    pointer-events: none;
-}
-
-.xterm .live-region {
-    position: absolute;
-    left: -9999px;
-    width: 1px;
-    height: 1px;
-    overflow: hidden;
-}
-
-.xterm-dim {
-    /* Dim should not apply to background, so the opacity of the foreground color is applied
-     * explicitly in the generated class and reset to 1 here */
-    opacity: 1 !important;
-}
-
-.xterm-underline-1 { text-decoration: underline; }
-.xterm-underline-2 { text-decoration: double underline; }
-.xterm-underline-3 { text-decoration: wavy underline; }
-.xterm-underline-4 { text-decoration: dotted underline; }
-.xterm-underline-5 { text-decoration: dashed underline; }
-
-.xterm-overline {
-    text-decoration: overline;
-}
-
-.xterm-overline.xterm-underline-1 { text-decoration: overline underline; }
-.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; }
-.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; }
-.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; }
-.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; }
-
-.xterm-strikethrough {
-    text-decoration: line-through;
-}
-
-.xterm-screen .xterm-decoration-container .xterm-decoration {
-       z-index: 6;
-       position: absolute;
-}
-
-.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer {
-       z-index: 7;
-}
-
-.xterm-decoration-overview-ruler {
-    z-index: 8;
-    position: absolute;
-    top: 0;
-    right: 0;
-    pointer-events: none;
-}
-
-.xterm-decoration-top {
-    z-index: 2;
-    position: relative;
-}
diff --git a/src/www/xterm.js b/src/www/xterm.js
deleted file mode 100644 (file)
index a68eae6..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(self,(()=>(()=>{"use strict";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(6114),a=i(9924),h=i(844),c=i(5596),l=i(4725),d=i(3656);let _=t.AccessibilityManager=class extends h.Disposable{constructor(e,t){super(),this._terminal=e,this._renderService=t,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=document.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=document.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);if(this._topBoundaryFocusListener=e=>this._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=document.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new a.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar("\n")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this._screenDprMonitor=new c.ScreenDprMonitor(window),this.register(this._screenDprMonitor),this._screenDprMonitor.setListener((()=>this._refreshRowsDimensions())),this.register((0,d.addDisposableDomListener)(window,"resize",(()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,h.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t<e;t++)this._handleChar(" ")}_handleChar(e){this._liveRegionLineCount<21&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)),o.isMac&&this._liveRegion.textContent&&this._liveRegion.textContent.length>0&&!this._liveRegion.parentNode&&setTimeout((()=>{this._accessibilityContainer.appendChild(this._liveRegion)}),0))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0,o.isMac&&this._liveRegion.remove()}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.translateBufferLineToString(i.ydisp+r,!0),t=(i.ydisp+r+1).toString(),n=this._rowElements[r];n&&(0===e.length?n.innerText=" ":n.textContent=e,n.setAttribute("aria-posinset",t),n.setAttribute("aria-setsize",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute("aria-posinset")===(0===t?"1":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),n.removeEventListener("focus",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement("afterbegin",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=document.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e])}}_refreshRowDimensions(e){e.style.height=`${this._renderService.dimensions.css.cell.height}px`}};t.AccessibilityManager=_=s([r(1,l.IRenderService)],_)},3614:(e,t)=>{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"\e[200~"+e+"\e[201~":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=""}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}Object.defineProperty(t,"__esModule",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData("text/plain"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},6465:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier2=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585);let c=t.Linkifier2=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e){super(),this._bufferService=e,this._linkProviders=[],this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0})))}registerLinkProvider(e){return this._linkProviders.push(e),{dispose:()=>{const t=this._linkProviders.indexOf(e);-1!==t&&this._linkProviders.splice(t,1)}}}attachToDom(e,t,i){this._element=e,this._mouseService=t,this._renderService=i,this.register((0,n.addDisposableDomListener)(this._element,"mouseleave",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){if(this._lastMouseEvent=e,!this._element||!this._mouseService)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e<i.length;e++){const t=i[e];if(t.classList.contains("xterm"))break;if(t.classList.contains("xterm-hover"))return}this._lastBufferCell&&t.x===this._lastBufferCell.x&&t.y===this._lastBufferCell.y||(this._handleHover(t),this._lastBufferCell=t)}_handleHover(e){if(this._activeLine!==e.y||this._wasResized)return this._clearCurrentLink(),this._askForLink(e,!1),void(this._wasResized=!1);this._currentLink&&this._linkAtPosition(this._currentLink.link,e)||(this._clearCurrentLink(),this._askForLink(e,!0))}_askForLink(e,t){var i,s;this._activeProviderReplies&&t||(null===(i=this._activeProviderReplies)||void 0===i||i.forEach((e=>{null==e||e.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(const[i,n]of this._linkProviders.entries())t?(null===(s=this._activeProviderReplies)||void 0===s?void 0:s.get(i))&&(r=this._checkLinkProviderResult(i,e,r)):n.provideLinks(e.y,(t=>{var s,n;if(this._isMouseOut)return;const o=null==t?void 0:t.map((e=>({link:e})));null===(s=this._activeProviderReplies)||void 0===s||s.set(i,o),r=this._checkLinkProviderResult(i,e,r),(null===(n=this._activeProviderReplies)||void 0===n?void 0:n.size)===this._linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;s<t.size;s++){const r=t.get(s);if(r)for(let t=0;t<r.length;t++){const s=r[t],n=s.link.range.start.y<e?0:s.link.range.start.x,o=s.link.range.end.y>e?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){var s;if(!this._activeProviderReplies)return i;const r=this._activeProviderReplies.get(e);let n=!1;for(let t=0;t<e;t++)this._activeProviderReplies.has(t)&&!this._activeProviderReplies.get(t)||(n=!0);if(!n&&r){const e=r.find((e=>this._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviders.length&&!i)for(let e=0;e<this._activeProviderReplies.size;e++){const r=null===(s=this._activeProviderReplies.get(e))||void 0===s?void 0:s.find((e=>this._linkAtPosition(e.link,t)));if(r){i=!0,this._handleNewLink(r);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._element||!this._mouseService||!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._element&&this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._element||!this._lastMouseEvent||!this._mouseService)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.pointerCursor},set:e=>{var t,i;(null===(t=this._currentLink)||void 0===t?void 0:t.state)&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&(null===(i=this._element)||void 0===i||i.classList.toggle("xterm-cursor-pointer",e)))}},underline:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.underline},set:t=>{var i,s,r;(null===(i=this._currentLink)||void 0===i?void 0:i.state)&&(null===(r=null===(s=this._currentLink)||void 0===s?void 0:s.state)||void 0===r?void 0:r.decorations.underline)!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._renderService&&this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent&&this._element)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier2=c=s([r(0,h.IBufferService)],c)},9042:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel="Terminal input",t.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){var i;const s=this._bufferService.buffer.lines.get(e-1);if(!s)return void t(void 0);const r=[],o=this._optionsService.rawOptions.linkHandler,a=new n.CellData,c=s.getTrimmedLength();let l=-1,d=-1,_=!1;for(let t=0;t<c;t++)if(-1!==d||s.hasContent(t)){if(s.loadCell(t,a),a.hasExtendedAttrs()&&a.extended.urlId){if(-1===d){d=t,l=a.extended.urlId;continue}_=a.extended.urlId!==l}else-1!==d&&(_=!0);if(_||-1!==d&&t===c-1){const s=null===(i=this._oscLinkService.getLinkData(l))||void 0===i?void 0:i.uri;if(s){const i={start:{x:d+1,y:e},end:{x:t+(_||t!==c-1?0:1),y:e}};let n=!1;if(!(null==o?void 0:o.allowNonHttpProtocols))try{const e=new URL(s);["http:","https:"].includes(e.protocol)||(n=!0)}catch(e){n=!0}n||r.push({text:s,range:i,activate:(e,t)=>o?o.activate(e,t,i):h(0,t),hover:(e,t)=>{var s;return null===(s=null==o?void 0:o.hover)||void 0===s?void 0:s.call(o,e,t,i)},leave:(e,t)=>{var s;return null===(s=null==o?void 0:o.leave)||void 0===s?void 0:s.call(o,e,t,i)}})}_=!1,a.hasExtendedAttrs()&&a.extended.urlId?(d=t,l=a.extended.urlId):(d=-1,l=-1)}}t(r)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\n\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch(e){}e.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._parentWindow=e,this._renderCallback=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._parentWindow.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},5596:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ScreenDprMonitor=void 0;const s=i(844);class r extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this.register((0,s.toDisposable)((()=>{this.clearListener()})))}setListener(e){this._listener&&this.clearListener(),this._listener=e,this._outerListener=()=>{this._listener&&(this._listener(this._parentWindow.devicePixelRatio,this._currentDevicePixelRatio),this._updateDpr())},this._updateDpr()}_updateDpr(){var e;this._outerListener&&(null===(e=this._resolutionMediaMatchList)||void 0===e||e.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._listener&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._listener=void 0,this._outerListener=void 0)}}t.ScreenDprMonitor=r},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(6465),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),y=i(8969),w=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O="undefined"!=typeof window?window.document:null;class P extends y.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new w.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new w.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new w.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new w.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new w.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new w.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new w.EventEmitter),this._onBlur=this.register(new w.EventEmitter),this._onA11yCharEmitter=this.register(new w.EventEmitter),this._onA11yTabEmitter=this.register(new w.EventEmitter),this._onWillOpen=this.register(new w.EventEmitter),this._setup(),this.linkifier2=this.register(this._instantiationService.createInstance(n.Linkifier2)),this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,w.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,w.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{var e,t;this._customKeyEventHandler=void 0,null===(t=null===(e=this.element)||void 0===e?void 0:e.parentNode)||void 0===t||t.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i="";switch(t.index){case 256:e="foreground",i="10";break;case 257:e="background",i="11";break;case 258:e="cursor",i="12";break;default:e="ansi",i="4;"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if("ansi"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.rgba.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.rgba.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[I"),this.updateCursorStyle(e),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){var e;return null===(e=this.textarea)||void 0===e?void 0:e.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+"px",this.textarea.style.top=o+"px",this.textarea.style.width=n+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,"copy",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,"paste",e)),this.register((0,r.addDisposableDomListener)(this.element,"paste",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,"contextmenu",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,"auxclick",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,"keyup",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keydown",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keypress",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionstart",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionupdate",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionend",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,"input",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){var t;if(!e)throw new Error("Terminal requires a parent element.");e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this._document=e.ownerDocument,this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),e.appendChild(this.element);const i=O.createDocumentFragment();this._viewportElement=O.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),i.appendChild(this._viewportElement),this._viewportScrollArea=O.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=O.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._helperContainer=O.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),i.appendChild(this.screenElement),this.textarea=O.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",o.promptLabel),k.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,null!==(t=this._document.defaultView)&&void 0!==t?t:window),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,"focus",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"blur",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=O.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this.element.appendChild(i);try{this._onWillOpen.fire(this.element)}catch(e){}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier2)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,"scroll",(()=>this._selectionService.refresh()))),this.linkifier2.attachToDom(this.screenElement,this._mouseService,this._renderService),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this.element,this.screenElement,this._viewportElement,this.linkifier2)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case"mousemove":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case"mouseup":r=0,s=t.button<3?t.button:3;break;case"mousedown":r=1,s=t.button<3?t.button:3;break;case"wheel":if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.removeEventListener("mousemove",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?("debug"===this.optionsService.rawOptions.logLevel&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(e)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener("mousemove",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener("mousemove",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener("wheel",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener("wheel",s.wheel),s.wheel=null),2&e?s.mouseup||(t.addEventListener("mouseup",n.mouseup),s.mouseup=n.mouseup):(this._document.removeEventListener("mouseup",s.mouseup),t.removeEventListener("mouseup",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener("mousemove",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,"mousedown",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.addEventListener("mousemove",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,"wheel",(e=>{if(!s.wheel){if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");let s="";for(let e=0;e<Math.abs(t);e++)s+=i;return this.coreService.triggerDataEvent(s,!0),this.cancel(e,!0)}return this.viewport.handleWheel(e)?this.cancel(e):void 0}}),{passive:!1})),this.register((0,r.addDisposableDomListener)(t,"touchstart",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,"touchmove",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){var i;null===(i=this._renderService)||void 0===i||i.refreshRows(e,t)}updateCursorStyle(e){var t;(null===(t=this._selectionService)||void 0===t?void 0:t.shouldColumnSelect(e))?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){var s;1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):null===(s=this.viewport)||void 0===s||s.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}registerLinkProvider(e){return this.linkifier2.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){var e;null===(e=this._selectionService)||void 0===e||e.clearSelection()}selectAll(){var e;null===(e=this._selectionService)||void 0===e||e.selectAll()}selectLines(e,t){var i;null===(i=this._selectionService)||void 0===i||i.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=""),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState("AltGraph");return"keypress"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){var i,s;null===(i=this._charSizeService)||void 0===i||i.measure(),null===(s=this.viewport)||void 0===s||s.syncScrollArea(!0)}clear(){var e;if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e<this.rows;e++)this.buffer.lines.push(this.buffer.getBlankLine(L.DEFAULT_ATTR_DATA));this._onScroll.fire({position:this.buffer.ydisp,source:0}),null===(e=this.viewport)||void 0===e||e.reset(),this.refresh(0,this.rows-1)}}reset(){var e,t;this.options.rows=this.rows,this.options.cols=this.cols;const i=this._customKeyEventHandler;this._setup(),super.reset(),null===(e=this._selectionService)||void 0===e||e.reset(),this._decorationService.reset(),null===(t=this.viewport)||void 0===t||t.reset(),this._customKeyEventHandler=i,this.refresh(0,this.rows-1)}clearTextureAtlas(){var e;null===(e=this._renderService)||void 0===e||e.clearTextureAtlas()}_reportFocus(){var e;(null===(e=this.element)||void 0===e?void 0:e.classList.contains("focus"))?this.coreService.triggerDataEvent(D.C0.ESC+"[I"):this.coreService.triggerDataEvent(D.C0.ESC+"[O")}_reportWindowsOptions(e){if(this._renderService)switch(e){case T.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:const e=this._renderService.dimensions.css.canvas.width.toFixed(0),t=this._renderService.dimensions.css.canvas.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[4;${t};${e}t`);break;case T.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:const i=this._renderService.dimensions.css.cell.width.toFixed(0),s=this._renderService.dimensions.css.cell.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[6;${s};${i}t`)}}cancel(e,t){if(this.options.cancelEvents||t)return e.preventDefault(),e.stopPropagation(),!1}}t.Terminal=P},9924:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderService.dimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderService.dimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderService.dimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i<this._lastRecordedBufferHeight)||(e.cancelable&&e.preventDefault(),!1)}handleWheel(e){const t=this._getPixelsScrolled(e);return 0!==t&&(this._optionsService.rawOptions.smoothScrollDuration?(this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,-1===this._smoothScrollState.target?this._smoothScrollState.target=this._viewportElement.scrollTop+t:this._smoothScrollState.target+=t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()):this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}scrollLines(e){if(0!==e)if(this._optionsService.rawOptions.smoothScrollDuration){const t=e*this._currentRowHeight;this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,this._smoothScrollState.target=this._smoothScrollState.origin+t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()}else this._onRequestScrollLines.fire({amount:e,suppressScrollEvent:!1})}_getPixelsScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_LINE?t*=this._currentRowHeight:e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._currentRowHeight*this._bufferService.rows),t}getBufferElements(e,t){var i;let s,r="";const n=[],o=null!=t?t:this._bufferService.buffer.lines.length,a=this._bufferService.buffer.lines;for(let t=e;t<o;t++){const e=a.get(t);if(!e)continue;const o=null===(i=a.get(t+1))||void 0===i?void 0:i.isWrapped;if(r+=e.translateToString(!o),!o||t===a.length-1){const e=document.createElement("div");e.textContent=r,n.push(e),r.length>0&&(s=e),r=""}}return{bufferElements:n,cursorElement:s}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return"alt"===i&&t.altKey||"ctrl"===i&&t.ctrlKey||"shift"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(3656),o=i(4725),a=i(844),h=i(2585);let c=t.BufferDecorationRenderer=class extends a.Disposable{constructor(e,t,i,s){super(),this._screenElement=e,this._bufferService=t,this._decorationService=i,this._renderService=s,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register((0,n.addDisposableDomListener)(window,"resize",(()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,a.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){var t,i;const s=document.createElement("div");s.classList.add("xterm-decoration"),s.classList.toggle("xterm-decoration-top-layer","top"===(null===(t=null==e?void 0:e.options)||void 0===t?void 0:t.layer)),s.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,s.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",s.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",s.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const r=null!==(i=e.options.x)&&void 0!==i?i:0;return r&&r>this._bufferService.cols&&(s.style.display="none"),this._refreshXPosition(e,s),s}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.display=this._altBufferIsActive?"none":"block",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){var i;if(!t)return;const s=null!==(i=e.options.x)&&void 0!==i?i:0;"right"===(e.options.anchor||"left")?t.style.right=s?s*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=s?s*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){var t;null===(t=this._decorationElements.get(e))||void 0===t||t.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=c=s([r(1,h.IBufferService),r(2,h.IDecorationService),r(3,o.IRenderService)],c)},5871:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex<this._zonePool.length)return this._zonePool[this._zonePoolIndex].color=e.options.overviewRulerOptions.color,this._zonePool[this._zonePoolIndex].position=e.options.overviewRulerOptions.position,this._zonePool[this._zonePoolIndex].startBufferLine=e.marker.line,this._zonePool[this._zonePoolIndex].endBufferLine=e.marker.line,void this._zones.push(this._zonePool[this._zonePoolIndex++]);this._zones.push({color:e.options.overviewRulerOptions.color,position:e.options.overviewRulerOptions.position,startBufferLine:e.marker.line,endBufferLine:e.marker.line}),this._zonePool.push(this._zones[this._zones.length-1]),this._zonePoolIndex++}}setPadding(e){this._linePadding=e}_lineIntersectsZone(e,t){return t>=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||"full"]&&t<=e.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(3656),a=i(4725),h=i(844),c=i(2585),l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0},_={full:0,left:0,center:0,right:0};let u=t.OverviewRulerRenderer=class extends h.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,a){var c;super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowseService=a,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),null===(c=this._viewportElement.parentElement)||void 0===c||c.insertBefore(this._canvas,this._viewportElement);const l=this._canvas.getContext("2d");if(!l)throw new Error("Ctx cannot be null");this._ctx=l,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,h.toDisposable)((()=>{var e;null===(e=this._canvas)||void 0===e||e.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",(()=>this._queueRefresh(!0)))),this.register((0,o.addDisposableDomListener)(this._coreBrowseService.window,"resize",(()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);d.full=this._canvas.width,d.left=e,d.center=t,d.right=e,this._refreshDrawHeightConstants(),_.full=0,_.left=0,_.center=d.left,_.right=d.left+d.center}_refreshDrawHeightConstants(){l.full=Math.round(2*this._coreBrowseService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowseService.dpr);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowseService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowseService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)"full"!==t.position&&this._renderColorZone(t);for(const t of e)"full"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(_[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-l[e.position||"full"]/2),d[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowseService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=u=s([r(2,c.IBufferService),r(3,c.IDecorationService),r(4,a.IRenderService),r(5,c.IOptionsService),r(6,a.ICoreBrowserService)],u)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.length<e.length?this._coreService.triggerDataEvent(`${a.C0.DEL}`,!0):t.length===e.length&&t!==e&&this._coreService.triggerDataEvent(t,!0)}}),0)}updateCompositionElements(e){if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){const e=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),t=this._renderService.dimensions.css.cell.height,i=this._bufferService.buffer.y*this._renderService.dimensions.css.cell.height,s=e*this._renderService.dimensions.css.cell.width;this._compositionView.style.left=s+"px",this._compositionView.style.top=i+"px",this._compositionView.style.height=t+"px",this._compositionView.style.lineHeight=t+"px",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+"px";const r=this._compositionView.getBoundingClientRect();this._textarea.style.left=s+"px",this._textarea.style.top=i+"px",this._textarea.style.width=Math.max(r.width,1)+"px",this._textarea.style.height=Math.max(r.height,1)+"px",this._textarea.style.lineHeight=r.height+"px"}e||setTimeout((()=>this.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue("padding-left")),o=parseInt(r.getPropertyValue("padding-top"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n<Math.abs(r-a);n++){const a="A"===o(e,t)?-1:1,h=i.buffer.lines.get(r+a*n);(null==h?void 0:h.isWrapped)&&s++}return s}(e,t,i);return c(l,h(o(e,t),s))}function n(e,t){let i=0,s=t.buffer.lines.get(e),r=null==s?void 0:s.isWrapped;for(;r&&e>=0&&e<t.rows;)i++,s=t.buffer.lines.get(--e),r=null==s?void 0:s.isWrapped;return i}function o(e,t){return e>t?"A":"B"}function a(e,t,i,s,r,n){let o=e,a=t,h="";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?"O":"[";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i="";for(let s=0;s<e;s++)i+=t;return i}t.moveToCellSequence=function(e,t,i,s){const o=i.buffer.x,l=i.buffer.y;if(!i.buffer.hasScrollback)return function(e,t,i,s,o,l){return 0===r(t,s,o,l).length?"":c(a(e,t,e,t-n(t,o),!1,o).length,h("D",l))}(o,l,0,t,i,s)+r(l,t,i,s)+function(e,t,i,s,o,l){let d;d=r(t,s,o,l).length>0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e<i&&h<=s||e>=i&&h<s?"C":"D"}(e,t,i,s,o,l);return c(a(e,d,i,_,"C"===u,o).length,h(u,l))}(o,l,e,t,i,s);let d;if(l===t)return d=o>e?"D":"C",c(Math.abs(o-e),h(d,s));d=l>t?"D":"C";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(4725),l=i(8055),d=i(8460),_=i(844),u=i(2585),f="xterm-dom-renderer-owner-",v="xterm-rows",p="xterm-fg-",g="xterm-bg-",m="xterm-focus",S="xterm-selection";let C=1,b=t.DomRenderer=class extends _.Disposable{constructor(e,t,i,s,r,a,c,l,u,p){super(),this._element=e,this._screenElement=t,this._viewportElement=i,this._linkifier2=s,this._charSizeService=a,this._optionsService=c,this._bufferService=l,this._coreBrowserService=u,this._themeService=p,this._terminalClass=C++,this._rowElements=[],this.onRequestRedraw=this.register(new d.EventEmitter).event,this._rowContainer=document.createElement("div"),this._rowContainer.classList.add(v),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=document.createElement("div"),this._selectionContainer.classList.add(S),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=r.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(f+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,_.toDisposable)((()=>{this._element.classList.remove(f+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(document),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${v} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${v} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${v} .xterm-dim { color: ${l.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`,t+="@keyframes blink_box_shadow_"+this._terminalClass+" { 50% {  border-bottom-style: hidden; }}",t+="@keyframes blink_block_"+this._terminalClass+" { 0% {"+`  background-color: ${e.cursor.css};`+`  color: ${e.cursorAccent.css}; } 50% {  background-color: inherit;`+`  color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink:not(.xterm-cursor-block) { animation: blink_box_shadow_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: blink_block_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-block {`+` background-color: ${e.cursor.css};`+` color: ${e.cursorAccent.css};}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-outline {`+` outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-bar {`+` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-underline {`+` border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${S} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${S} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${S} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${p}${i} { color: ${s.css}; }${this._terminalSelector} .${p}${i}.xterm-dim { color: ${l.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${g}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR} { color: ${l.color.opaque(e.background).css}; }${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${l.color.multiplyOpacity(l.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=document.createElement("div");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions()}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(m)}handleFocus(){this._rowContainer.classList.add(m),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;const s=e[1]-this._bufferService.buffer.ydisp,r=t[1]-this._bufferService.buffer.ydisp,n=Math.max(s,0),o=Math.min(r,this._bufferService.rows-1);if(n>=this._bufferService.rows||o<0)return;const a=document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=document.createElement("div");return r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=t*this.dimensions.css.cell.width+"px",r.style.width=this.dimensions.css.cell.width*(i-t)+"px",r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${f}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=b=s([r(4,u.IInstantiationService),r(5,c.ICharSizeService),r(6,u.IOptionsService),r(7,u.IBufferService),r(8,c.ICoreBrowserService),r(9,c.IThemeService)],b)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b<a+1&&(b=a+1);let y=0,w="",E=0,k=0,L=0,D=!1,R=0,x=!1,A=0;const B=[],T=-1!==f&&-1!==p;for(let M=0;M<b;M++){e.loadCell(M,this._workCell);let b=this._workCell.getWidth();if(0===b)continue;let O=!1,P=M,I=this._workCell;if(m.length>0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(" "===N&&(I.isUnderline()||I.isOverline())&&(N=" "),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(y&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){w+=N,y++;continue}y&&(C.textContent=w),C=this._document.createElement("span"),y=0,w=""}else C=this._document.createElement("span");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F)if(B.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&B.push("xterm-cursor-blink"),B.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":B.push("xterm-cursor-outline");break;case"block":B.push("xterm-cursor-block");break;case"bar":B.push("xterm-cursor-bar");break;case"underline":B.push("xterm-cursor-underline")}if(I.isBold()&&B.push("xterm-bold"),I.isItalic()&&B.push("xterm-italic"),I.isDim()&&B.push("xterm-dim"),w=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===w&&(w=" "),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push("xterm-overline")," "===w&&(w=" ")),I.isStrikethrough()&&B.push("xterm-strikethrough"),W&&(C.style.textDecoration="underline");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{"top"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J="top"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push("xterm-decoration-top"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.rgba.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),"0",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.rgba.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,void 0)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=w:y++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&y&&(C.textContent=w),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.excludeFromContrastRatioDemands)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,null!=a?a:null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute("style",`${e.getAttribute("style")||""}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e<s[0]&&t<=s[1]:e<i[0]&&t>=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t<s[1]||i[1]===s[1]&&t===i[1]&&e>=i[0]&&e<s[0]||i[1]<s[1]&&t===s[1]&&e<s[0]||i[1]<s[1]&&t===i[1]&&e>=i[0])}};function v(e,t,i){for(;e.length<i;)e=t+e;return e}t.DomRendererRowFactory=f=s([r(1,l.ICharacterJoinerService),r(2,h.IOptionsService),r(3,l.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,l.IThemeService)],f)},2550:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=e.createElement("div"),this._container.style.position="absolute",this._container.style.top="-50000px",this._container.style.width="50000px",this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const t=e.createElement("span"),i=e.createElement("span");i.style.fontWeight="bold";const s=e.createElement("span");s.style.fontStyle="italic";const r=e.createElement("span");r.style.fontWeight="bold",r.style.fontStyle="italic",this._measureElements=[t,i,s,r],this._container.appendChild(t),this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),e.body.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256)return-9999!==this._flat[s]?this._flat[s]:this._flat[s]=this._measure(e,0);let r=e;t&&(r+="B"),i&&(r+="I");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},456:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event,this._measureStrategy=new c(e,t,this._optionsService),this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c{constructor(e,t,i){this._document=e,this._parentElement=t,this._optionsService=i,this._result={width:0,height:0},this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`;const e={height:Number(this._measureElement.offsetHeight),width:Number(this._measureElement.offsetWidth)};return 0!==e.width&&0!==e.height&&(this._result.width=e.width/32,this._result.height=Math.ceil(e.height)),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t<this._characterJoiners.length;t++)if(this._characterJoiners[t].id===e)return this._characterJoiners.splice(t,1),!0;return!1}getJoinedCharacters(e){if(0===this._characterJoiners.length)return[];const t=this._bufferService.buffer.lines.get(e);if(!t||0===t.length)return[];const i=[],s=t.translateToString(!0);let r=0,n=0,a=0,h=t.getFg(0),c=t.getBg(0);for(let e=0;e<t.getTrimmedLength();e++)if(t.loadCell(e,this._workCell),0!==this._workCell.getWidth()){if(this._workCell.fg!==h||this._workCell.bg!==c){if(e-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}r=e,a=n,h=this._workCell.fg,c=this._workCell.bg}n+=this._workCell.getChars().length||o.WHITESPACE_CELL_CHAR.length}if(this._bufferService.cols-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}return i}_getJoinedRanges(t,i,s,r,n){const o=t.substring(i,s);let a=[];try{a=this._characterJoiners[0].handler(o)}catch(e){console.error(e)}for(let t=1;t<this._characterJoiners.length;t++)try{const i=this._characterJoiners[t].handler(o);for(let t=0;t<i.length;t++)e._mergeRanges(a,i[t])}catch(e){console.error(e)}return this._stringRangesToCellRanges(a,r,n),a}_stringRangesToCellRanges(e,t,i){let s=0,r=!1,n=0,a=e[s];if(a){for(let h=i;h<this._bufferService.cols;h++){const i=t.getWidth(h),c=t.getString(h).length||o.WHITESPACE_CELL_CHAR.length;if(0!==i){if(!r&&a[0]<=n&&(a[0]=h,r=!0),a[1]<=n){if(a[1]=h,a=e[++s],!a)break;a[0]<=n?(a[0]=h,r=!0):r=!1}n+=c}}a&&(a[1]=this._bufferService.cols)}}static _mergeRanges(e,t){let i=!1;for(let s=0;s<e.length;s++){const r=e[s];if(i){if(t[1]<=r[0])return e[s-1][1]=t[1],e;if(t[1]<=r[1])return e[s-1][1]=Math.max(t[1],r[1]),e.splice(s,1),e;e.splice(s,1),s--}else{if(t[1]<=r[0])return e.splice(s,0,t),e;if(t[1]<=r[1])return r[0]=Math.min(t[0],r[0]),e;t[0]<r[1]&&(r[0]=Math.min(t[0],r[0]),i=!0)}}return i?e[e.length-1][1]=t[1]:e.push(t),e}};t.CharacterJoinerService=l=s([r(0,h.IBufferService)],l)},5114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0,t.CoreBrowserService=class{constructor(e,t){this._textarea=e,this.window=t,this._isFocused=!1,this._cachedIsFocused=void 0,this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const n=i(3656),o=i(6193),a=i(5596),h=i(4725),c=i(8460),l=i(844),d=i(7226),_=i(2585);let u=t.RenderService=class extends l.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,h,_,u){if(super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new l.MutableDisposable),this._pausedResizeTask=new d.DebouncedIdleTask,this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new c.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new c.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new c.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new c.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new o.RenderDebouncer(_.window,((e,t)=>this._renderRows(e,t))),this.register(this._renderDebouncer),this._screenDprMonitor=new a.ScreenDprMonitor(_.window),this._screenDprMonitor.setListener((()=>this.handleDevicePixelRatioChange())),this.register(this._screenDprMonitor),this.register(h.onResize((()=>this._fullRefresh()))),this.register(h.buffers.onBufferActivate((()=>{var e;return null===(e=this._renderer.value)||void 0===e?void 0:e.clear()}))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio"],(()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(h.buffer.y,h.buffer.y,!0)))),this.register((0,n.addDisposableDomListener)(_.window,"resize",(()=>this.handleDevicePixelRatioChange()))),this.register(u.onChangeColors((()=>this._fullRefresh()))),"IntersectionObserver"in _.window){const e=new _.window.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});e.observe(t),this.register({dispose:()=>e.disconnect()})}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh()}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){var e,t;this._renderer.value&&(null===(t=(e=this._renderer.value).clearTextureAtlas)||void 0===t||t.call(e),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCharSizeChanged()}handleBlur(){var e;null===(e=this._renderer.value)||void 0===e||e.handleBlur()}handleFocus(){var e;null===(e=this._renderer.value)||void 0===e||e.handleFocus()}handleSelectionChanged(e,t,i){var s;this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,null===(s=this._renderer.value)||void 0===s||s.handleSelectionChanged(e,t,i)}handleCursorMove(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCursorMove()}clear(){var e;null===(e=this._renderer.value)||void 0===e||e.clear()}};t.RenderService=u=s([r(2,_.IOptionsService),r(3,h.ICharSizeService),r(4,_.IDecorationService),r(5,_.IBufferService),r(6,h.ICoreBrowserService),r(7,h.IThemeService)],u)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,"g");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return"";const r=e[0]<t[0]?e[0]:t[0],n=e[0]<t[0]?t[0]:e[0];for(let o=e[1];o<=t[1];o++){const e=i.translateBufferLineToString(o,!0,r,n);s.push(e)}}else{const r=e[1]===t[1]?t[0]:void 0;s.push(i.translateBufferLineToString(e[1],!0,e[0],r));for(let r=e[1]+1;r<=t[1]-1;r++){const e=i.lines.get(r),t=i.translateBufferLineToString(r,!0);(null==e?void 0:e.isWrapped)?s[s.length-1]+=t:s.push(t)}if(e[1]!==t[1]){const e=i.lines.get(t[1]),r=i.translateBufferLineToString(t[1],!0,0,t[0]);e&&e.isWrapped?s[s.length-1]+=r:s.push(r)}}return s.map((e=>e.replace(p," "))).join(d.isWindows?"\r\n":"\n")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]<i[1]||t[1]===i[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<i[0]||t[1]<i[1]&&e[1]===i[1]&&e[0]<i[0]||t[1]<i[1]&&e[1]===t[1]&&e[0]>=t[0]}_selectWordAtCursor(e,t){var i,s;const r=null===(s=null===(i=this._linkifier.currentLink)||void 0===i?void 0:i.link)||void 0===s?void 0:s.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const n=this._getMouseBufferCoords(e);return!!n&&(this._selectWordAt(n,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:1===this._activeSelectionMode&&this._selectToWordAt(this._model.selectionEnd),this._dragScrollAmount=this._getMouseEventScrollAmount(e),3!==this._activeSelectionMode&&(this._dragScrollAmount>0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]<i.lines.length){const e=i.lines.get(this._model.selectionEnd[1]);e&&0===e.hasWidth(this._model.selectionEnd[0])&&this._model.selectionEnd[0]++}t&&t[0]===this._model.selectionEnd[0]&&t[1]===this._model.selectionEnd[1]||this.refresh(!0)}_dragScroll(){if(this._model.selectionEnd&&this._model.selectionStart&&this._dragScrollAmount){this._onRequestScrollLines.fire({amount:this._dragScrollAmount,suppressScrollEvent:!1});const e=this._bufferService.buffer;this._dragScrollAmount>0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(" "===o.charAt(a)){for(;a>0&&" "===o.charAt(a-1);)a--;for(;h<o.length&&" "===o.charAt(h+1);)h++}else{let t=e[0],i=e[0];0===n.getWidth(t)&&(l++,t--),2===n.getWidth(i)&&(d++,i++);const s=n.getString(i).length;for(s>1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i<n.length&&h+1<o.length&&!this._isCharWordSeparator(n.loadCell(i+1,this._workCell));){n.loadCell(i+1,this._workCell);const e=this._workCell.getChars().length;2===this._workCell.getWidth()?(d++,i++):e>1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||""!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if((null==t?void 0:t.isWrapped)&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseService=(0,s.createDecorator)("MouseService"),t.IRenderService=(0,s.createDecorator)("RenderService"),t.ISelectionService=(0,s.createDecorator)("SelectionService"),t.ICharacterJoinerService=(0,s.createDecorator)("CharacterJoinerService"),t.IThemeService=(0,s.createDecorator)("ThemeService")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor("#ffffff"),d=o.css.toColor("#000000"),_=o.css.toColor("#ffffff"),u=o.css.toColor("#000000"),f={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor("#2e3436"),o.css.toColor("#cc0000"),o.css.toColor("#4e9a06"),o.css.toColor("#c4a000"),o.css.toColor("#3465a4"),o.css.toColor("#75507b"),o.css.toColor("#06989a"),o.css.toColor("#d3d7cf"),o.css.toColor("#555753"),o.css.toColor("#ef2929"),o.css.toColor("#8ae234"),o.css.toColor("#fce94f"),o.css.toColor("#729fcf"),o.css.toColor("#ad7fa8"),o.css.toColor("#34e2e2"),o.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r<s;r++)i.ansi[r+16]=p(e.extendedAnsi[r],t.DEFAULT_ANSI_COLORS[r+16])}this._contrastCache.clear(),this._halfContrastCache.clear(),this._updateRestoreColors(),this._onChangeColors.fire(this.colors)}restoreColor(e){this._restoreColor(e),this._onChangeColors.fire(this.colors)}_restoreColor(e){if(void 0!==e)switch(e){case 256:this._colors.foreground=this._restoreColors.foreground;break;case 257:this._colors.background=this._restoreColors.background;break;case 258:this._colors.cursor=this._restoreColors.cursor;break;default:this._colors.ansi[e]=this._restoreColors.ansi[e]}else for(let e=0;e<this._restoreColors.ansi.length;++e)this._colors.ansi[e]=this._restoreColors.ansi[e]}modifyColors(e){e(this._colors),this._onChangeColors.fire(this.colors)}_updateRestoreColors(){this._restoreColors={foreground:this._colors.foreground,background:this._colors.background,cursor:this._colors.cursor,ansi:this._colors.ansi.slice()}}};function p(e,t){if(void 0!==e)try{return o.css.toColor(e)}catch(e){}return t}t.ThemeService=v=s([r(0,c.IOptionsService)],v)},6349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;i<Math.min(e,this.length);i++)t[i]=this._array[this._getCyclicIndex(i)];this._array=t,this._maxLength=e,this._startIndex=0}get length(){return this._length}set length(e){if(e>this._length)for(let t=this._length;t<e;t++)this._array[t]=void 0;this._length=e}get(e){return this._array[this._getCyclicIndex(e)]}set(e,t){this._array[this._getCyclicIndex(e)]=t}push(e){this._array[this._getCyclicIndex(this._length)]=e,this._length===this._maxLength?(this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1)):this._length++}recycle(){if(this._length!==this._maxLength)throw new Error("Can only recycle when the buffer is full");return this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1),this._array[this._getCyclicIndex(this._length-1)]}get isFull(){return this._length===this._maxLength}pop(){return this._array[this._getCyclicIndex(this._length---1)]}splice(e,t,...i){if(t){for(let i=e;i<this._length-t;i++)this._array[this._getCyclicIndex(i)]=this._array[this._getCyclicIndex(i+t)];this._length-=t,this.onDeleteEmitter.fire({index:e,amount:t})}for(let t=this._length-1;t>=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;t<i.length;t++)this._array[this._getCyclicIndex(e+t)]=i[t];if(i.length&&this.onInsertEmitter.fire({index:e,amount:i.length}),this._length+i.length>this._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+i<0)throw new Error("Cannot shift elements in list beyond index 0");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s<t;s++)this.set(e+s+i,this.get(e+s))}}_getCyclicIndex(e){return(this._startIndex+e)%this._maxLength}}t.CircularList=n},1439:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if("object"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(6114);let r=0,n=0,o=0,a=0;var h,c,l,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function f(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${u(e)}${u(t)}${u(i)}${u(s)}`:`#${u(e)}${u(t)}${u(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,n,o]=_.toChannels(e.rgba),{css:h.toCss(r,n,o,a),rgba:h.toRgba(r,n,o,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=l+Math.round((i-l)*a),n=d+Math.round((s-d)*a),o=_+Math.round((c-_)*a),{css:h.toCss(r,n,o),rgba:h.toRgba(r,n,o)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,n,o]=_.toChannels(t),{css:h.toCss(r,n,o),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(c||(t.color=c={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,n,o);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,n,o,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),n=parseInt(s[2]),o=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,n,o,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,n,o,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,n,o,a),css:e}}}(l||(t.css=l={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c<i&&(o>0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c<i&&(o<255||a<255||h<255);)o=Math.min(255,o+Math.ceil(.1*(255-o))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,s,r){const n=d.relativeLuminance(e>>8),o=d.relativeLuminance(s>>8);if(f(n,o)<r){if(o<n){const o=t(e,s,r),a=f(n,d.relativeLuminance(o>>8));if(a<r){const t=i(e,s,r);return a>f(n,d.relativeLuminance(t>>8))?o:t}return o}const a=i(e,s,r),h=f(n,d.relativeLuminance(a>>8));if(h<r){const i=t(e,s,r);return h>f(n,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=f},8969:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{var t;null===(t=this._onScrollApi)||void 0===t||t.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn("writeSync is unreliable and will be removed soon."),m=!0),this._writeBuffer.writeSync(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!("conpty"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(6242),g=i(6351),m=i(5941),S={"(":0,")":1,"*":2,"+":3,"-":1,".":2},C=131072;function b(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(y||(t.WindowsOptionsReportType=y={}));let w=0;class E extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new k(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug("Unknown EXECUTE code: ",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug("Unknown OSC code: ",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{"HOOK"===t&&(i=i.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:"@"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:" ",final:"@"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:"A"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:" ",final:"A"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:"B"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:"C"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:"D"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:"E"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:"F"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:"G"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:"H"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:"I"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:"J"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"J"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:"K"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"K"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:"L"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:"M"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:"P"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:"S"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:"T"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:"X"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:"Z"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:"`"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:"a"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:"b"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:"c"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:">",final:"c"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:"d"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:"e"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:"f"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:"g"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:"h"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"h"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:"l"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"l"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:"m"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:"n"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:"?",final:"n"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:"!",final:"p"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:" ",final:"q"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:"r"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:"s"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:"t"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:"u"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:"'",final:"}"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:"'",final:"~"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'"',final:"q"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:"$",final:"p"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new p.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new p.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new p.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new p.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new p.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new p.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new p.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new p.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new p.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new p.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new p.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new p.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:"7"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:"8"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:"D"},(()=>this.index())),this._parser.registerEscHandler({final:"E"},(()=>this.nextLine())),this._parser.registerEscHandler({final:"H"},(()=>this.tabSet())),this._parser.registerEscHandler({final:"M"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:"="},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:">"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:"c"},(()=>this.fullReset())),this._parser.registerEscHandler({final:"n"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"o"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"|"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"}"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"~"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:"%",final:"@"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:"%",final:"G"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},(()=>this.selectCharset("("+e))),this._parser.registerEscHandler({intermediates:")",final:e},(()=>this.selectCharset(")"+e))),this._parser.registerEscHandler({intermediates:"*",final:e},(()=>this.selectCharset("*"+e))),this._parser.registerEscHandler({intermediates:"+",final:e},(()=>this.selectCharset("+"+e))),this._parser.registerEscHandler({intermediates:"-",final:e},(()=>this.selectCharset("-"+e))),this._parser.registerEscHandler({intermediates:".",final:e},(()=>this.selectCharset("."+e))),this._parser.registerEscHandler({intermediates:"/",final:e},(()=>this.selectCharset("/"+e)));this._parser.registerEscHandler({intermediates:"#",final:"8"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error("Parsing error: ",e),e))),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new g.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("#SLOW_TIMEOUT")),5e3)))]).catch((e=>{if("#SLOW_TIMEOUT"!==e)throw e;console.warn("async parser handler taking longer than 5000 ms")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>C&&(n=this._parseStack.position+C)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join("")}"`),"string"==typeof e?e.split("").map((e=>e.charCodeAt(0))):e),this._parseBuffer.length<e.length&&this._parseBuffer.length<C&&(this._parseBuffer=new Uint32Array(Math.min(e.length,C))),o||this._dirtyRowTracker.clearRange(),e.length>C)for(let t=n;t<e.length;t+=C){const n=t+C<e.length?t+C:e.length,o="string"==typeof e?this._stringDecoder.decode(e.substring(t,n),this._parseBuffer):this._utf8Decoder.decode(e.subarray(t,n),this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,o))return this._preserveStack(s,r,o,t),this._logSlowResolvingAsync(i),i}else if(!o){const t="string"==typeof e?this._stringDecoder.decode(e,this._parseBuffer):this._utf8Decoder.decode(e,this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,t))return this._preserveStack(s,r,t,0),this._logSlowResolvingAsync(i),i}this._activeBuffer.x===s&&this._activeBuffer.y===r||this._onCursorMove.fire(),this._onRequestRefreshRows.fire(this._dirtyRowTracker.start,this._dirtyRowTracker.end)}print(e,t,i){let s,r;const n=this._charsetService.charset,o=this._optionsService.rawOptions.screenReaderMode,a=this._bufferService.cols,h=this._coreService.decPrivateModes.wraparound,l=this._coreService.modes.insertMode,d=this._curAttrData;let u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._activeBuffer.x&&i-t>0&&2===u.getWidth(this._activeBuffer.x-1)&&u.setCellFromCodePoint(this._activeBuffer.x-1,0,1,d.fg,d.bg,d.extended);for(let f=t;f<i;++f){if(s=e[f],r=this._unicodeService.wcwidth(s),s<127&&n){const e=n[String.fromCharCode(s)];e&&(s=e.charCodeAt(0))}if(o&&this._onA11yChar.fire((0,c.stringFromCodePoint)(s)),this._getCurrentLinkId()&&this._oscLinkService.addLineToLink(this._getCurrentLinkId(),this._activeBuffer.ybase+this._activeBuffer.y),r||!this._activeBuffer.x){if(this._activeBuffer.x+r-1>=a)if(h){for(;this._activeBuffer.x<a;)u.setCellFromCodePoint(this._activeBuffer.x++,0,1,d.fg,d.bg,d.extended);this._activeBuffer.x=0,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)}else if(this._activeBuffer.x=a-1,2===r)continue;if(l&&(u.insertCells(this._activeBuffer.x,r,this._activeBuffer.getNullCell(d),d),2===u.getWidth(a-1)&&u.setCellFromCodePoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,d.fg,d.bg,d.extended)),u.setCellFromCodePoint(this._activeBuffer.x++,s,r,d.fg,d.bg,d.extended),r>0)for(;--r;)u.setCellFromCodePoint(this._activeBuffer.x++,0,0,d.fg,d.bg,d.extended)}else u.getWidth(this._activeBuffer.x-1)?u.addCodepointToCell(this._activeBuffer.x-1,s):u.addCodepointToCell(this._activeBuffer.x-2,s)}i-t>0&&(u.loadCell(this._activeBuffer.x-1,this._workCell),2===this._workCell.getWidth()||this._workCell.getCode()>65535?this._parser.precedingCodepoint=0:this._workCell.isCombined()?this._parser.precedingCodepoint=this._workCell.getChars().charCodeAt(0):this._parser.precedingCodepoint=this._workCell.content),this._activeBuffer.x<a&&i-t>0&&0===u.getWidth(this._activeBuffer.x)&&!u.hasContent(this._activeBuffer.x)&&u.setCellFromCodePoint(this._activeBuffer.x,0,1,d.fg,d.bg,d.extended),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return"t"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!b(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new g.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){var e;if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&(null===(e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y))||void 0===e?void 0:e.isWrapped)){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData(),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i<this._bufferService.rows;i++)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(i);break;case 1:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i,0,this._activeBuffer.x+1,!0,t),this._activeBuffer.x+1>=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y,s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,r=this._bufferService.rows-1+this._activeBuffer.ybase-s+1;for(;t--;)this._activeBuffer.lines.splice(r-1,1),this._activeBuffer.lines.splice(i,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}deleteLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y;let s;for(s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,s=this._bufferService.rows-1+this._activeBuffer.ybase-s;t--;)this._activeBuffer.lines.splice(i,1),this._activeBuffer.lines.splice(s,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}insertChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.insertCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}deleteChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.deleteCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}scrollUp(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollDown(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,0,this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollLeft(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollRight(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}insertColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}deleteColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}eraseChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.replaceCells(this._activeBuffer.x,this._activeBuffer.x+(e.params[0]||1),this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}repeatPrecedingCharacter(e){if(!this._parser.precedingCodepoint)return!0;const t=e.params[0]||1,i=new Uint32Array(t);for(let e=0;e<t;++e)i[e]=this._parser.precedingCodepoint;return this.print(i,0,i.length),!0}sendDeviceAttributesPrimary(e){return e.params[0]>0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(n.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(n.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(n.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(n.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(n.C0.ESC+"[>83;40003;0c")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+"").indexOf(e)}setMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!0;break;case 20:this._optionsService.options.convertEol=!0}return!0}setModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!0;break;case 2:this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),this._charsetService.setgCharset(1,o.DEFAULT_CHARSET),this._charsetService.setgCharset(2,o.DEFAULT_CHARSET),this._charsetService.setgCharset(3,o.DEFAULT_CHARSET);break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(132,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!0,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!0;break;case 12:this._optionsService.options.cursorBlink=!0;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!0;break;case 66:this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire();break;case 9:this._coreMouseService.activeProtocol="X10";break;case 1e3:this._coreMouseService.activeProtocol="VT200";break;case 1002:this._coreMouseService.activeProtocol="DRAG";break;case 1003:this._coreMouseService.activeProtocol="ANY";break;case 1004:this._coreService.decPrivateModes.sendFocus=!0,this._onRequestSendFocus.fire();break;case 1005:this._logService.debug("DECSET 1005 not supported (see #2507)");break;case 1006:this._coreMouseService.activeEncoding="SGR";break;case 1015:this._logService.debug("DECSET 1015 not supported (see #2507)");break;case 1016:this._coreMouseService.activeEncoding="SGR_PIXELS";break;case 25:this._coreService.isCursorHidden=!1;break;case 1048:this.saveCursor();break;case 1049:this.saveCursor();case 47:case 1047:this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!0}return!0}resetMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!1;break;case 20:this._optionsService.options.convertEol=!1}return!0}resetModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!1;break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(80,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!1,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!1;break;case 12:this._optionsService.options.cursorBlink=!1;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!1;break;case 66:this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire();break;case 9:case 1e3:case 1002:case 1003:this._coreMouseService.activeProtocol="NONE";break;case 1004:this._coreService.decPrivateModes.sendFocus=!1;break;case 1005:this._logService.debug("DECRST 1005 not supported (see #2507)");break;case 1006:case 1016:this._coreMouseService.activeEncoding="DEFAULT";break;case 1015:this._logService.debug("DECRST 1015 not supported (see #2507)");break;case 25:this._coreService.isCursorHidden=!0;break;case 1048:this.restoreCursor();break;case 1049:case 47:case 1047:this._bufferService.buffers.activateNormalBuffer(),1049===e.params[t]&&this.restoreCursor(),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!1}return!0}requestMode(e,t){const i=this._coreService.decPrivateModes,{activeProtocol:s,activeEncoding:r}=this._coreMouseService,o=this._coreService,{buffers:a,cols:h}=this._bufferService,{active:c,alt:l}=a,d=this._optionsService.rawOptions,_=e=>e?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_("X10"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_("VT200"===s):1002===u?_("DRAG"===s):1003===u?_("ANY"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_("SGR"===r):1015===u?4:1016===u?_("SGR_PIXELS"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?"":"?"}${f};${v}$y`),!0;var f,v}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o<i.length&&o+n+1+r<s.length);break}if(5===s[1]&&n+r>=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t<e.length&&n+r<s.length);for(let e=2;e<s.length;++e)-1===s[e]&&(s[e]=0);switch(s[0]){case 38:i.fg=this._updateAttrColor(i.fg,s[1],s[3],s[4],s[5]);break;case 48:i.bg=this._updateAttrColor(i.bg,s[1],s[3],s[4],s[5]);break;case 58:i.extended=i.extended.clone(),i.extended.underlineColor=this._updateAttrColor(i.extended.underlineColor,s[1],s[3],s[4],s[5])}return n}_processUnderline(e,t){t.extended=t.extended.clone(),(!~e||e>5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r<t;r++)i=e.params[r],i>=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!b(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(";");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e);if(L(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(";");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(":");let s;const r=i.findIndex((e=>e.startsWith("id=")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(";");for(let e=0;e<i.length&&!(t>=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e<i.length;++e)if(/^\d+$/.exec(i[e])){const s=parseInt(i[e]);L(s)&&t.push({type:2,index:s})}return t.length&&this._onColor.fire(t),!0}restoreFgColor(e){return this._onColor.fire([{type:2,index:256}]),!0}restoreBgColor(e){return this._onColor.fire([{type:2,index:257}]),!0}restoreCursorColor(e){return this._onColor.fire([{type:2,index:258}]),!0}nextLine(){return this._activeBuffer.x=0,this.index(),!0}keypadApplicationMode(){return this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire(),!0}keypadNumericMode(){return this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire(),!0}selectDefaultCharset(){return this._charsetService.setgLevel(0),this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),!0}selectCharset(e){return 2!==e.length?(this.selectDefaultCharset(),!0):("/"===e[0]||this._charsetService.setgCharset(S[e[0]],o.CHARSETS[e[1]]||o.DEFAULT_CHARSET),!0)}index(){return this._restrictCursor(),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|"E".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t<this._bufferService.rows;++t){const i=this._activeBuffer.ybase+this._activeBuffer.y+t,s=this._activeBuffer.lines.get(i);s&&(s.fill(e),s.isWrapped=!1)}return this._dirtyRowTracker.markAllDirty(),this._setCursor(0,0),!0}requestStatusString(e,t){const i=this._bufferService.buffer,s=this._optionsService.rawOptions;return(e=>(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\`),!0))('"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}"q`:'"p'===e?'P1$r61;1"p':"r"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:"m"===e?"P1$r0m":" q"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=E;let k=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){e<this.start?this.start=e:e>this.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(w=e,e=t,t=w),e<this.start&&(this.start=e),t>this.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}k=s([r(0,v.IBufferService)],k)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i<this._array.length&&this._getKey(this._array[i])===t);return!1}*getKeyIterator(e){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i<this._array.length&&this._getKey(this._array[i])===e)}forEachByKey(e,t){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i<this._array.length&&this._getKey(this._array[i])===e)}values(){return[...this._array].values()}_search(e){let t=0,i=this._array.length-1;for(;i>=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r<e)){for(;s>0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=null==t?void 0:t.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&e<this._rows}_getCorrectBufferLength(e){if(!this._hasScrollback)return e;const i=e+this._optionsService.rawOptions.scrollback;return i>t.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols<e)for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);let n=0;if(this._rows<t)for(let s=this._rows;s<t;s++)this.lines.length<t+this.ybase&&(this._optionsService.rawOptions.windowsMode||void 0!==this._optionsService.rawOptions.windowsPty.backend||void 0!==this._optionsService.rawOptions.windowsPty.buildNumber?this.lines.push(new o.BufferLine(e,i)):this.ybase>0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r<this.lines.maxLength){const e=this.lines.length-r;e>0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);this._cols=e,this._rows=t,this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition<this.lines.length;)if(t+=this.lines.get(this._memoryCleanupPosition++).cleanupMemory(),t>100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&"conpty"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length<t&&this.lines.push(new o.BufferLine(e,s))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-i,0)}_reflowSmaller(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA),s=[];let r=0;for(let n=this.lines.length-1;n>=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l<n+c.length)continue;const d=c[c.length-1].getTrimmedLength(),_=(0,a.reflowSmallerGetNewLineLengths)(c,this._cols,e),u=_.length-c.length;let f;f=0===this.ybase&&this.y!==this.lines.length-1?Math.max(0,this.y-this.lines.maxLength+u):Math.max(0,this.lines.length-this.lines.maxLength+u);const v=[];for(let e=0;e<u;e++){const e=this.getBlankLine(o.DEFAULT_ATTR_DATA,!0);v.push(e)}v.length>0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t<c.length;t++)_[t]<e&&c[t].setCell(_[t],i);let C=u-f;for(;C-- >0;)0===this.ybase?this.y<t-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase<Math.min(this.lines.maxLength,this.lines.length+r)-t&&(this.ybase===this.ydisp&&this.ydisp++,this.ybase++);this.savedY=Math.min(this.savedY+u,this.ybase+t-1)}if(s.length>0){const e=[],t=[];for(let e=0;e<this.lines.length;e++)t.push(this.lines.get(e));const i=this.lines.length;let n=i-1,o=0,a=s[o];this.lines.length=Math.min(this.lines.maxLength,this.lines.length+r);let h=0;for(let c=Math.min(this.lines.maxLength-1,i+r-1);c>=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):""}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+1<this.lines.length&&this.lines.get(i+1).isWrapped;)i++;return{first:t,last:i}}setupTabStops(e){for(null!=e?this.tabs[e]||(e=this.prevStop(e)):(this.tabs={},e=0);e<this._cols;e+=this._optionsService.rawOptions.tabStopWidth)this.tabs[e]=!0}prevStop(e){for(null==e&&(e=this.x);!this.tabs[--e]&&e>0;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e<this._cols;);return e>=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t<this.markers.length;t++)this.markers[t].line===e&&(this.markers[t].dispose(),this.markers.splice(t--,1));this._isClearing=!1}clearAllMarkers(){this._isClearing=!0;for(let e=0;e<this.markers.length;e++)this.markers[e].dispose(),this.markers.splice(e--,1);this._isClearing=!1}addMarker(e){const t=new l.Marker(e);return this.markers.push(t),t.register(this.lines.onTrim((e=>{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.line<e.index+e.amount&&t.dispose(),t.line>e.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t<e;++t)this.setCell(t,s);this.length=e}get(e){const t=this._data[3*e+0],i=2097151&t;return[this._data[3*e+1],2097152&t?this._combined[e]:i?(0,o.stringFromCodePoint)(i):"",t>>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodePoint(e,t,i,s,r,n){268435456&r&&(this._extendedAttrs[e]=n),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s,this._data[3*e+2]=r}addCodepointToCell(e,t){let i=this._data[3*e+0];2097152&i?this._combined[e]+=(0,o.stringFromCodePoint)(t):(2097151&i?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&i)+(0,o.stringFromCodePoint)(t),i&=-2097152,i|=2097152):i=t|1<<22,this._data[3*e+0]=i)}insertCells(e,t,i,n){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs),t<this.length-e){const s=new r.CellData;for(let i=this.length-e-t-1;i>=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;s<t;++s)this.setCell(e+s,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);2===this.getWidth(this.length-1)&&this.setCellFromCodePoint(this.length-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs)}deleteCells(e,t,i,n){if(e%=this.length,t<this.length-e){const s=new r.CellData;for(let i=0;i<this.length-e-t;++i)this.setCell(e+i,this.loadCell(e+t+i,s));for(let e=this.length-t;e<this.length;++e)this.setCell(e,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs),0!==this.getWidth(e)||this.hasContent(e)||this.setCellFromCodePoint(e,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs)}replaceCells(e,t,i,r,n=!1){if(n)for(e&&2===this.getWidth(e-1)&&!this.isProtected(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs),t<this.length&&2===this.getWidth(t-1)&&!this.isProtected(t)&&this.setCellFromCodePoint(t,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs);e<t&&e<this.length;)this.isProtected(e)||this.setCell(e,i),e++;else for(e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs),t<this.length&&2===this.getWidth(t-1)&&this.setCellFromCodePoint(t,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs);e<t&&e<this.length;)this.setCell(e++,i)}resize(e,t){if(e===this.length)return 4*this._data.length*2<this._data.buffer.byteLength;const i=3*e;if(e>this.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i<e;++i)this.setCell(i,t)}else{this._data=this._data.subarray(0,i);const t=Object.keys(this._combined);for(let i=0;i<t.length;i++){const s=parseInt(t[i],10);s>=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t<s.length;t++){const i=parseInt(s[t],10);i>=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2<this._data.buffer.byteLength}cleanupMemory(){if(4*this._data.length*2<this._data.buffer.byteLength){const e=new Uint32Array(this._data.length);return e.set(this._data),this._data=e,1}return 0}fill(e,t=!1){if(t)for(let t=0;t<this.length;++t)this.isProtected(t)||this.setCell(t,e);else{this._combined={},this._extendedAttrs={};for(let t=0;t<this.length;++t)this.setCell(t,e)}}copyFrom(e){this.length!==e.length?this._data=new Uint32Array(e._data):this._data.set(e._data),this.length=e.length,this._combined={};for(const t in e._combined)this._combined[t]=e._combined[t];this._extendedAttrs={};for(const t in e._extendedAttrs)this._extendedAttrs[t]=e._extendedAttrs[t];this.isWrapped=e.isWrapped}clone(){const e=new h(0);e._data=new Uint32Array(this._data),e.length=this.length;for(const t in this._combined)e._combined[t]=this._combined[t];for(const t in this._extendedAttrs)e._extendedAttrs[t]=this._extendedAttrs[t];return e.isWrapped=this.isWrapped,e}getTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r<s;r++){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}const o=Object.keys(e._combined);for(let s=0;s<o.length;s++){const r=parseInt(o[s],10);r>=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e=!1,t=0,i=this.length){e&&(i=Math.min(i,this.getTrimmedLength()));let s="";for(;t<i;){const e=this._data[3*t+0],i=2097151&e;s+=2097152&e?this._combined[t]:i?(0,o.stringFromCodePoint)(i):n.WHITESPACE_CELL_CHAR,t+=e>>22||1}return s}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,"__esModule",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a<e.length-1;a++){let h=a,c=e.get(++h);if(!c.isWrapped)continue;const l=[e.get(a)];for(;h<e.length&&c.isWrapped;)l.push(c),c=e.get(++h);if(r>=a&&r<h){a+=l.length-1;continue}let d=0,_=i(l,d,t),u=1,f=0;for(;u<l.length;){const e=i(l,u,t),r=e-f,o=s-_,a=Math.min(r,o);l[d].copyCellsFrom(l[u],f,_,a,!1),_+=a,_===s&&(d++,_=0),f+=a,f===e&&(u++,f=0),0===_&&0!==d&&2===l[d-1].getWidth(s-1)&&(l[d].copyCellsFrom(l[d-1],s-1,_++,1,!1),l[d-1].setCell(s-1,n))}l[d].replaceCells(_,s,n);let v=0;for(let e=l.length-1;e>0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;o<e.length;o++)if(r===o){const i=t[++s];e.onDeleteEmitter.fire({index:o-n,amount:i}),o+=i-1,n+=i,r=t[++s]}else i.push(o);return{layout:i,countRemoved:n}},t.reflowLargerApplyNewLayout=function(e,t){const i=[];for(let s=0;s<t.length;s++)i.push(e.get(t[s]));for(let t=0;t<i.length;t++)e.set(t,i[t]);e.length=t.length},t.reflowSmallerGetNewLineLengths=function(e,t,s){const r=[],n=e.map(((s,r)=>i(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;h<n;){if(n-h<s){r.push(n-h);break}o+=s;const c=i(e,a,t);o>c&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"␤",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},t.CHARSETS.A={"#":"£"},t.CHARSETS.B=void 0,t.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},t.CHARSETS.C=t.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},t.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},t.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},t.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},t.CHARSETS.E=t.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},t.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},t.CHARSETS.H=t.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,"__esModule",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL="\0",e.SOH="\ 1",e.STX="\ 2",e.ETX="\ 3",e.EOT="\ 4",e.ENQ="\ 5",e.ACK="\ 6",e.BEL="\a",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="\ e",e.SI="\ f",e.DLE="\10",e.DC1="\11",e.DC2="\12",e.DC3="\13",e.DC4="\14",e.NAK="\15",e.SYN="\16",e.ETB="\17",e.CAN="\18",e.EM="\19",e.SUB="\1a",e.ESC="\e",e.FS="\1c",e.GS="\1d",e.RS="\1e",e.US="\1f",e.SP=" ",e.DEL="\7f"}(i||(t.C0=i={})),function(e){e.PAD="\80",e.HOP="\81",e.BPH="\82",e.NBH="\83",e.IND="\84",e.NEL="\85",e.SSA="\86",e.ESA="\87",e.HTS="\88",e.HTJ="\89",e.VTS="\8a",e.PLD="\8b",e.PLU="\8c",e.RI="\8d",e.SS2="\8e",e.SS3="\8f",e.DCS="\90",e.PU1="\91",e.PU2="\92",e.STS="\93",e.CCH="\94",e.MW="\95",e.SPA="\96",e.EPA="\97",e.SOS="\98",e.SGCI="\99",e.SCI="\9a",e.CSI="\9b",e.ST="\9c",e.OSC="\9d",e.PM="\9e",e.APC="\9f"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:"UIKeyInputUpArrow"===e.key?o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A":"UIKeyInputLeftArrow"===e.key?o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D":"UIKeyInputRightArrow"===e.key?o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C":"UIKeyInputDownArrow"===e.key&&(o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B");break;case 8:if(e.altKey){o.key=s.C0.ESC+s.C0.DEL;break}o.key=s.C0.DEL;break;case 9:if(e.shiftKey){o.key=s.C0.ESC+"[Z";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"D",o.key===s.C0.ESC+"[1;3D"&&(o.key=s.C0.ESC+(i?"b":"[1;5D"))):o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"C",o.key===s.C0.ESC+"[1;3C"&&(o.key=s.C0.ESC+(i?"f":"[1;5C"))):o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"A",i||o.key!==s.C0.ESC+"[1;3A"||(o.key=s.C0.ESC+"[1;5A")):o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"B",i||o.key!==s.C0.ESC+"[1;3B"||(o.key=s.C0.ESC+"[1;5B")):o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+"[2~");break;case 46:o.key=a?s.C0.ESC+"[3;"+(a+1)+"~":s.C0.ESC+"[3~";break;case 36:o.key=a?s.C0.ESC+"[1;"+(a+1)+"H":t?s.C0.ESC+"OH":s.C0.ESC+"[H";break;case 35:o.key=a?s.C0.ESC+"[1;"+(a+1)+"F":t?s.C0.ESC+"OF":s.C0.ESC+"[F";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+"[5;"+(a+1)+"~":o.key=s.C0.ESC+"[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+"[6;"+(a+1)+"~":o.key=s.C0.ESC+"[6~";break;case 112:o.key=a?s.C0.ESC+"[1;"+(a+1)+"P":s.C0.ESC+"OP";break;case 113:o.key=a?s.C0.ESC+"[1;"+(a+1)+"Q":s.C0.ESC+"OQ";break;case 114:o.key=a?s.C0.ESC+"[1;"+(a+1)+"R":s.C0.ESC+"OR";break;case 115:o.key=a?s.C0.ESC+"[1;"+(a+1)+"S":s.C0.ESC+"OS";break;case 116:o.key=a?s.C0.ESC+"[15;"+(a+1)+"~":s.C0.ESC+"[15~";break;case 117:o.key=a?s.C0.ESC+"[17;"+(a+1)+"~":s.C0.ESC+"[17~";break;case 118:o.key=a?s.C0.ESC+"[18;"+(a+1)+"~":s.C0.ESC+"[18~";break;case 119:o.key=a?s.C0.ESC+"[19;"+(a+1)+"~":s.C0.ESC+"[19~";break;case 120:o.key=a?s.C0.ESC+"[20;"+(a+1)+"~":s.C0.ESC+"[20~";break;case 121:o.key=a?s.C0.ESC+"[21;"+(a+1)+"~":s.C0.ESC+"[21~";break;case 122:o.key=a?s.C0.ESC+"[23;"+(a+1)+"~":s.C0.ESC+"[23~";break;case 123:o.key=a?s.C0.ESC+"[24;"+(a+1)+"~":s.C0.ESC+"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&("_"===e.key&&(o.key=s.C0.US),"@"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=null==t?void 0:t[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n<i;++n){const r=e.charCodeAt(n);if(55296<=r&&r<=56319){if(++n>=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c<l;){if(c>=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d<i;){for(;!(!(d<l)||128&(s=e[d])||128&(r=e[d+1])||128&(n=e[d+2])||128&(o=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=n,t[a++]=o,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const i=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],s=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let r;t.UnicodeV6=class{constructor(){if(this.version="6",!r){r=new Uint8Array(65536),r.fill(1),r[0]=0,r.fill(0,1,32),r.fill(0,127,160),r.fill(2,4352,4448),r[9001]=2,r[9002]=2,r.fill(2,11904,42192),r[12351]=1,r.fill(2,44032,55204),r.fill(2,63744,64256),r.fill(2,65040,65050),r.fill(2,65072,65136),r.fill(2,65280,65377),r.fill(2,65504,65511);for(let e=0;e<i.length;++e)r.fill(0,i[e][0],i[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?r[e]:function(e,t){let i,s=0,r=t.length-1;if(e<t[0][0]||e>t[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e<t[i][0]))return!0;r=i-1}return!1}(e,s)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}}},5981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,s=/^[\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?"0"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf("rgb:")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf("#")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,"HOOK",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,"PUT",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,"UNHOOK",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data="",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data="",this._hitLimit=!1,e)));return this._params=a,this._data="",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;r<e.length;r++)this.table[t<<8|e[r]]=i<<4|s}}t.TransitionTable=a;const h=160;t.VT500_TRANSITION_TABLE=function(){const e=new a(4095),t=Array.apply(null,Array(256)).map(((e,t)=>t)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(e.intermediates){if(e.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let t=0;t<e.intermediates.length;++t){const s=e.intermediates.charCodeAt(t);if(32>s||s>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");i<<=8,i|=s}}if(1!==e.final.length)throw new Error("final must be a single byte");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingCodepoint=0,this.currentState=15&this._parseStack.transition}for(let i=o;i<t;++i){switch(r=e[i],n=this._transitions.table[this.currentState<<8|(r<160?r:h)],n>>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}}break;case 3:this._executeHandlers[r]?this._executeHandlers[r]():this._executeHandlerFb(r),this.precedingCodepoint=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:r,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const o=this._csiHandlers[this._collect<<8|r];let a=o?o.length-1:-1;for(;a>=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingCodepoint=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i<t&&(r=e[i])>47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingCodepoint=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r<h){this._dcsParser.put(e,i,s),i=s-1;break}break;case 14:if(s=this._dcsParser.unhook(24!==r&&26!==r),s)return this._preserveStack(6,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0;break;case 4:this._oscParser.start();break;case 5:for(let s=i+1;;s++)if(s>=t||(r=e[s])<32||r>127&&r<h){this._oscParser.put(e,i,s),i=s-1;break}break;case 6:if(s=this._oscParser.end(24!==r&&26!==r),s)return this._preserveStack(5,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0}this.currentState=15&n}}}t.EscapeSequenceParser=c},6242:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,"START")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,"PUT",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t<i;){const i=e[t++];if(59===i){this._state=2,this._start();break}if(i<48||57<i)return void(this._state=3);-1===this._id&&(this._id=0),this._id=10*this._id+i-48}2===this._state&&i-t>0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,"END",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data="",this._hitLimit=!1,e)));return this._data="",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i<e.length;++i){const s=e[i];if(Array.isArray(s))for(let e=0;e<s.length;++e)t.addSubParam(s[e]);else t.addParam(s)}return t}constructor(e=32,t=32){if(this.maxLength=e,this.maxSubParamsLength=t,t>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t<this.length;++t){e.push(this.params[t]);const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t<this.length;++t){const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i<this._addons.length;i++)if(this._addons[i]===e){t=i;break}if(-1===t)throw new Error("Could not dispose an addon that has not been loaded");e.isDisposed=!0,e.dispose.apply(e.instance),this._addons.splice(t,1)}}},8771:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new s.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`\e[M${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`\e[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`\e[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol "${e}"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding "${e}"`);this._activeEncoding=e}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,"SGR_PIXELS"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&("DEFAULT"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>null==e?void 0:e.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){var s,r,n;let o=0,a=0;for(const h of this._decorations.getKeyIterator(t))o=null!==(s=h.options.x)&&void 0!==s?s:0,a=o+(null!==(r=h.options.width)&&void 0!==r?r:1),e>=o&&e<a&&(!i||(null!==(n=h.options.layer)&&void 0!==n?n:"bottom")===i)&&(yield h)}forEachDecorationAtCell(e,t,i,s){this._decorations.forEachByKey(t,(t=>{var r,n,o;a=null!==(r=t.options.x)&&void 0!==r?r:0,h=a+(null!==(n=t.options.width)&&void 0!==n?n:1),e>=a&&e<h&&(!i||(null!==(o=t.options.layer)&&void 0!==o?o:"bottom")===i)&&s(t)}))}}t.DecorationService=c;class l extends n.Disposable{get isDisposed(){return this._isDisposed}get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=s.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=s.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.register(new r.EventEmitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.register(new r.EventEmitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},4348:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.TRACE&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.trace.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}debug(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.DEBUG&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.debug.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}info(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.INFO&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.info.bind(this._optionsService.options.logger))&&void 0!==s?s:console.info,e,t)}warn(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.WARN&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.warn.bind(this._optionsService.options.logger))&&void 0!==s?s:console.warn,e,t)}error(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.ERROR&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.error.bind(this._optionsService.options.logger))&&void 0!==s?s:console.error,e,t)}};t.LogService=c=s([r(0,o.IOptionsService)],c),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==o.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const o=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i=Object.assign({},t.DEFAULT_OPTIONS);for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options=Object.assign({},i),this._setupOptions()}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return"block"===e||"underline"===e||"bar"===e}(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=t.DEFAULT_OPTIONS[e]);break;case"fontWeight":case"fontWeightBold":if("number"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"cursorWidth":i=Math.floor(i);case"lineHeight":case"tabStopWidth":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case"minimumContrastRatio":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case"scrollback":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case"rows":case"cols":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=null!=i?i:{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){var t;return null===(t=this._dataByLinkId.get(e))||void 0===t?void 0:t.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")},1480:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);t.UnicodeService=class{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0;const i=e.length;for(let s=0;s<i;++s){let r=e.charCodeAt(s);if(55296<=r&&r<=56319){if(++s>=i)return t+this.wcwidth(r);const n=e.charCodeAt(s);56320<=n&&n<=57343?r=1024*(r-55296)+n-56320+65536:t+=this.wcwidth(n)}t+=this.wcwidth(r)}return t}}}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=["cols","rows"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions=Object.assign({},this._core.options);const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option "${e}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.coreMouseService.activeProtocol){case"X10":t="x10";break;case"VT200":t="vt200";break;case"DRAG":t="drag";break;case"ANY":t="any"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){var t,i,s;return this._checkProposedApi(),this._verifyPositiveIntegers(null!==(t=e.x)&&void 0!==t?t:0,null!==(i=e.width)&&void 0!==i?i:0,null!==(s=e.height)&&void 0!==s?s:0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write("\r\n",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error("This API only accepts positive integers")}}e.Terminal=d})(),s})()));
-//# sourceMappingURL=xterm.js.map
\ No newline at end of file
diff --git a/src/www/xterm.js.map b/src/www/xterm.js.map
deleted file mode 100644 (file)
index d3bb063..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"xterm.js","mappings":"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,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAA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","sources":["webpack://xterm/webpack/universalModuleDefinition","webpack://xterm/./src/browser/AccessibilityManager.ts","webpack://xterm/./src/browser/Clipboard.ts","webpack://xterm/./src/browser/ColorContrastCache.ts","webpack://xterm/./src/browser/Lifecycle.ts","webpack://xterm/./src/browser/Linkifier2.ts","webpack://xterm/./src/browser/LocalizableStrings.ts","webpack://xterm/./src/browser/OscLinkProvider.ts","webpack://xterm/./src/browser/RenderDebouncer.ts","webpack://xterm/./src/browser/ScreenDprMonitor.ts","webpack://xterm/./src/browser/Terminal.ts","webpack://xterm/./src/browser/TimeBasedDebouncer.ts","webpack://xterm/./src/browser/Viewport.ts","webpack://xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://xterm/./src/browser/input/CompositionHelper.ts","webpack://xterm/./src/browser/input/Mouse.ts","webpack://xterm/./src/browser/input/MoveToCell.ts","webpack://xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://xterm/./src/browser/renderer/shared/Constants.ts","webpack://xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://xterm/./src/browser/selection/SelectionModel.ts","webpack://xterm/./src/browser/services/CharSizeService.ts","webpack://xterm/./src/browser/services/CharacterJoinerService.ts","webpack://xterm/./src/browser/services/CoreBrowserService.ts","webpack://xterm/./src/browser/services/MouseService.ts","webpack://xterm/./src/browser/services/RenderService.ts","webpack://xterm/./src/browser/services/SelectionService.ts","webpack://xterm/./src/browser/services/Services.ts","webpack://xterm/./src/browser/services/ThemeService.ts","webpack://xterm/./src/common/CircularList.ts","webpack://xterm/./src/common/Clone.ts","webpack://xterm/./src/common/Color.ts","webpack://xterm/./src/common/CoreTerminal.ts","webpack://xterm/./src/common/EventEmitter.ts","webpack://xterm/./src/common/InputHandler.ts","webpack://xterm/./src/common/Lifecycle.ts","webpack://xterm/./src/common/MultiKeyMap.ts","webpack://xterm/./src/common/Platform.ts","webpack://xterm/./src/common/SortedList.ts","webpack://xterm/./src/common/TaskQueue.ts","webpack://xterm/./src/common/WindowsMode.ts","webpack://xterm/./src/common/buffer/AttributeData.ts","webpack://xterm/./src/common/buffer/Buffer.ts","webpack://xterm/./src/common/buffer/BufferLine.ts","webpack://xterm/./src/common/buffer/BufferRange.ts","webpack://xterm/./src/common/buffer/BufferReflow.ts","webpack://xterm/./src/common/buffer/BufferSet.ts","webpack://xterm/./src/common/buffer/CellData.ts","webpack://xterm/./src/common/buffer/Constants.ts","webpack://xterm/./src/common/buffer/Marker.ts","webpack://xterm/./src/common/data/Charsets.ts","webpack://xterm/./src/common/data/EscapeSequences.ts","webpack://xterm/./src/common/input/Keyboard.ts","webpack://xterm/./src/common/input/TextDecoder.ts","webpack://xterm/./src/common/input/UnicodeV6.ts","webpack://xterm/./src/common/input/WriteBuffer.ts","webpack://xterm/./src/common/input/XParseColor.ts","webpack://xterm/./src/common/parser/Constants.ts","webpack://xterm/./src/common/parser/DcsParser.ts","webpack://xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://xterm/./src/common/parser/OscParser.ts","webpack://xterm/./src/common/parser/Params.ts","webpack://xterm/./src/common/public/AddonManager.ts","webpack://xterm/./src/common/public/BufferApiView.ts","webpack://xterm/./src/common/public/BufferLineApiView.ts","webpack://xterm/./src/common/public/BufferNamespaceApi.ts","webpack://xterm/./src/common/public/ParserApi.ts","webpack://xterm/./src/common/public/UnicodeApi.ts","webpack://xterm/./src/common/services/BufferService.ts","webpack://xterm/./src/common/services/CharsetService.ts","webpack://xterm/./src/common/services/CoreMouseService.ts","webpack://xterm/./src/common/services/CoreService.ts","webpack://xterm/./src/common/services/DecorationService.ts","webpack://xterm/./src/common/services/InstantiationService.ts","webpack://xterm/./src/common/services/LogService.ts","webpack://xterm/./src/common/services/OptionsService.ts","webpack://xterm/./src/common/services/OscLinkService.ts","webpack://xterm/./src/common/services/ServiceRegistry.ts","webpack://xterm/./src/common/services/Services.ts","webpack://xterm/./src/common/services/UnicodeService.ts","webpack://xterm/webpack/bootstrap","webpack://xterm/./src/browser/public/Terminal.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from 'browser/Types';\nimport { isMac } from 'common/Platform';\nimport { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IBuffer } from 'common/buffer/Types';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n  TOP,\n  BOTTOM\n}\n\nexport class AccessibilityManager extends Disposable {\n  private _accessibilityContainer: HTMLElement;\n\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[];\n\n  private _liveRegion: HTMLElement;\n  private _liveRegionLineCount: number = 0;\n  private _liveRegionDebouncer: IRenderDebouncer;\n\n  private _screenDprMonitor: ScreenDprMonitor;\n\n  private _topBoundaryFocusListener: (e: FocusEvent) => void;\n  private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n  /**\n   * This queue has a character pushed to it for keys that are pressed, if the\n   * next character added to the terminal is equal to the key char then it is\n   * not announced (added to live region) because it has already been announced\n   * by the textarea event (which cannot be canceled). There are some race\n   * condition cases if there is typing while data is streaming, but this covers\n   * the main case of typing into the prompt and inputting the answer to a\n   * question (Y/N, etc.).\n   */\n  private _charsToConsume: string[] = [];\n\n  private _charsToAnnounce: string = '';\n\n  constructor(\n    private readonly _terminal: ITerminal,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n    this._accessibilityContainer = document.createElement('div');\n    this._accessibilityContainer.classList.add('xterm-accessibility');\n\n    this._rowContainer = document.createElement('div');\n    this._rowContainer.setAttribute('role', 'list');\n    this._rowContainer.classList.add('xterm-accessibility-tree');\n    this._rowElements = [];\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n\n    this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n    this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._refreshRowsDimensions();\n    this._accessibilityContainer.appendChild(this._rowContainer);\n\n    this._liveRegion = document.createElement('div');\n    this._liveRegion.classList.add('live-region');\n    this._liveRegion.setAttribute('aria-live', 'assertive');\n    this._accessibilityContainer.appendChild(this._liveRegion);\n    this._liveRegionDebouncer = this.register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n    if (!this._terminal.element) {\n      throw new Error('Cannot enable accessibility before Terminal.open');\n    }\n    this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n\n    this.register(this._terminal.onResize(e => this._handleResize(e.rows)));\n    this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n    this.register(this._terminal.onScroll(() => this._refreshRows()));\n    // Line feed is an issue as the prompt won't be read out after a command is run\n    this.register(this._terminal.onA11yChar(char => this._handleChar(char)));\n    this.register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n    this.register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n    this.register(this._terminal.onKey(e => this._handleKey(e.key)));\n    this.register(this._terminal.onBlur(() => this._clearLiveRegion()));\n    this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n\n    this._screenDprMonitor = new ScreenDprMonitor(window);\n    this.register(this._screenDprMonitor);\n    this._screenDprMonitor.setListener(() => this._refreshRowsDimensions());\n    // This shouldn't be needed on modern browsers but is present in case the\n    // media query that drives the ScreenDprMonitor isn't supported\n    this.register(addDisposableDomListener(window, 'resize', () => this._refreshRowsDimensions()));\n\n    this._refreshRows();\n    this.register(toDisposable(() => {\n      this._accessibilityContainer.remove();\n      this._rowElements.length = 0;\n    }));\n  }\n\n  private _handleTab(spaceCount: number): void {\n    for (let i = 0; i < spaceCount; i++) {\n      this._handleChar(' ');\n    }\n  }\n\n  private _handleChar(char: string): void {\n    if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n      if (this._charsToConsume.length > 0) {\n        // Have the screen reader ignore the char if it was just input\n        const shiftedChar = this._charsToConsume.shift();\n        if (shiftedChar !== char) {\n          this._charsToAnnounce += char;\n        }\n      } else {\n        this._charsToAnnounce += char;\n      }\n\n      if (char === '\\n') {\n        this._liveRegionLineCount++;\n        if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n          this._liveRegion.textContent += Strings.tooMuchOutput;\n        }\n      }\n\n      // Only detach/attach on mac as otherwise messages can go unaccounced\n      if (isMac) {\n        if (this._liveRegion.textContent && this._liveRegion.textContent.length > 0 && !this._liveRegion.parentNode) {\n          setTimeout(() => {\n            this._accessibilityContainer.appendChild(this._liveRegion);\n          }, 0);\n        }\n      }\n    }\n  }\n\n  private _clearLiveRegion(): void {\n    this._liveRegion.textContent = '';\n    this._liveRegionLineCount = 0;\n\n    // Only detach/attach on mac as otherwise messages can go unaccounced\n    if (isMac) {\n      this._liveRegion.remove();\n    }\n  }\n\n  private _handleKey(keyChar: string): void {\n    this._clearLiveRegion();\n    // Only add the char if there is no control character.\n    if (!/\\p{Control}/u.test(keyChar)) {\n      this._charsToConsume.push(keyChar);\n    }\n  }\n\n  private _refreshRows(start?: number, end?: number): void {\n    this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n  }\n\n  private _renderRows(start: number, end: number): void {\n    const buffer: IBuffer = this._terminal.buffer;\n    const setSize = buffer.lines.length.toString();\n    for (let i = start; i <= end; i++) {\n      const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true);\n      const posInSet = (buffer.ydisp + i + 1).toString();\n      const element = this._rowElements[i];\n      if (element) {\n        if (lineData.length === 0) {\n          element.innerText = '\\u00a0';\n        } else {\n          element.textContent = lineData;\n        }\n        element.setAttribute('aria-posinset', posInSet);\n        element.setAttribute('aria-setsize', setSize);\n      }\n    }\n    this._announceCharacters();\n  }\n\n  private _announceCharacters(): void {\n    if (this._charsToAnnounce.length === 0) {\n      return;\n    }\n    this._liveRegion.textContent += this._charsToAnnounce;\n    this._charsToAnnounce = '';\n  }\n\n  private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n    const boundaryElement = e.target as HTMLElement;\n    const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n    // Don't scroll if the buffer top has reached the end in that direction\n    const posInSet = boundaryElement.getAttribute('aria-posinset');\n    const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n    if (posInSet === lastRowPos) {\n      return;\n    }\n\n    // Don't scroll when the last focused item was not the second row (focus is going the other\n    // direction)\n    if (e.relatedTarget !== beforeBoundaryElement) {\n      return;\n    }\n\n    // Remove old boundary element from array\n    let topBoundaryElement: HTMLElement;\n    let bottomBoundaryElement: HTMLElement;\n    if (position === BoundaryPosition.TOP) {\n      topBoundaryElement = boundaryElement;\n      bottomBoundaryElement = this._rowElements.pop()!;\n      this._rowContainer.removeChild(bottomBoundaryElement);\n    } else {\n      topBoundaryElement = this._rowElements.shift()!;\n      bottomBoundaryElement = boundaryElement;\n      this._rowContainer.removeChild(topBoundaryElement);\n    }\n\n    // Remove listeners from old boundary elements\n    topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n    bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Add new element to array/DOM\n    if (position === BoundaryPosition.TOP) {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.unshift(newElement);\n      this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n    } else {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.push(newElement);\n      this._rowContainer.appendChild(newElement);\n    }\n\n    // Add listeners to new boundary elements\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Scroll up\n    this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n    // Focus new boundary before element\n    this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n    // Prevent the standard behavior\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  }\n\n  private _handleResize(rows: number): void {\n    // Remove bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Grow rows as required\n    for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n    // Shrink rows as required\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n    }\n\n    // Add bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._refreshRowsDimensions();\n  }\n\n  private _createAccessibilityTreeNode(): HTMLElement {\n    const element = document.createElement('div');\n    element.setAttribute('role', 'listitem');\n    element.tabIndex = -1;\n    this._refreshRowDimensions(element);\n    return element;\n  }\n  private _refreshRowsDimensions(): void {\n    if (!this._renderService.dimensions.css.cell.height) {\n      return;\n    }\n    this._accessibilityContainer.style.width = `${this._renderService.dimensions.css.canvas.width}px`;\n    if (this._rowElements.length !== this._terminal.rows) {\n      this._handleResize(this._terminal.rows);\n    }\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._refreshRowDimensions(this._rowElements[i]);\n    }\n  }\n  private _refreshRowDimensions(element: HTMLElement): void {\n    element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService, IOptionsService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n  return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n  if (bracketedPasteMode) {\n    return '\\x1b[200~' + text + '\\x1b[201~';\n  }\n  return text;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n  if (ev.clipboardData) {\n    ev.clipboardData.setData('text/plain', selectionService.selectionText);\n  }\n  // Prevent or the original text will be copied.\n  ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  ev.stopPropagation();\n  if (ev.clipboardData) {\n    const text = ev.clipboardData.getData('text/plain');\n    paste(text, textarea, coreService, optionsService);\n  }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  text = prepareTextForTerminal(text);\n  text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n  coreService.triggerDataEvent(text, true);\n  textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n  // Calculate textarea position relative to the screen element\n  const pos = screenElement.getBoundingClientRect();\n  const left = ev.clientX - pos.left - 10;\n  const top = ev.clientY - pos.top - 10;\n\n  // Bring textarea at the cursor position\n  textarea.style.width = '20px';\n  textarea.style.height = '20px';\n  textarea.style.left = `${left}px`;\n  textarea.style.top = `${top}px`;\n  textarea.style.zIndex = '1000';\n\n  textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n  moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n  if (shouldSelectWord) {\n    selectionService.rightClickSelect(ev);\n  }\n\n  // Get textarea ready to copy from the context menu\n  textarea.value = selectionService.selectionText;\n  textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { IColor } from 'common/Types';\nimport { TwoKeyMap } from 'common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n  private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();\n  private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();\n\n  public setCss(bg: number, fg: number, value: string | null): void {\n    this._css.set(bg, fg, value);\n  }\n\n  public getCss(bg: number, fg: number): string | null | undefined {\n    return this._css.get(bg, fg);\n  }\n\n  public setColor(bg: number, fg: number, value: IColor | null): void {\n    this._color.set(bg, fg, value);\n  }\n\n  public getColor(bg: number, fg: number): IColor | null | undefined {\n    return this._color.get(bg, fg);\n  }\n\n  public clear(): void {\n    this._color.clear();\n    this._css.clear();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n  node: Element | Window | Document,\n  type: string,\n  handler: (e: any) => void,\n  options?: boolean | AddEventListenerOptions\n): IDisposable {\n  node.addEventListener(type, handler, options);\n  let disposed = false;\n  return {\n    dispose: () => {\n      if (disposed) {\n        return;\n      }\n      disposed = true;\n      node.removeEventListener(type, handler, options);\n    }\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkProvider, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, disposeArray, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { IBufferService } from 'common/services/Services';\nimport { IMouseService, IRenderService } from './services/Services';\n\nexport class Linkifier2 extends Disposable implements ILinkifier2 {\n  private _element: HTMLElement | undefined;\n  private _mouseService: IMouseService | undefined;\n  private _renderService: IRenderService | undefined;\n  private _linkProviders: ILinkProvider[] = [];\n  public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n  protected _currentLink: ILinkWithState | undefined;\n  private _mouseDownLink: ILinkWithState | undefined;\n  private _lastMouseEvent: MouseEvent | undefined;\n  private _linkCacheDisposables: IDisposable[] = [];\n  private _lastBufferCell: IBufferCellPosition | undefined;\n  private _isMouseOut: boolean = true;\n  private _wasResized: boolean = false;\n  private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n  private _activeLine: number = -1;\n\n  private readonly _onShowLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n  public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n  private readonly _onHideLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n  public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n    super();\n    this.register(getDisposeArrayDisposable(this._linkCacheDisposables));\n    this.register(toDisposable(() => {\n      this._lastMouseEvent = undefined;\n    }));\n    // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n    this.register(this._bufferService.onResize(() => {\n      this._clearCurrentLink();\n      this._wasResized = true;\n    }));\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    this._linkProviders.push(linkProvider);\n    return {\n      dispose: () => {\n        // Remove the link provider from the list\n        const providerIndex = this._linkProviders.indexOf(linkProvider);\n\n        if (providerIndex !== -1) {\n          this._linkProviders.splice(providerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void {\n    this._element = element;\n    this._mouseService = mouseService;\n    this._renderService = renderService;\n\n    this.register(addDisposableDomListener(this._element, 'mouseleave', () => {\n      this._isMouseOut = true;\n      this._clearCurrentLink();\n    }));\n    this.register(addDisposableDomListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n    this.register(addDisposableDomListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n    this.register(addDisposableDomListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n  }\n\n  private _handleMouseMove(event: MouseEvent): void {\n    this._lastMouseEvent = event;\n\n    if (!this._element || !this._mouseService) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n    if (!position) {\n      return;\n    }\n    this._isMouseOut = false;\n\n    // Ignore the event if it's an embedder created hover widget\n    const composedPath = event.composedPath() as HTMLElement[];\n    for (let i = 0; i < composedPath.length; i++) {\n      const target = composedPath[i];\n      // Hit Terminal.element, break and continue\n      if (target.classList.contains('xterm')) {\n        break;\n      }\n      // It's a hover, don't respect hover event\n      if (target.classList.contains('xterm-hover')) {\n        return;\n      }\n    }\n\n    if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n      this._handleHover(position);\n      this._lastBufferCell = position;\n    }\n  }\n\n  private _handleHover(position: IBufferCellPosition): void {\n    // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n    //       should be something like `activeRange: {startY, endY}`\n    // Check if we need to clear the link\n    if (this._activeLine !== position.y || this._wasResized) {\n      this._clearCurrentLink();\n      this._askForLink(position, false);\n      this._wasResized = false;\n      return;\n    }\n\n    // Check the if the link is in the mouse position\n    const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n    if (!isCurrentLinkInPosition) {\n      this._clearCurrentLink();\n      this._askForLink(position, true);\n    }\n  }\n\n  private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n    if (!this._activeProviderReplies || !useLineCache) {\n      this._activeProviderReplies?.forEach(reply => {\n        reply?.forEach(linkWithState => {\n          if (linkWithState.link.dispose) {\n            linkWithState.link.dispose();\n          }\n        });\n      });\n      this._activeProviderReplies = new Map();\n      this._activeLine = position.y;\n    }\n    let linkProvided = false;\n\n    // There is no link cached, so ask for one\n    for (const [i, linkProvider] of this._linkProviders.entries()) {\n      if (useLineCache) {\n        const existingReply = this._activeProviderReplies?.get(i);\n        // If there isn't a reply, the provider hasn't responded yet.\n\n        // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n        // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n        // needs promises to get fixed\n        if (existingReply) {\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n        }\n      } else {\n        linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n          if (this._isMouseOut) {\n            return;\n          }\n          const linksWithState: ILinkWithState[] | undefined = links?.map(link  => ({ link }));\n          this._activeProviderReplies?.set(i, linksWithState);\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n          // If all providers have responded, remove lower priority links that intersect ranges of\n          // higher priority links\n          if (this._activeProviderReplies?.size === this._linkProviders.length) {\n            this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n          }\n        });\n      }\n    }\n  }\n\n  private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n    const occupiedCells = new Set<number>();\n    for (let i = 0; i < replies.size; i++) {\n      const providerReply = replies.get(i);\n      if (!providerReply) {\n        continue;\n      }\n      for (let i = 0; i < providerReply.length; i++) {\n        const linkWithState = providerReply[i];\n        const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n        const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n        for (let x = startX; x <= endX; x++) {\n          if (occupiedCells.has(x)) {\n            providerReply.splice(i--, 1);\n            break;\n          }\n          occupiedCells.add(x);\n        }\n      }\n    }\n  }\n\n  private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n    if (!this._activeProviderReplies) {\n      return linkProvided;\n    }\n\n    const links = this._activeProviderReplies.get(index);\n\n    // Check if every provider before this one has come back undefined\n    let hasLinkBefore = false;\n    for (let j = 0; j < index; j++) {\n      if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n        hasLinkBefore = true;\n      }\n    }\n\n    // If all providers with higher priority came back undefined, then this provider's link for\n    // the position should be used\n    if (!hasLinkBefore && links) {\n      const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n      if (linkAtPosition) {\n        linkProvided = true;\n        this._handleNewLink(linkAtPosition);\n      }\n    }\n\n    // Check if all the providers have responded\n    if (this._activeProviderReplies.size === this._linkProviders.length && !linkProvided) {\n      // Respect the order of the link providers\n      for (let j = 0; j < this._activeProviderReplies.size; j++) {\n        const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n        if (currentLink) {\n          linkProvided = true;\n          this._handleNewLink(currentLink);\n          break;\n        }\n      }\n    }\n\n    return linkProvided;\n  }\n\n  private _handleMouseDown(): void {\n    this._mouseDownLink = this._currentLink;\n  }\n\n  private _handleMouseUp(event: MouseEvent): void {\n    if (!this._element || !this._mouseService || !this._currentLink) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n    if (!position) {\n      return;\n    }\n\n    if (this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, position)) {\n      this._currentLink.link.activate(event, this._currentLink.link.text);\n    }\n  }\n\n  private _clearCurrentLink(startRow?: number, endRow?: number): void {\n    if (!this._element || !this._currentLink || !this._lastMouseEvent) {\n      return;\n    }\n\n    // If we have a start and end row, check that the link is within it\n    if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n      this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n      this._currentLink = undefined;\n      disposeArray(this._linkCacheDisposables);\n    }\n  }\n\n  private _handleNewLink(linkWithState: ILinkWithState): void {\n    if (!this._element || !this._lastMouseEvent || !this._mouseService) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService);\n\n    if (!position) {\n      return;\n    }\n\n    // Trigger hover if the we have a link at the position\n    if (this._linkAtPosition(linkWithState.link, position)) {\n      this._currentLink = linkWithState;\n      this._currentLink.state = {\n        decorations: {\n          underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n          pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n        },\n        isHovered: true\n      };\n      this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n      // Add listener for tracking decorations changes\n      linkWithState.link.decorations = {} as ILinkDecorations;\n      Object.defineProperties(linkWithState.link.decorations, {\n        pointerCursor: {\n          get: () => this._currentLink?.state?.decorations.pointerCursor,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n              this._currentLink.state.decorations.pointerCursor = v;\n              if (this._currentLink.state.isHovered) {\n                this._element?.classList.toggle('xterm-cursor-pointer', v);\n              }\n            }\n          }\n        },\n        underline: {\n          get: () => this._currentLink?.state?.decorations.underline,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n              this._currentLink.state.decorations.underline = v;\n              if (this._currentLink.state.isHovered) {\n                this._fireUnderlineEvent(linkWithState.link, v);\n              }\n            }\n          }\n        }\n      });\n\n      // Listen to viewport changes to re-render the link under the cursor (only when the line the\n      // link is on changes)\n      if (this._renderService) {\n        this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n          // Sanity check, this shouldn't happen in practice as this listener would be disposed\n          if (!this._currentLink) {\n            return;\n          }\n          // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n          // cleared.\n          const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n          const end = this._bufferService.buffer.ydisp + 1 + e.end;\n          // Only clear the link if the viewport change happened on this line\n          if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n            this._clearCurrentLink(start, end);\n            if (this._lastMouseEvent && this._element) {\n              // re-eval previously active link after changes\n              const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService!);\n              if (position) {\n                this._askForLink(position, false);\n              }\n            }\n          }\n        }));\n      }\n    }\n  }\n\n  protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = true;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, true);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.add('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.hover) {\n      link.hover(event, link.text);\n    }\n  }\n\n  private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n    const range = link.range;\n    const scrollOffset = this._bufferService.buffer.ydisp;\n    const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n    const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n    emitter.fire(event);\n  }\n\n  protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = false;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, false);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.remove('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.leave) {\n      link.leave(event, link.text);\n    }\n  }\n\n  /**\n   * Check if the buffer position is within the link\n   * @param link\n   * @param position\n   */\n  private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n    const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n    const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n    const current = position.y * this._bufferService.cols + position.x;\n    return (lower <= current && current <= upper);\n  }\n\n  /**\n   * Get the buffer position from a mouse event\n   * @param event\n   */\n  private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined {\n    const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n    if (!coords) {\n      return;\n    }\n\n    return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n  }\n\n  private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n    return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\n// eslint-disable-next-line prefer-const\nexport let promptLabel = 'Terminal input';\n\n// eslint-disable-next-line prefer-const\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink, ILinkProvider } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IOscLinkService private readonly _oscLinkService: IOscLinkService\n  ) {\n  }\n\n  public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n    const line = this._bufferService.buffer.lines.get(y - 1);\n    if (!line) {\n      callback(undefined);\n      return;\n    }\n\n    const result: ILink[] = [];\n    const linkHandler = this._optionsService.rawOptions.linkHandler;\n    const cell = new CellData();\n    const lineLength = line.getTrimmedLength();\n    let currentLinkId = -1;\n    let currentStart = -1;\n    let finishLink = false;\n    for (let x = 0; x < lineLength; x++) {\n      // Minor optimization, only check for content if there isn't a link in case the link ends with\n      // a null cell\n      if (currentStart === -1 && !line.hasContent(x)) {\n        continue;\n      }\n\n      line.loadCell(x, cell);\n      if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n        if (currentStart === -1) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n          continue;\n        } else {\n          finishLink = cell.extended.urlId !== currentLinkId;\n        }\n      } else {\n        if (currentStart !== -1) {\n          finishLink = true;\n        }\n      }\n\n      if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n        const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n        if (text) {\n          // These ranges are 1-based\n          const range: IBufferRange = {\n            start: {\n              x: currentStart + 1,\n              y\n            },\n            end: {\n              // Offset end x if it's a link that ends on the last cell in the line\n              x: x + (!finishLink && x === lineLength - 1 ? 1 : 0),\n              y\n            }\n          };\n\n          let ignoreLink = false;\n          if (!linkHandler?.allowNonHttpProtocols) {\n            try {\n              const parsed = new URL(text);\n              if (!['http:', 'https:'].includes(parsed.protocol)) {\n                ignoreLink = true;\n              }\n            } catch (e) {\n              // Ignore invalid URLs to prevent unexpected behaviors\n              ignoreLink = true;\n            }\n          }\n\n          if (!ignoreLink) {\n            // OSC links always use underline and pointer decorations\n            result.push({\n              text,\n              range,\n              activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n              hover: (e, text) => linkHandler?.hover?.(e, text, range),\n              leave: (e, text) => linkHandler?.leave?.(e, text, range)\n            });\n          }\n        }\n        finishLink = false;\n\n        // Clear link or start a new link if one starts immediately\n        if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n        } else {\n          currentStart = -1;\n          currentLinkId = -1;\n        }\n      }\n    }\n\n    // TODO: Handle fetching and returning other link ranges to underline other links with the same\n    //       id\n    callback(result);\n  }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n  const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n  if (answer) {\n    const newWindow = window.open();\n    if (newWindow) {\n      try {\n        newWindow.opener = null;\n      } catch {\n        // no-op, Electron can throw\n      }\n      newWindow.location.href = uri;\n    } else {\n      console.warn('Opening link blocked as opener could not be cleared');\n    }\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n  private _animationFrame: number | undefined;\n  private _refreshCallbacks: FrameRequestCallback[] = [];\n\n  constructor(\n    private _parentWindow: Window,\n    private _renderCallback: (start: number, end: number) => void\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._animationFrame) {\n      this._parentWindow.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    this._refreshCallbacks.push(callback);\n    if (!this._animationFrame) {\n      this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n    }\n    return this._animationFrame;\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart !== undefined ? rowStart : 0;\n    rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    if (this._animationFrame) {\n      return;\n    }\n\n    this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n  }\n\n  private _innerRefresh(): void {\n    this._animationFrame = undefined;\n\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      this._runRefreshCallbacks();\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n    this._runRefreshCallbacks();\n  }\n\n  private _runRefreshCallbacks(): void {\n    for (const callback of this._refreshCallbacks) {\n      callback(0);\n    }\n    this._refreshCallbacks = [];\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from 'common/Lifecycle';\n\nexport type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRatio?: number) => void;\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nexport class ScreenDprMonitor extends Disposable {\n  private _currentDevicePixelRatio: number;\n  private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n  private _listener: ScreenDprListener | undefined;\n  private _resolutionMediaMatchList: MediaQueryList | undefined;\n\n  constructor(private _parentWindow: Window) {\n    super();\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this.register(toDisposable(() => {\n      this.clearListener();\n    }));\n  }\n\n  public setListener(listener: ScreenDprListener): void {\n    if (this._listener) {\n      this.clearListener();\n    }\n    this._listener = listener;\n    this._outerListener = () => {\n      if (!this._listener) {\n        return;\n      }\n      this._listener(this._parentWindow.devicePixelRatio, this._currentDevicePixelRatio);\n      this._updateDpr();\n    };\n    this._updateDpr();\n  }\n\n  private _updateDpr(): void {\n    if (!this._outerListener) {\n      return;\n    }\n\n    // Clear listeners for old DPR\n    this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n    // Add listeners for new DPR\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n    this._resolutionMediaMatchList.addListener(this._outerListener);\n  }\n\n  public clearListener(): void {\n    if (!this._resolutionMediaMatchList || !this._listener || !this._outerListener) {\n      return;\n    }\n    this._resolutionMediaMatchList.removeListener(this._outerListener);\n    this._resolutionMediaMatchList = undefined;\n    this._listener = undefined;\n    this._outerListener = undefined;\n  }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from 'browser/Clipboard';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Linkifier2 } from 'browser/Linkifier2';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { OscLinkProvider } from 'browser/OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal, IViewport } from 'browser/Types';\nimport { Viewport } from 'browser/Viewport';\nimport { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { IRenderer } from 'browser/renderer/shared/Types';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { CharacterJoinerService } from 'browser/services/CharacterJoinerService';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { MouseService } from 'browser/services/MouseService';\nimport { RenderService } from 'browser/services/RenderService';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services';\nimport { ThemeService } from 'browser/services/ThemeService';\nimport { color, rgba } from 'common/Color';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport * as Browser from 'common/Platform';\nimport { ColorRequestType, CoreMouseAction, CoreMouseButton, CoreMouseEventType, IColorEvent, ITerminalOptions, KeyboardResultType, ScrollSource, SpecialColorIndex } from 'common/Types';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { IBuffer } from 'common/buffer/Types';\nimport { C0, C1_ESCAPED } from 'common/data/EscapeSequences';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { toRgbString } from 'common/input/XParseColor';\nimport { DecorationService } from 'common/services/DecorationService';\nimport { IDecorationService } from 'common/services/Services';\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker } from 'xterm';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document: Document = (typeof window !== 'undefined') ? window.document : null as any;\n\nexport class Terminal extends CoreTerminal implements ITerminal {\n  public textarea: HTMLTextAreaElement | undefined;\n  public element: HTMLElement | undefined;\n  public screenElement: HTMLElement | undefined;\n\n  private _document: Document | undefined;\n  private _viewportScrollArea: HTMLElement | undefined;\n  private _viewportElement: HTMLElement | undefined;\n  private _helperContainer: HTMLElement | undefined;\n  private _compositionView: HTMLElement | undefined;\n\n  private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n\n  public browser: IBrowser = Browser as any;\n\n  private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n  // browser services\n  private _decorationService: DecorationService;\n  private _charSizeService: ICharSizeService | undefined;\n  private _coreBrowserService: ICoreBrowserService | undefined;\n  private _mouseService: IMouseService | undefined;\n  private _renderService: IRenderService | undefined;\n  private _themeService: IThemeService | undefined;\n  private _characterJoinerService: ICharacterJoinerService | undefined;\n  private _selectionService: ISelectionService | undefined;\n\n  /**\n   * Records whether the keydown event has already been handled and triggered a data event, if so\n   * the keypress event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyDownHandled: boolean = false;\n\n  /**\n   * Records whether a keydown event has occured since the last keyup event, i.e. whether a key\n   * is currently \"pressed\".\n   */\n  private _keyDownSeen: boolean = false;\n\n  /**\n   * Records whether the keypress event has already been handled and triggered a data event, if so\n   * the input event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyPressHandled: boolean = false;\n\n  /**\n   * Records whether there has been a keydown event for a dead key without a corresponding keydown\n   * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n   * no events will be emitted for the final character.\n   */\n  private _unprocessedDeadKey: boolean = false;\n\n  public linkifier2: ILinkifier2;\n  public viewport: IViewport | undefined;\n  private _compositionHelper: ICompositionHelper | undefined;\n  private _accessibilityManager: MutableDisposable<AccessibilityManager> = this.register(new MutableDisposable());\n\n  private readonly _onCursorMove = this.register(new EventEmitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onKey = this.register(new EventEmitter<{ key: string, domEvent: KeyboardEvent }>());\n  public readonly onKey = this._onKey.event;\n  private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onSelectionChange = this.register(new EventEmitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onTitleChange = this.register(new EventEmitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onBell = this.register(new EventEmitter<void>());\n  public readonly onBell = this._onBell.event;\n\n  private _onFocus = this.register(new EventEmitter<void>());\n  public get onFocus(): IEvent<void> { return this._onFocus.event; }\n  private _onBlur = this.register(new EventEmitter<void>());\n  public get onBlur(): IEvent<void> { return this._onBlur.event; }\n  private _onA11yCharEmitter = this.register(new EventEmitter<string>());\n  public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n  private _onA11yTabEmitter = this.register(new EventEmitter<number>());\n  public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n  private _onWillOpen = this.register(new EventEmitter<HTMLElement>());\n  public get onWillOpen(): IEvent<HTMLElement> { return this._onWillOpen.event; }\n\n  constructor(\n    options: Partial<ITerminalOptions> = {}\n  ) {\n    super(options);\n\n    this._setup();\n\n    this.linkifier2 = this.register(this._instantiationService.createInstance(Linkifier2));\n    this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n    this._decorationService = this._instantiationService.createInstance(DecorationService);\n    this._instantiationService.setService(IDecorationService, this._decorationService);\n\n    // Setup InputHandler listeners\n    this.register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n    this.register(this._inputHandler.onRequestRefreshRows((start, end) => this.refresh(start, end)));\n    this.register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n    this.register(this._inputHandler.onRequestReset(() => this.reset()));\n    this.register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n    this.register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n    this.register(forwardEvent(this._inputHandler.onCursorMove, this._onCursorMove));\n    this.register(forwardEvent(this._inputHandler.onTitleChange, this._onTitleChange));\n    this.register(forwardEvent(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n    this.register(forwardEvent(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n    // Setup listeners\n    this.register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n    this.register(toDisposable(() => {\n      this._customKeyEventHandler = undefined;\n      this.element?.parentNode?.removeChild(this.element);\n    }));\n  }\n\n  /**\n   * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n   * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n   * or none restore requests (resetting all),\n   * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n   */\n  private _handleColorEvent(event: IColorEvent): void {\n    if (!this._themeService) return;\n    for (const req of event) {\n      let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n      let ident = '';\n      switch (req.index) {\n        case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n          acc = 'foreground';\n          ident = '10';\n          break;\n        case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n          acc = 'background';\n          ident = '11';\n          break;\n        case SpecialColorIndex.CURSOR: // OSC 12 | 112\n          acc = 'cursor';\n          ident = '12';\n          break;\n        default: // OSC 4 | 104\n          // we can skip the [0..255] range check here (already done in inputhandler)\n          acc = 'ansi';\n          ident = '4;' + req.index;\n      }\n      switch (req.type) {\n        case ColorRequestType.REPORT:\n          const channels = color.toColorRGB(acc === 'ansi'\n            ? this._themeService.colors.ansi[req.index]\n            : this._themeService.colors[acc]);\n          this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(channels)}${C1_ESCAPED.ST}`);\n          break;\n        case ColorRequestType.SET:\n          if (acc === 'ansi') {\n            this._themeService.modifyColors(colors => colors.ansi[req.index] = rgba.toColor(...req.color));\n          } else {\n            const narrowedAcc = acc;\n            this._themeService.modifyColors(colors => colors[narrowedAcc] = rgba.toColor(...req.color));\n          }\n          break;\n        case ColorRequestType.RESTORE:\n          this._themeService.restoreColor(req.index);\n          break;\n      }\n    }\n  }\n\n  protected _setup(): void {\n    super._setup();\n\n    this._customKeyEventHandler = undefined;\n  }\n\n  /**\n   * Convenience property to active buffer.\n   */\n  public get buffer(): IBuffer {\n    return this.buffers.active;\n  }\n\n  /**\n   * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n   */\n  public focus(): void {\n    if (this.textarea) {\n      this.textarea.focus({ preventScroll: true });\n    }\n  }\n\n  private _handleScreenReaderModeOptionChange(value: boolean): void {\n    if (value) {\n      if (!this._accessibilityManager.value && this._renderService) {\n        this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n      }\n    } else {\n      this._accessibilityManager.clear();\n    }\n  }\n\n  /**\n   * Binds the desired focus behavior on a given terminal object.\n   */\n  private _handleTextAreaFocus(ev: KeyboardEvent): void {\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    }\n    this.updateCursorStyle(ev);\n    this.element!.classList.add('focus');\n    this._showCursor();\n    this._onFocus.fire();\n  }\n\n  /**\n   * Blur the terminal, calling the blur function on the terminal's underlying\n   * textarea.\n   */\n  public blur(): void {\n    return this.textarea?.blur();\n  }\n\n  /**\n   * Binds the desired blur behavior on a given terminal object.\n   */\n  private _handleTextAreaBlur(): void {\n    // Text can safely be removed on blur. Doing it earlier could interfere with\n    // screen readers reading it out.\n    this.textarea!.value = '';\n    this.refresh(this.buffer.y, this.buffer.y);\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n    this.element!.classList.remove('focus');\n    this._onBlur.fire();\n  }\n\n  private _syncTextArea(): void {\n    if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n      return;\n    }\n    const cursorY = this.buffer.ybase + this.buffer.y;\n    const bufferLine = this.buffer.lines.get(cursorY);\n    if (!bufferLine) {\n      return;\n    }\n    const cursorX = Math.min(this.buffer.x, this.cols - 1);\n    const cellHeight = this._renderService.dimensions.css.cell.height;\n    const width = bufferLine.getWidth(cursorX);\n    const cellWidth = this._renderService.dimensions.css.cell.width * width;\n    const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n    const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n    // Sync the textarea to the exact position of the composition view so the IME knows where the\n    // text is.\n    this.textarea.style.left = cursorLeft + 'px';\n    this.textarea.style.top = cursorTop + 'px';\n    this.textarea.style.width = cellWidth + 'px';\n    this.textarea.style.height = cellHeight + 'px';\n    this.textarea.style.lineHeight = cellHeight + 'px';\n    this.textarea.style.zIndex = '-5';\n  }\n\n  /**\n   * Initialize default behavior\n   */\n  private _initGlobal(): void {\n    this._bindKeys();\n\n    // Bind clipboard functionality\n    this.register(addDisposableDomListener(this.element!, 'copy', (event: ClipboardEvent) => {\n      // If mouse events are active it means the selection manager is disabled and\n      // copy should be handled by the host program.\n      if (!this.hasSelection()) {\n        return;\n      }\n      copyHandler(event, this._selectionService!);\n    }));\n    const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n    this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));\n    this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));\n\n    // Handle right click context menus\n    if (Browser.isFirefox) {\n      // Firefox doesn't appear to fire the contextmenu event on right click\n      this.register(addDisposableDomListener(this.element!, 'mousedown', (event: MouseEvent) => {\n        if (event.button === 2) {\n          rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n        }\n      }));\n    } else {\n      this.register(addDisposableDomListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n        rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n      }));\n    }\n\n    // Move the textarea under the cursor when middle clicking on Linux to ensure\n    // middle click to paste selection works. This only appears to work in Chrome\n    // at the time is writing.\n    if (Browser.isLinux) {\n      // Use auxclick event over mousedown the latter doesn't seem to work. Note\n      // that the regular click event doesn't fire for the middle mouse button.\n      this.register(addDisposableDomListener(this.element!, 'auxclick', (event: MouseEvent) => {\n        if (event.button === 1) {\n          moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n        }\n      }));\n    }\n  }\n\n  /**\n   * Apply key handling to the terminal\n   */\n  private _bindKeys(): void {\n    this.register(addDisposableDomListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart()));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n    this.register(addDisposableDomListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n    this.register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n  }\n\n  /**\n   * Opens the terminal within an element.\n   *\n   * @param parent The element to create the terminal within.\n   */\n  public open(parent: HTMLElement): void {\n    if (!parent) {\n      throw new Error('Terminal requires a parent element.');\n    }\n\n    if (!parent.isConnected) {\n      this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n    }\n\n    this._document = parent.ownerDocument!;\n\n    // Create main element container\n    this.element = this._document.createElement('div');\n    this.element.dir = 'ltr';   // xterm.css assumes LTR\n    this.element.classList.add('terminal');\n    this.element.classList.add('xterm');\n    parent.appendChild(this.element);\n\n    // Performance: Use a document fragment to build the terminal\n    // viewport and helper elements detached from the DOM\n    const fragment = document.createDocumentFragment();\n    this._viewportElement = document.createElement('div');\n    this._viewportElement.classList.add('xterm-viewport');\n    fragment.appendChild(this._viewportElement);\n\n    this._viewportScrollArea = document.createElement('div');\n    this._viewportScrollArea.classList.add('xterm-scroll-area');\n    this._viewportElement.appendChild(this._viewportScrollArea);\n\n    this.screenElement = document.createElement('div');\n    this.screenElement.classList.add('xterm-screen');\n    // Create the container that will hold helpers like the textarea for\n    // capturing DOM Events. Then produce the helpers.\n    this._helperContainer = document.createElement('div');\n    this._helperContainer.classList.add('xterm-helpers');\n    this.screenElement.appendChild(this._helperContainer);\n    fragment.appendChild(this.screenElement);\n\n    this.textarea = document.createElement('textarea');\n    this.textarea.classList.add('xterm-helper-textarea');\n    this.textarea.setAttribute('aria-label', Strings.promptLabel);\n    if (!Browser.isChromeOS) {\n      // ChromeVox on ChromeOS does not like this. See\n      // https://issuetracker.google.com/issues/260170397\n      this.textarea.setAttribute('aria-multiline', 'false');\n    }\n    this.textarea.setAttribute('autocorrect', 'off');\n    this.textarea.setAttribute('autocapitalize', 'off');\n    this.textarea.setAttribute('spellcheck', 'false');\n    this.textarea.tabIndex = 0;\n\n    // Register the core browser service before the generic textarea handlers are registered so it\n    // handles them first. Otherwise the renderers may use the wrong focus state.\n    this._coreBrowserService = this._instantiationService.createInstance(CoreBrowserService, this.textarea, this._document.defaultView ?? window);\n    this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n    this.register(addDisposableDomListener(this.textarea, 'focus', (ev: KeyboardEvent) => this._handleTextAreaFocus(ev)));\n    this.register(addDisposableDomListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n    this._helperContainer.appendChild(this.textarea);\n\n\n    this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n    this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n    this._themeService = this._instantiationService.createInstance(ThemeService);\n    this._instantiationService.setService(IThemeService, this._themeService);\n\n    this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n    this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n    this._renderService = this.register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n    this._instantiationService.setService(IRenderService, this._renderService);\n    this.register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n    this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n    this._compositionView = document.createElement('div');\n    this._compositionView.classList.add('composition-view');\n    this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n    this._helperContainer.appendChild(this._compositionView);\n\n    // Performance: Add viewport and helper elements from the fragment\n    this.element.appendChild(fragment);\n\n    try {\n      this._onWillOpen.fire(this.element);\n    }\n    catch { /* fails to load addon for some reason */ }\n    if (!this._renderService.hasRenderer()) {\n      this._renderService.setRenderer(this._createRenderer());\n    }\n\n    this._mouseService = this._instantiationService.createInstance(MouseService);\n    this._instantiationService.setService(IMouseService, this._mouseService);\n\n    this.viewport = this._instantiationService.createInstance(Viewport, this._viewportElement, this._viewportScrollArea);\n    this.viewport.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent, ScrollSource.VIEWPORT)),\n    this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport!.syncScrollArea()));\n    this.register(this.viewport);\n\n    this.register(this.onCursorMove(() => {\n      this._renderService!.handleCursorMove();\n      this._syncTextArea();\n    }));\n    this.register(this.onResize(() => this._renderService!.handleResize(this.cols, this.rows)));\n    this.register(this.onBlur(() => this._renderService!.handleBlur()));\n    this.register(this.onFocus(() => this._renderService!.handleFocus()));\n    this.register(this._renderService.onDimensionsChange(() => this.viewport!.syncScrollArea()));\n\n    this._selectionService = this.register(this._instantiationService.createInstance(SelectionService,\n      this.element,\n      this.screenElement,\n      this.linkifier2\n    ));\n    this._instantiationService.setService(ISelectionService, this._selectionService);\n    this.register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n    this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n    this.register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n    this.register(this._selectionService.onLinuxMouseSelection(text => {\n      // If there's a new selection, put it into the textarea, focus and select it\n      // in order to register it as a selection on the OS. This event is fired\n      // only on Linux to enable middle click to paste selection.\n      this.textarea!.value = text;\n      this.textarea!.focus();\n      this.textarea!.select();\n    }));\n    this.register(this._onScroll.event(ev => {\n      this.viewport!.syncScrollArea();\n      this._selectionService!.refresh();\n    }));\n    this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));\n\n    this.linkifier2.attachToDom(this.screenElement, this._mouseService, this._renderService);\n    this.register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n    this.register(addDisposableDomListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n    // apply mouse event classes set by escape codes before terminal was attached\n    if (this.coreMouseService.areMouseEventsActive) {\n      this._selectionService.disable();\n      this.element.classList.add('enable-mouse-events');\n    } else {\n      this._selectionService.enable();\n    }\n\n    if (this.options.screenReaderMode) {\n      // Note that this must be done *after* the renderer is created in order to\n      // ensure the correct order of the dprchange event\n      this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n    }\n    this.register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n    if (this.options.overviewRulerWidth) {\n      this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n    }\n    this.optionsService.onSpecificOptionChange('overviewRulerWidth', value => {\n      if (!this._overviewRulerRenderer && value && this._viewportElement && this.screenElement) {\n        this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n      }\n    });\n    // Measure the character size\n    this._charSizeService.measure();\n\n    // Setup loop that draws to screen\n    this.refresh(0, this.rows - 1);\n\n    // Initialize global actions that need to be taken on the document.\n    this._initGlobal();\n\n    // Listen for mouse events and translate\n    // them into terminal mouse protocols.\n    this.bindMouse();\n  }\n\n  private _createRenderer(): IRenderer {\n    return this._instantiationService.createInstance(DomRenderer, this.element!, this.screenElement!, this._viewportElement!, this.linkifier2);\n  }\n\n  /**\n   * Bind certain mouse events to the terminal.\n   * By default only 3 button + wheel up/down is ativated. For higher buttons\n   * no mouse report will be created. Typically the standard actions will be active.\n   *\n   * There are several reasons not to enable support for higher buttons/wheel:\n   * - Button 4 and 5 are typically used for history back and forward navigation,\n   *   there is no straight forward way to supress/intercept those standard actions.\n   * - Support for higher buttons does not work in some platform/browser combinations.\n   * - Left/right wheel was not tested.\n   * - Emulators vary in mouse button support, typically only 3 buttons and\n   *   wheel up/down work reliable.\n   *\n   * TODO: Move mouse event code into its own file.\n   */\n  public bindMouse(): void {\n    const self = this;\n    const el = this.element!;\n\n    // send event to CoreMouseService\n    function sendEvent(ev: MouseEvent | WheelEvent): boolean {\n      // get mouse coordinates\n      const pos = self._mouseService!.getMouseReportCoords(ev, self.screenElement!);\n      if (!pos) {\n        return false;\n      }\n\n      let but: CoreMouseButton;\n      let action: CoreMouseAction | undefined;\n      switch ((ev as any).overrideType || ev.type) {\n        case 'mousemove':\n          action = CoreMouseAction.MOVE;\n          if (ev.buttons === undefined) {\n            // buttons is not supported on macOS, try to get a value from button instead\n            but = CoreMouseButton.NONE;\n            if (ev.button !== undefined) {\n              but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n            }\n          } else {\n            // according to MDN buttons only reports up to button 5 (AUX2)\n            but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n              ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n                ev.buttons & 2 ? CoreMouseButton.RIGHT :\n                  CoreMouseButton.NONE; // fallback to NONE\n          }\n          break;\n        case 'mouseup':\n          action = CoreMouseAction.UP;\n          but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n          break;\n        case 'mousedown':\n          action = CoreMouseAction.DOWN;\n          but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n          break;\n        case 'wheel':\n          const amount = self.viewport!.getLinesScrolled(ev as WheelEvent);\n\n          if (amount === 0) {\n            return false;\n          }\n\n          action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n          but = CoreMouseButton.WHEEL;\n          break;\n        default:\n          // dont handle other event types by accident\n          return false;\n      }\n\n      // exit if we cannot determine valid button/action values\n      // do nothing for higher buttons than wheel\n      if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n        return false;\n      }\n\n      return self.coreMouseService.triggerMouseEvent({\n        col: pos.col,\n        row: pos.row,\n        x: pos.x,\n        y: pos.y,\n        button: but,\n        action,\n        ctrl: ev.ctrlKey,\n        alt: ev.altKey,\n        shift: ev.shiftKey\n      });\n    }\n\n    /**\n     * Event listener state handling.\n     * We listen to the onProtocolChange event of CoreMouseService and put\n     * requested listeners in `requestedEvents`. With this the listeners\n     * have all bits to do the event listener juggling.\n     * Note: 'mousedown' currently is \"always on\" and not managed\n     * by onProtocolChange.\n     */\n    const requestedEvents: { [key: string]: ((ev: Event) => void) | null } = {\n      mouseup: null,\n      wheel: null,\n      mousedrag: null,\n      mousemove: null\n    };\n    const eventListeners: { [key: string]: (ev: any) => void | boolean } = {\n      mouseup: (ev: MouseEvent) => {\n        sendEvent(ev);\n        if (!ev.buttons) {\n          // if no other button is held remove global handlers\n          this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n          if (requestedEvents.mousedrag) {\n            this._document!.removeEventListener('mousemove', requestedEvents.mousedrag);\n          }\n        }\n        return this.cancel(ev);\n      },\n      wheel: (ev: WheelEvent) => {\n        sendEvent(ev);\n        return this.cancel(ev, true);\n      },\n      mousedrag: (ev: MouseEvent) => {\n        // deal only with move while a button is held\n        if (ev.buttons) {\n          sendEvent(ev);\n        }\n      },\n      mousemove: (ev: MouseEvent) => {\n        // deal only with move without any button\n        if (!ev.buttons) {\n          sendEvent(ev);\n        }\n      }\n    };\n    this.register(this.coreMouseService.onProtocolChange(events => {\n      // apply global changes on events\n      if (events) {\n        if (this.optionsService.rawOptions.logLevel === 'debug') {\n          this._logService.debug('Binding to mouse events:', this.coreMouseService.explainEvents(events));\n        }\n        this.element!.classList.add('enable-mouse-events');\n        this._selectionService!.disable();\n      } else {\n        this._logService.debug('Unbinding from mouse events.');\n        this.element!.classList.remove('enable-mouse-events');\n        this._selectionService!.enable();\n      }\n\n      // add/remove handlers from requestedEvents\n\n      if (!(events & CoreMouseEventType.MOVE)) {\n        el.removeEventListener('mousemove', requestedEvents.mousemove!);\n        requestedEvents.mousemove = null;\n      } else if (!requestedEvents.mousemove) {\n        el.addEventListener('mousemove', eventListeners.mousemove);\n        requestedEvents.mousemove = eventListeners.mousemove;\n      }\n\n      if (!(events & CoreMouseEventType.WHEEL)) {\n        el.removeEventListener('wheel', requestedEvents.wheel!);\n        requestedEvents.wheel = null;\n      } else if (!requestedEvents.wheel) {\n        el.addEventListener('wheel', eventListeners.wheel, { passive: false });\n        requestedEvents.wheel = eventListeners.wheel;\n      }\n\n      if (!(events & CoreMouseEventType.UP)) {\n        this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n        el.removeEventListener('mouseup', requestedEvents.mouseup!);\n        requestedEvents.mouseup = null;\n      } else if (!requestedEvents.mouseup) {\n        el.addEventListener('mouseup', eventListeners.mouseup);\n        requestedEvents.mouseup = eventListeners.mouseup;\n      }\n\n      if (!(events & CoreMouseEventType.DRAG)) {\n        this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!);\n        requestedEvents.mousedrag = null;\n      } else if (!requestedEvents.mousedrag) {\n        requestedEvents.mousedrag = eventListeners.mousedrag;\n      }\n    }));\n    // force initial onProtocolChange so we dont miss early mouse requests\n    this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol;\n\n    /**\n     * \"Always on\" event listeners.\n     */\n    this.register(addDisposableDomListener(el, 'mousedown', (ev: MouseEvent) => {\n      ev.preventDefault();\n      this.focus();\n\n      // Don't send the mouse button to the pty if mouse events are disabled or\n      // if the selection manager is having selection forced (ie. a modifier is\n      // held).\n      if (!this.coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) {\n        return;\n      }\n\n      sendEvent(ev);\n\n      // Register additional global handlers which should keep reporting outside\n      // of the terminal element.\n      // Note: Other emulators also do this for 'mousedown' while a button\n      // is held, we currently limit 'mousedown' to the terminal only.\n      if (requestedEvents.mouseup) {\n        this._document!.addEventListener('mouseup', requestedEvents.mouseup);\n      }\n      if (requestedEvents.mousedrag) {\n        this._document!.addEventListener('mousemove', requestedEvents.mousedrag);\n      }\n\n      return this.cancel(ev);\n    }));\n\n    this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n      // do nothing, if app side handles wheel itself\n      if (requestedEvents.wheel) return;\n\n      if (!this.buffer.hasScrollback) {\n        // Convert wheel events into up/down events when the buffer does not have scrollback, this\n        // enables scrolling in apps hosted in the alt buffer such as vim or tmux.\n        const amount = this.viewport!.getLinesScrolled(ev);\n\n        // Do nothing if there's no vertical scroll\n        if (amount === 0) {\n          return;\n        }\n\n        // Construct and send sequences\n        const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n        let data = '';\n        for (let i = 0; i < Math.abs(amount); i++) {\n          data += sequence;\n        }\n        this.coreService.triggerDataEvent(data, true);\n        return this.cancel(ev, true);\n      }\n\n      // normal viewport scrolling\n      // conditionally stop event, if the viewport still had rows to scroll within\n      if (this.viewport!.handleWheel(ev)) {\n        return this.cancel(ev);\n      }\n    }, { passive: false }));\n\n    this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n      if (this.coreMouseService.areMouseEventsActive) return;\n      this.viewport!.handleTouchStart(ev);\n      return this.cancel(ev);\n    }, { passive: true }));\n\n    this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n      if (this.coreMouseService.areMouseEventsActive) return;\n      if (!this.viewport!.handleTouchMove(ev)) {\n        return this.cancel(ev);\n      }\n    }, { passive: false }));\n  }\n\n\n  /**\n   * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n   * opportunity.\n   * @param start The row to start from (between 0 and this.rows - 1).\n   * @param end The row to end at (between start and this.rows - 1).\n   */\n  public refresh(start: number, end: number): void {\n    this._renderService?.refreshRows(start, end);\n  }\n\n  /**\n   * Change the cursor style for different selection modes\n   */\n  public updateCursorStyle(ev: KeyboardEvent): void {\n    if (this._selectionService?.shouldColumnSelect(ev)) {\n      this.element!.classList.add('column-select');\n    } else {\n      this.element!.classList.remove('column-select');\n    }\n  }\n\n  /**\n   * Display the cursor element\n   */\n  private _showCursor(): void {\n    if (!this.coreService.isCursorInitialized) {\n      this.coreService.isCursorInitialized = true;\n      this.refresh(this.buffer.y, this.buffer.y);\n    }\n  }\n\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source = ScrollSource.TERMINAL): void {\n    if (source === ScrollSource.VIEWPORT) {\n      super.scrollLines(disp, suppressScrollEvent, source);\n      this.refresh(0, this.rows - 1);\n    } else {\n      this.viewport?.scrollLines(disp);\n    }\n  }\n\n  public paste(data: string): void {\n    paste(data, this.textarea!, this.coreService, this.optionsService);\n  }\n\n  /**\n   * Attaches a custom key event handler which is run before keys are processed,\n   * giving consumers of xterm.js ultimate control as to what keys should be\n   * processed by the terminal and what keys should not.\n   * @param customKeyEventHandler The custom KeyboardEvent handler to attach.\n   * This is a function that takes a KeyboardEvent, allowing consumers to stop\n   * propagation and/or prevent the default action. The function returns whether\n   * the event should be processed by xterm.js.\n   */\n  public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n    this._customKeyEventHandler = customKeyEventHandler;\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this.linkifier2.registerLinkProvider(linkProvider);\n  }\n\n  public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    const joinerId = this._characterJoinerService.register(handler);\n    this.refresh(0, this.rows - 1);\n    return joinerId;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): void {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    if (this._characterJoinerService.deregister(joinerId)) {\n      this.refresh(0, this.rows - 1);\n    }\n  }\n\n  public get markers(): IMarker[] {\n    return this.buffer.markers;\n  }\n\n  public registerMarker(cursorYOffset: number): IMarker {\n    return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n  }\n\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    return this._decorationService.registerDecoration(decorationOptions);\n  }\n\n  /**\n   * Gets whether the terminal has an active selection.\n   */\n  public hasSelection(): boolean {\n    return this._selectionService ? this._selectionService.hasSelection : false;\n  }\n\n  /**\n   * Selects text within the terminal.\n   * @param column The column the selection starts at..\n   * @param row The row the selection starts at.\n   * @param length The length of the selection.\n   */\n  public select(column: number, row: number, length: number): void {\n    this._selectionService!.setSelection(column, row, length);\n  }\n\n  /**\n   * Gets the terminal's current selection, this is useful for implementing copy\n   * behavior outside of xterm.js.\n   */\n  public getSelection(): string {\n    return this._selectionService ? this._selectionService.selectionText : '';\n  }\n\n  public getSelectionPosition(): IBufferRange | undefined {\n    if (!this._selectionService || !this._selectionService.hasSelection) {\n      return undefined;\n    }\n\n    return {\n      start: {\n        x: this._selectionService.selectionStart![0],\n        y: this._selectionService.selectionStart![1]\n      },\n      end: {\n        x: this._selectionService.selectionEnd![0],\n        y: this._selectionService.selectionEnd![1]\n      }\n    };\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._selectionService?.clearSelection();\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._selectionService?.selectAll();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._selectionService?.selectLines(start, end);\n  }\n\n  /**\n   * Handle a keydown [KeyboardEvent].\n   *\n   * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   */\n  protected _keyDown(event: KeyboardEvent): boolean | undefined {\n    this._keyDownHandled = false;\n    this._keyDownSeen = true;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n      return false;\n    }\n\n    // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n    const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n    if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n      if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n        this.scrollToBottom();\n      }\n      return false;\n    }\n\n    if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n      this._unprocessedDeadKey = true;\n    }\n\n    const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta);\n\n    this.updateCursorStyle(event);\n\n    if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n      const scrollCount = this.rows - 1;\n      this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n      return this.cancel(event, true);\n    }\n\n    if (result.type === KeyboardResultType.SELECT_ALL) {\n      this.selectAll();\n    }\n\n    if (this._isThirdLevelShift(this.browser, event)) {\n      return true;\n    }\n\n    if (result.cancel) {\n      // The event is canceled at the end already, is this necessary?\n      this.cancel(event, true);\n    }\n\n    if (!result.key) {\n      return true;\n    }\n\n    // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n    // letters cannot be input while caps lock is on.\n    if (event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n      if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n        return true;\n      }\n    }\n\n    if (this._unprocessedDeadKey) {\n      this._unprocessedDeadKey = false;\n      return true;\n    }\n\n    // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n    // will announce deleted characters. This will not work 100% of the time but it should cover\n    // most scenarios.\n    if (result.key === C0.ETX || result.key === C0.CR) {\n      this.textarea!.value = '';\n    }\n\n    this._onKey.fire({ key: result.key, domEvent: event });\n    this._showCursor();\n    this.coreService.triggerDataEvent(result.key, true);\n\n    // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n    // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n    // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n    // reader to read it.\n    if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n      return this.cancel(event, true);\n    }\n\n    this._keyDownHandled = true;\n  }\n\n  private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n    const thirdLevelKey =\n      (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.getModifierState('AltGraph'));\n\n    if (ev.type === 'keypress') {\n      return thirdLevelKey;\n    }\n\n    // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n    return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n  }\n\n  protected _keyUp(ev: KeyboardEvent): void {\n    this._keyDownSeen = false;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return;\n    }\n\n    if (!wasModifierKeyOnlyEvent(ev)) {\n      this.focus();\n    }\n\n    this.updateCursorStyle(ev);\n    this._keyPressHandled = false;\n  }\n\n  /**\n   * Handle a keypress event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   * @param ev The keypress event to be handled.\n   */\n  protected _keyPress(ev: KeyboardEvent): boolean {\n    let key;\n\n    this._keyPressHandled = false;\n\n    if (this._keyDownHandled) {\n      return false;\n    }\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return false;\n    }\n\n    this.cancel(ev);\n\n    if (ev.charCode) {\n      key = ev.charCode;\n    } else if (ev.which === null || ev.which === undefined) {\n      key = ev.keyCode;\n    } else if (ev.which !== 0 && ev.charCode !== 0) {\n      key = ev.which;\n    } else {\n      return false;\n    }\n\n    if (!key || (\n      (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n    )) {\n      return false;\n    }\n\n    key = String.fromCharCode(key);\n\n    this._onKey.fire({ key, domEvent: ev });\n    this._showCursor();\n    this.coreService.triggerDataEvent(key, true);\n\n    this._keyPressHandled = true;\n\n    // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n    // keys could be ignored\n    this._unprocessedDeadKey = false;\n\n    return true;\n  }\n\n  /**\n   * Handle an input event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n   * @param ev The input event to be handled.\n   */\n  protected _inputEvent(ev: InputEvent): boolean {\n    // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n    // support reading out character input which can doubling up input characters\n    // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n    if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n      if (this._keyPressHandled) {\n        return false;\n      }\n\n      // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n      // keys could be ignored\n      this._unprocessedDeadKey = false;\n\n      const text = ev.data;\n      this.coreService.triggerDataEvent(text, true);\n\n      this.cancel(ev);\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Resizes the terminal.\n   *\n   * @param x The number of columns to resize to.\n   * @param y The number of rows to resize to.\n   */\n  public resize(x: number, y: number): void {\n    if (x === this.cols && y === this.rows) {\n      // Check if we still need to measure the char size (fixes #785).\n      if (this._charSizeService && !this._charSizeService.hasValidSize) {\n        this._charSizeService.measure();\n      }\n      return;\n    }\n\n    super.resize(x, y);\n  }\n\n  private _afterResize(x: number, y: number): void {\n    this._charSizeService?.measure();\n\n    // Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an\n    // invalid location\n    this.viewport?.syncScrollArea(true);\n  }\n\n  /**\n   * Clear the entire buffer, making the prompt line the new first line.\n   */\n  public clear(): void {\n    if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n      // Don't clear if it's already clear\n      return;\n    }\n    this.buffer.clearAllMarkers();\n    this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n    this.buffer.lines.length = 1;\n    this.buffer.ydisp = 0;\n    this.buffer.ybase = 0;\n    this.buffer.y = 0;\n    for (let i = 1; i < this.rows; i++) {\n      this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n    // scroll event and that the viewport's state will be valid for immediate writes.\n    this._onScroll.fire({ position: this.buffer.ydisp, source: ScrollSource.TERMINAL });\n    this.viewport?.reset();\n    this.refresh(0, this.rows - 1);\n  }\n\n  /**\n   * Reset terminal.\n   * Note: Calling this directly from JS is synchronous but does not clear\n   * input buffers and does not reset the parser, thus the terminal will\n   * continue to apply pending input data.\n   * If you need in band reset (synchronous with input data) consider\n   * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n   */\n  public reset(): void {\n    /**\n     * Since _setup handles a full terminal creation, we have to carry forward\n     * a few things that should not reset.\n     */\n    this.options.rows = this.rows;\n    this.options.cols = this.cols;\n    const customKeyEventHandler = this._customKeyEventHandler;\n\n    this._setup();\n    super.reset();\n    this._selectionService?.reset();\n    this._decorationService.reset();\n    this.viewport?.reset();\n\n    // reattach\n    this._customKeyEventHandler = customKeyEventHandler;\n\n    // do a full screen refresh\n    this.refresh(0, this.rows - 1);\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderService?.clearTextureAtlas();\n  }\n\n  private _reportFocus(): void {\n    if (this.element?.classList.contains('focus')) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    } else {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n  }\n\n  private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n    if (!this._renderService) {\n      return;\n    }\n\n    switch (type) {\n      case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n        const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n        const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n        break;\n      case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n        const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n        const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n        break;\n    }\n  }\n\n  // TODO: Remove cancel function and cancelEvents option\n  public cancel(ev: Event, force?: boolean): boolean | undefined {\n    if (!this.options.cancelEvents && !force) {\n      return;\n    }\n    ev.preventDefault();\n    ev.stopPropagation();\n    return false;\n  }\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n  return ev.keyCode === 16 || // Shift\n    ev.keyCode === 17 || // Ctrl\n    ev.keyCode === 18; // Alt\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\nimport { IRenderDebouncer } from 'browser/Types';\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n\n  // The last moment that the Terminal was refreshed at\n  private _lastRefreshMs = 0;\n  // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n  private _additionalRefreshRequested = false;\n\n  private _refreshTimeoutID: number | undefined;\n\n  constructor(\n    private _renderCallback: (start: number, end: number) => void,\n    private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._refreshTimeoutID) {\n      clearTimeout(this._refreshTimeoutID);\n    }\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart !== undefined ? rowStart : 0;\n    rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n    // enough time to pass before refreshing again.\n    const refreshRequestTime: number = Date.now();\n    if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n      // Enough time has lapsed since the last refresh; refresh immediately\n      this._lastRefreshMs = refreshRequestTime;\n      this._innerRefresh();\n    } else if (!this._additionalRefreshRequested) {\n      // This is the first additional request throttled; set up trailing refresh\n      const elapsed = refreshRequestTime - this._lastRefreshMs;\n      const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n      this._additionalRefreshRequested = true;\n\n      this._refreshTimeoutID = window.setTimeout(() => {\n        this._lastRefreshMs = Date.now();\n        this._innerRefresh();\n        this._additionalRefreshRequested = false;\n        this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n      }, waitPeriodBeforeTrailingRefresh);\n    }\n  }\n\n  private _innerRefresh(): void {\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n  }\n}\n\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IViewport, ReadonlyColorSet } from 'browser/Types';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nconst FALLBACK_SCROLL_BAR_WIDTH = 15;\n\ninterface ISmoothScrollState {\n  startTime: number;\n  origin: number;\n  target: number;\n}\n\n/**\n * Represents the viewport of a terminal, the visible area within the larger buffer of output.\n * Logic for the virtual scroll bar is included in this object.\n */\nexport class Viewport extends Disposable implements IViewport {\n  public scrollBarWidth: number = 0;\n  private _currentRowHeight: number = 0;\n  private _currentDeviceCellHeight: number = 0;\n  private _lastRecordedBufferLength: number = 0;\n  private _lastRecordedViewportHeight: number = 0;\n  private _lastRecordedBufferHeight: number = 0;\n  private _lastTouchY: number = 0;\n  private _lastScrollTop: number = 0;\n  private _activeBuffer: IBuffer;\n  private _renderDimensions: IRenderDimensions;\n\n  // Stores a partial line amount when scrolling, this is used to keep track of how much of a line\n  // is scrolled so we can \"scroll\" over partial lines and feel natural on touchpads. This is a\n  // quick fix and could have a more robust solution in place that reset the value when needed.\n  private _wheelPartialScroll: number = 0;\n\n  private _refreshAnimationFrame: number | null = null;\n  private _ignoreNextScrollEvent: boolean = false;\n  private _smoothScrollState: ISmoothScrollState = {\n    startTime: 0,\n    origin: -1,\n    target: -1\n  };\n\n  private readonly _onRequestScrollLines = this.register(new EventEmitter<{ amount: number, suppressScrollEvent: boolean }>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  constructor(\n    private readonly _viewportElement: HTMLElement,\n    private readonly _scrollArea: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService themeService: IThemeService\n  ) {\n    super();\n\n    // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.\n    // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that\n    // case, therefore we account for a standard amount to make it visible\n    this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;\n    this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._handleScroll.bind(this)));\n\n    // Track properties used in performance critical code manually to avoid using slow getters\n    this._activeBuffer = this._bufferService.buffer;\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n    this._renderDimensions = this._renderService.dimensions;\n    this.register(this._renderService.onDimensionsChange(e => this._renderDimensions = e));\n\n    this._handleThemeChange(themeService.colors);\n    this.register(themeService.onChangeColors(e => this._handleThemeChange(e)));\n    this.register(this._optionsService.onSpecificOptionChange('scrollback', () => this.syncScrollArea()));\n\n    // Perform this async to ensure the ICharSizeService is ready.\n    setTimeout(() => this.syncScrollArea());\n  }\n\n  private _handleThemeChange(colors: ReadonlyColorSet): void {\n    this._viewportElement.style.backgroundColor = colors.background.css;\n  }\n\n  public reset(): void {\n    this._currentRowHeight = 0;\n    this._currentDeviceCellHeight = 0;\n    this._lastRecordedBufferLength = 0;\n    this._lastRecordedViewportHeight = 0;\n    this._lastRecordedBufferHeight = 0;\n    this._lastTouchY = 0;\n    this._lastScrollTop = 0;\n    // Sync on next animation frame to ensure the new terminal state is used\n    this._coreBrowserService.window.requestAnimationFrame(() => this.syncScrollArea());\n  }\n\n  /**\n   * Refreshes row height, setting line-height, viewport height and scroll area height if\n   * necessary.\n   */\n  private _refresh(immediate: boolean): void {\n    if (immediate) {\n      this._innerRefresh();\n      if (this._refreshAnimationFrame !== null) {\n        this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame);\n      }\n      return;\n    }\n    if (this._refreshAnimationFrame === null) {\n      this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n    }\n  }\n\n  private _innerRefresh(): void {\n    if (this._charSizeService.height > 0) {\n      this._currentRowHeight = this._renderService.dimensions.device.cell.height / this._coreBrowserService.dpr;\n      this._currentDeviceCellHeight = this._renderService.dimensions.device.cell.height;\n      this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;\n      const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.css.canvas.height);\n      if (this._lastRecordedBufferHeight !== newBufferHeight) {\n        this._lastRecordedBufferHeight = newBufferHeight;\n        this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';\n      }\n    }\n\n    // Sync scrollTop\n    const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n    if (this._viewportElement.scrollTop !== scrollTop) {\n      // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not\n      // want this event to scroll the terminal\n      this._ignoreNextScrollEvent = true;\n      this._viewportElement.scrollTop = scrollTop;\n    }\n\n    this._refreshAnimationFrame = null;\n  }\n\n  /**\n   * Updates dimensions and synchronizes the scroll area if necessary.\n   */\n  public syncScrollArea(immediate: boolean = false): void {\n    // If buffer height changed\n    if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {\n      this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;\n      this._refresh(immediate);\n      return;\n    }\n\n    // If viewport height changed\n    if (this._lastRecordedViewportHeight !== this._renderService.dimensions.css.canvas.height) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If the buffer position doesn't match last scroll top\n    if (this._lastScrollTop !== this._activeBuffer.ydisp * this._currentRowHeight) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If row height changed\n    if (this._renderDimensions.device.cell.height !== this._currentDeviceCellHeight) {\n      this._refresh(immediate);\n      return;\n    }\n  }\n\n  /**\n   * Handles scroll events on the viewport, calculating the new viewport and requesting the\n   * terminal to scroll to it.\n   * @param ev The scroll event.\n   */\n  private _handleScroll(ev: Event): void {\n    // Record current scroll top position\n    this._lastScrollTop = this._viewportElement.scrollTop;\n\n    // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt\n    // which causes the terminal to scroll the buffer to the top\n    if (!this._viewportElement.offsetParent) {\n      return;\n    }\n\n    // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)\n    if (this._ignoreNextScrollEvent) {\n      this._ignoreNextScrollEvent = false;\n      // Still trigger the scroll so lines get refreshed\n      this._onRequestScrollLines.fire({ amount: 0, suppressScrollEvent: true });\n      return;\n    }\n\n    const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n    const diff = newRow - this._bufferService.buffer.ydisp;\n    this._onRequestScrollLines.fire({ amount: diff, suppressScrollEvent: true });\n  }\n\n  private _smoothScroll(): void {\n    // Check valid state\n    if (this._isDisposed || this._smoothScrollState.origin === -1 || this._smoothScrollState.target === -1) {\n      return;\n    }\n\n    // Calculate position complete\n    const percent = this._smoothScrollPercent();\n    this._viewportElement.scrollTop = this._smoothScrollState.origin + Math.round(percent * (this._smoothScrollState.target - this._smoothScrollState.origin));\n\n    // Continue or finish smooth scroll\n    if (percent < 1) {\n      this._coreBrowserService.window.requestAnimationFrame(() => this._smoothScroll());\n    } else {\n      this._clearSmoothScrollState();\n    }\n  }\n\n  private _smoothScrollPercent(): number {\n    if (!this._optionsService.rawOptions.smoothScrollDuration || !this._smoothScrollState.startTime) {\n      return 1;\n    }\n    return Math.max(Math.min((Date.now() - this._smoothScrollState.startTime) / this._optionsService.rawOptions.smoothScrollDuration, 1), 0);\n  }\n\n  private _clearSmoothScrollState(): void {\n    this._smoothScrollState.startTime = 0;\n    this._smoothScrollState.origin = -1;\n    this._smoothScrollState.target = -1;\n  }\n\n  /**\n   * Handles bubbling of scroll event in case the viewport has reached top or bottom\n   * @param ev The scroll event.\n   * @param amount The amount scrolled\n   */\n  private _bubbleScroll(ev: Event, amount: number): boolean {\n    const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;\n    if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||\n      (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {\n      if (ev.cancelable) {\n        ev.preventDefault();\n      }\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual\n   * scrolling to `onScroll`, this event needs to be attached manually by the consumer of\n   * `Viewport`.\n   * @param ev The mouse wheel event.\n   */\n  public handleWheel(ev: WheelEvent): boolean {\n    const amount = this._getPixelsScrolled(ev);\n    if (amount === 0) {\n      return false;\n    }\n    if (!this._optionsService.rawOptions.smoothScrollDuration) {\n      this._viewportElement.scrollTop += amount;\n    } else {\n      this._smoothScrollState.startTime = Date.now();\n      if (this._smoothScrollPercent() < 1) {\n        this._smoothScrollState.origin = this._viewportElement.scrollTop;\n        if (this._smoothScrollState.target === -1) {\n          this._smoothScrollState.target = this._viewportElement.scrollTop + amount;\n        } else {\n          this._smoothScrollState.target += amount;\n        }\n        this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0);\n        this._smoothScroll();\n      } else {\n        this._clearSmoothScrollState();\n      }\n    }\n    return this._bubbleScroll(ev, amount);\n  }\n\n  public scrollLines(disp: number): void {\n    if (disp === 0) {\n      return;\n    }\n    if (!this._optionsService.rawOptions.smoothScrollDuration) {\n      this._onRequestScrollLines.fire({ amount: disp, suppressScrollEvent: false });\n    } else {\n      const amount = disp * this._currentRowHeight;\n      this._smoothScrollState.startTime = Date.now();\n      if (this._smoothScrollPercent() < 1) {\n        this._smoothScrollState.origin = this._viewportElement.scrollTop;\n        this._smoothScrollState.target = this._smoothScrollState.origin + amount;\n        this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0);\n        this._smoothScroll();\n      } else {\n        this._clearSmoothScrollState();\n      }\n    }\n  }\n\n  private _getPixelsScrolled(ev: WheelEvent): number {\n    // Do nothing if it's not a vertical scroll event\n    if (ev.deltaY === 0 || ev.shiftKey) {\n      return 0;\n    }\n\n    // Fallback to WheelEvent.DOM_DELTA_PIXEL\n    let amount = this._applyScrollModifier(ev.deltaY, ev);\n    if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n      amount *= this._currentRowHeight;\n    } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      amount *= this._currentRowHeight * this._bufferService.rows;\n    }\n    return amount;\n  }\n\n\n  public getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement } {\n    let currentLine: string = '';\n    let cursorElement: HTMLElement | undefined;\n    const bufferElements: HTMLElement[] = [];\n    const end = endLine ?? this._bufferService.buffer.lines.length;\n    const lines = this._bufferService.buffer.lines;\n    for (let i = startLine; i < end; i++) {\n      const line = lines.get(i);\n      if (!line) {\n        continue;\n      }\n      const isWrapped = lines.get(i + 1)?.isWrapped;\n      currentLine += line.translateToString(!isWrapped);\n      if (!isWrapped || i === lines.length - 1) {\n        const div = document.createElement('div');\n        div.textContent = currentLine;\n        bufferElements.push(div);\n        if (currentLine.length > 0) {\n          cursorElement = div;\n        }\n        currentLine = '';\n      }\n    }\n    return { bufferElements, cursorElement };\n  }\n\n  /**\n   * Gets the number of pixels scrolled by the mouse event taking into account what type of delta\n   * is being used.\n   * @param ev The mouse wheel event.\n   */\n  public getLinesScrolled(ev: WheelEvent): number {\n    // Do nothing if it's not a vertical scroll event\n    if (ev.deltaY === 0 || ev.shiftKey) {\n      return 0;\n    }\n\n    // Fallback to WheelEvent.DOM_DELTA_LINE\n    let amount = this._applyScrollModifier(ev.deltaY, ev);\n    if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n      amount /= this._currentRowHeight + 0.0; // Prevent integer division\n      this._wheelPartialScroll += amount;\n      amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n      this._wheelPartialScroll %= 1;\n    } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      amount *= this._bufferService.rows;\n    }\n    return amount;\n  }\n\n  private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n    const modifier = this._optionsService.rawOptions.fastScrollModifier;\n    // Multiply the scroll speed when the modifier is down\n    if ((modifier === 'alt' && ev.altKey) ||\n      (modifier === 'ctrl' && ev.ctrlKey) ||\n      (modifier === 'shift' && ev.shiftKey)) {\n      return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n    }\n\n    return amount * this._optionsService.rawOptions.scrollSensitivity;\n  }\n\n  /**\n   * Handles the touchstart event, recording the touch occurred.\n   * @param ev The touch event.\n   */\n  public handleTouchStart(ev: TouchEvent): void {\n    this._lastTouchY = ev.touches[0].pageY;\n  }\n\n  /**\n   * Handles the touchmove event, scrolling the viewport if the position shifted.\n   * @param ev The touch event.\n   */\n  public handleTouchMove(ev: TouchEvent): boolean {\n    const deltaY = this._lastTouchY - ev.touches[0].pageY;\n    this._lastTouchY = ev.touches[0].pageY;\n    if (deltaY === 0) {\n      return false;\n    }\n    this._viewportElement.scrollTop += deltaY;\n    return this._bubbleScroll(ev, deltaY);\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IRenderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n  private readonly _container: HTMLElement;\n  private readonly _decorationElements: Map<IInternalDecoration, HTMLElement> = new Map();\n\n  private _animationFrame: number | undefined;\n  private _altBufferIsActive: boolean = false;\n  private _dimensionsChanged: boolean = false;\n\n  constructor(\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n\n    this._container = document.createElement('div');\n    this._container.classList.add('xterm-decoration-container');\n    this._screenElement.appendChild(this._container);\n\n    this.register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n    this.register(this._renderService.onDimensionsChange(() => {\n      this._dimensionsChanged = true;\n      this._queueRefresh();\n    }));\n    this.register(addDisposableDomListener(window, 'resize', () => this._queueRefresh()));\n    this.register(this._bufferService.buffers.onBufferActivate(() => {\n      this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n    }));\n    this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n    this.register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n    this.register(toDisposable(() => {\n      this._container.remove();\n      this._decorationElements.clear();\n    }));\n  }\n\n  private _queueRefresh(): void {\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._renderService.addRefreshCallback(() => {\n      this._doRefreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n\n  private _doRefreshDecorations(): void {\n    for (const decoration of this._decorationService.decorations) {\n      this._renderDecoration(decoration);\n    }\n    this._dimensionsChanged = false;\n  }\n\n  private _renderDecoration(decoration: IInternalDecoration): void {\n    this._refreshStyle(decoration);\n    if (this._dimensionsChanged) {\n      this._refreshXPosition(decoration);\n    }\n  }\n\n  private _createElement(decoration: IInternalDecoration): HTMLElement {\n    const element = document.createElement('div');\n    element.classList.add('xterm-decoration');\n    element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n    element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n    element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n    const x = decoration.options.x ?? 0;\n    if (x && x > this._bufferService.cols) {\n      // exceeded the container width, so hide\n      element.style.display = 'none';\n    }\n    this._refreshXPosition(decoration, element);\n\n    return element;\n  }\n\n  private _refreshStyle(decoration: IInternalDecoration): void {\n    const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n    if (line < 0 || line >= this._bufferService.rows) {\n      // outside of viewport\n      if (decoration.element) {\n        decoration.element.style.display = 'none';\n        decoration.onRenderEmitter.fire(decoration.element);\n      }\n    } else {\n      let element = this._decorationElements.get(decoration);\n      if (!element) {\n        element = this._createElement(decoration);\n        decoration.element = element;\n        this._decorationElements.set(decoration, element);\n        this._container.appendChild(element);\n        decoration.onDispose(() => {\n          this._decorationElements.delete(decoration);\n          element!.remove();\n        });\n      }\n      element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n      element.style.display = this._altBufferIsActive ? 'none' : 'block';\n      decoration.onRenderEmitter.fire(element);\n    }\n  }\n\n  private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n    if (!element) {\n      return;\n    }\n    const x = decoration.options.x ?? 0;\n    if ((decoration.options.anchor || 'left') === 'right') {\n      element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    } else {\n      element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    }\n  }\n\n  private _removeDecoration(decoration: IInternalDecoration): void {\n    this._decorationElements.get(decoration)?.remove();\n    this._decorationElements.delete(decoration);\n    decoration.dispose();\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from 'common/services/Services';\n\nexport interface IColorZoneStore {\n  readonly zones: IColorZone[];\n  clear(): void;\n  addDecoration(decoration: IInternalDecoration): void;\n  /**\n   * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n   * the padding they will be merged into the same zone.\n   */\n  setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n  /** Color in a format supported by canvas' fillStyle. */\n  color: string;\n  position: 'full' | 'left' | 'center' | 'right' | undefined;\n  startBufferLine: number;\n  endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n  marker: Pick<IInternalDecoration['marker'], 'line'>;\n  options: Pick<IInternalDecoration['options'], 'overviewRulerOptions'>;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n  private _zones: IColorZone[] = [];\n\n  // The zone pool is used to keep zone objects from being freed between clearing the color zone\n  // store and fetching the zones. This helps reduce GC pressure since the color zones are\n  // accumulated on potentially every scroll event.\n  private _zonePool: IColorZone[] = [];\n  private _zonePoolIndex = 0;\n\n  private _linePadding: { [position: string]: number } = {\n    full: 0,\n    left: 0,\n    center: 0,\n    right: 0\n  };\n\n  public get zones(): IColorZone[] {\n    // Trim the zone pool to free unused memory\n    this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n    return this._zones;\n  }\n\n  public clear(): void {\n    this._zones.length = 0;\n    this._zonePoolIndex = 0;\n  }\n\n  public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n    if (!decoration.options.overviewRulerOptions) {\n      return;\n    }\n    for (const z of this._zones) {\n      if (z.color === decoration.options.overviewRulerOptions.color &&\n          z.position === decoration.options.overviewRulerOptions.position) {\n        if (this._lineIntersectsZone(z, decoration.marker.line)) {\n          return;\n        }\n        if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n          this._addLineToZone(z, decoration.marker.line);\n          return;\n        }\n      }\n    }\n    // Create using zone pool if possible\n    if (this._zonePoolIndex < this._zonePool.length) {\n      this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n      this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n      this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n      this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n      this._zones.push(this._zonePool[this._zonePoolIndex++]);\n      return;\n    }\n    // Create\n    this._zones.push({\n      color: decoration.options.overviewRulerOptions.color,\n      position: decoration.options.overviewRulerOptions.position,\n      startBufferLine: decoration.marker.line,\n      endBufferLine: decoration.marker.line\n    });\n    this._zonePool.push(this._zones[this._zones.length - 1]);\n    this._zonePoolIndex++;\n  }\n\n  public setPadding(padding: { [position: string]: number }): void {\n    this._linePadding = padding;\n  }\n\n  private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n    return (\n      line >= zone.startBufferLine &&\n      line <= zone.endBufferLine\n    );\n  }\n\n  private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n    return (\n      (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n      (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n    );\n  }\n\n  private _addLineToZone(zone: IColorZone, line: number): void {\n    zone.startBufferLine = Math.min(zone.startBufferLine, line);\n    zone.endBufferLine = Math.max(zone.endBufferLine, line);\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawWidth = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawX = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n  private readonly _canvas: HTMLCanvasElement;\n  private readonly _ctx: CanvasRenderingContext2D;\n  private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n  private get _width(): number {\n    return this._optionsService.options.overviewRulerWidth || 0;\n  }\n  private _animationFrame: number | undefined;\n\n  private _shouldUpdateDimensions: boolean | undefined = true;\n  private _shouldUpdateAnchor: boolean | undefined = true;\n  private _lastKnownBufferLength: number = 0;\n\n  private _containerHeight: number | undefined;\n\n  constructor(\n    private readonly _viewportElement: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreBrowserService private readonly _coreBrowseService: ICoreBrowserService\n  ) {\n    super();\n    this._canvas = document.createElement('canvas');\n    this._canvas.classList.add('xterm-decoration-overview-ruler');\n    this._refreshCanvasDimensions();\n    this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n    const ctx = this._canvas.getContext('2d');\n    if (!ctx) {\n      throw new Error('Ctx cannot be null');\n    } else {\n      this._ctx = ctx;\n    }\n    this._registerDecorationListeners();\n    this._registerBufferChangeListeners();\n    this._registerDimensionChangeListeners();\n    this.register(toDisposable(() => {\n      this._canvas?.remove();\n    }));\n  }\n\n  /**\n   * On decoration add or remove, redraw\n   */\n  private _registerDecorationListeners(): void {\n    this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n    this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n  }\n\n  /**\n   * On buffer change, redraw\n   * and hide the canvas if the alt buffer is active\n   */\n  private _registerBufferChangeListeners(): void {\n    this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n    this.register(this._bufferService.buffers.onBufferActivate(() => {\n      this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n    }));\n    this.register(this._bufferService.onScroll(() => {\n      if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n        this._refreshDrawHeightConstants();\n        this._refreshColorZonePadding();\n      }\n    }));\n  }\n  /**\n   * On dimension change, update canvas dimensions\n   * and then redraw\n   */\n  private _registerDimensionChangeListeners(): void {\n    // container height changed\n    this.register(this._renderService.onRender((): void => {\n      if (!this._containerHeight || this._containerHeight !== this._screenElement.clientHeight) {\n        this._queueRefresh(true);\n        this._containerHeight = this._screenElement.clientHeight;\n      }\n    }));\n    // overview ruler width changed\n    this.register(this._optionsService.onSpecificOptionChange('overviewRulerWidth', () => this._queueRefresh(true)));\n    // device pixel ratio changed\n    this.register(addDisposableDomListener(this._coreBrowseService.window, 'resize', () => this._queueRefresh(true)));\n    // set the canvas dimensions\n    this._queueRefresh(true);\n  }\n\n  private _refreshDrawConstants(): void {\n    // width\n    const outerWidth = Math.floor(this._canvas.width / 3);\n    const innerWidth = Math.ceil(this._canvas.width / 3);\n    drawWidth.full = this._canvas.width;\n    drawWidth.left = outerWidth;\n    drawWidth.center = innerWidth;\n    drawWidth.right = outerWidth;\n    // height\n    this._refreshDrawHeightConstants();\n    // x\n    drawX.full = 0;\n    drawX.left = 0;\n    drawX.center = drawWidth.left;\n    drawX.right = drawWidth.left + drawWidth.center;\n  }\n\n  private _refreshDrawHeightConstants(): void {\n    drawHeight.full = Math.round(2 * this._coreBrowseService.dpr);\n    // Calculate actual pixels per line\n    const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n    // Clamp actual pixels within a range\n    const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowseService.dpr);\n    drawHeight.left = nonFullHeight;\n    drawHeight.center = nonFullHeight;\n    drawHeight.right = nonFullHeight;\n  }\n\n  private _refreshColorZonePadding(): void {\n    this._colorZoneStore.setPadding({\n      full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n      left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n      center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n      right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n    });\n    this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n  }\n\n  private _refreshCanvasDimensions(): void {\n    this._canvas.style.width = `${this._width}px`;\n    this._canvas.width = Math.round(this._width * this._coreBrowseService.dpr);\n    this._canvas.style.height = `${this._screenElement.clientHeight}px`;\n    this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowseService.dpr);\n    this._refreshDrawConstants();\n    this._refreshColorZonePadding();\n  }\n\n  private _refreshDecorations(): void {\n    if (this._shouldUpdateDimensions) {\n      this._refreshCanvasDimensions();\n    }\n    this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    this._colorZoneStore.clear();\n    for (const decoration of this._decorationService.decorations) {\n      this._colorZoneStore.addDecoration(decoration);\n    }\n    this._ctx.lineWidth = 1;\n    const zones = this._colorZoneStore.zones;\n    for (const zone of zones) {\n      if (zone.position !== 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    for (const zone of zones) {\n      if (zone.position === 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    this._shouldUpdateDimensions = false;\n    this._shouldUpdateAnchor = false;\n  }\n\n  private _renderColorZone(zone: IColorZone): void {\n    this._ctx.fillStyle = zone.color;\n    this._ctx.fillRect(\n      /* x */ drawX[zone.position || 'full'],\n      /* y */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n      ),\n      /* w */ drawWidth[zone.position || 'full'],\n      /* h */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n      )\n    );\n  }\n\n  private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n    this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n    this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._coreBrowseService.window.requestAnimationFrame(() => {\n      this._refreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\nimport { C0 } from 'common/data/EscapeSequences';\n\ninterface IPosition {\n  start: number;\n  end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n  /**\n   * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n   * IME. This variable determines whether the compositionText should be displayed on the UI.\n   */\n  private _isComposing: boolean;\n  public get isComposing(): boolean { return this._isComposing; }\n\n  /**\n   * The position within the input textarea's value of the current composition.\n   */\n  private _compositionPosition: IPosition;\n\n  /**\n   * Whether a composition is in the process of being sent, setting this to false will cancel any\n   * in-progress composition.\n   */\n  private _isSendingComposition: boolean;\n\n  /**\n   * Data already sent due to keydown event.\n   */\n  private _dataAlreadySent: string;\n\n  constructor(\n    private readonly _textarea: HTMLTextAreaElement,\n    private readonly _compositionView: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    this._isComposing = false;\n    this._isSendingComposition = false;\n    this._compositionPosition = { start: 0, end: 0 };\n    this._dataAlreadySent = '';\n  }\n\n  /**\n   * Handles the compositionstart event, activating the composition view.\n   */\n  public compositionstart(): void {\n    this._isComposing = true;\n    this._compositionPosition.start = this._textarea.value.length;\n    this._compositionView.textContent = '';\n    this._dataAlreadySent = '';\n    this._compositionView.classList.add('active');\n  }\n\n  /**\n   * Handles the compositionupdate event, updating the composition view.\n   * @param ev The event.\n   */\n  public compositionupdate(ev: Pick<CompositionEvent, 'data'>): void {\n    this._compositionView.textContent = ev.data;\n    this.updateCompositionElements();\n    setTimeout(() => {\n      this._compositionPosition.end = this._textarea.value.length;\n    }, 0);\n  }\n\n  /**\n   * Handles the compositionend event, hiding the composition view and sending the composition to\n   * the handler.\n   */\n  public compositionend(): void {\n    this._finalizeComposition(true);\n  }\n\n  /**\n   * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n   * @param ev The keydown event.\n   * @returns Whether the Terminal should continue processing the keydown event.\n   */\n  public keydown(ev: KeyboardEvent): boolean {\n    if (this._isComposing || this._isSendingComposition) {\n      if (ev.keyCode === 229) {\n        // Continue composing if the keyCode is the \"composition character\"\n        return false;\n      }\n      if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n        // Continue composing if the keyCode is a modifier key\n        return false;\n      }\n      // Finish composition immediately. This is mainly here for the case where enter is\n      // pressed and the handler needs to be triggered before the command is executed.\n      this._finalizeComposition(false);\n    }\n\n    if (ev.keyCode === 229) {\n      // If the \"composition character\" is used but gets to this point it means a non-composition\n      // character (eg. numbers and punctuation) was pressed when the IME was active.\n      this._handleAnyTextareaChanges();\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Finalizes the composition, resuming regular input actions. This is called when a composition\n   * is ending.\n   * @param waitForPropagation Whether to wait for events to propagate before sending\n   *   the input. This should be false if a non-composition keystroke is entered before the\n   *   compositionend event is triggered, such as enter, so that the composition is sent before\n   *   the command is executed.\n   */\n  private _finalizeComposition(waitForPropagation: boolean): void {\n    this._compositionView.classList.remove('active');\n    this._isComposing = false;\n\n    if (!waitForPropagation) {\n      // Cancel any delayed composition send requests and send the input immediately.\n      this._isSendingComposition = false;\n      const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n      this._coreService.triggerDataEvent(input, true);\n    } else {\n      // Make a deep copy of the composition position here as a new compositionstart event may\n      // fire before the setTimeout executes.\n      const currentCompositionPosition = {\n        start: this._compositionPosition.start,\n        end: this._compositionPosition.end\n      };\n\n      // Since composition* events happen before the changes take place in the textarea on most\n      // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n      // complete. This ensures the correct character is retrieved.\n      // This solution was used because:\n      // - The compositionend event's data property is unreliable, at least on Chromium\n      // - The last compositionupdate event's data property does not always accurately describe\n      //   the character, a counter example being Korean where an ending consonsant can move to\n      //   the following character if the following input is a vowel.\n      this._isSendingComposition = true;\n      setTimeout(() => {\n        // Ensure that the input has not already been sent\n        if (this._isSendingComposition) {\n          this._isSendingComposition = false;\n          let input;\n          // Add length of data already sent due to keydown event,\n          // otherwise input characters can be duplicated. (Issue #3191)\n          currentCompositionPosition.start += this._dataAlreadySent.length;\n          if (this._isComposing) {\n            // Use the end position to get the string if a new composition has started.\n            input = this._textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);\n          } else {\n            // Don't use the end position here in order to pick up any characters after the\n            // composition has finished, for example when typing a non-composition character\n            // (eg. 2) after a composition character.\n            input = this._textarea.value.substring(currentCompositionPosition.start);\n          }\n          if (input.length > 0) {\n            this._coreService.triggerDataEvent(input, true);\n          }\n        }\n      }, 0);\n    }\n  }\n\n  /**\n   * Apply any changes made to the textarea after the current event chain is allowed to complete.\n   * This should be called when not currently composing but a keydown event with the \"composition\n   * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n   * IME is active.\n   */\n  private _handleAnyTextareaChanges(): void {\n    const oldValue = this._textarea.value;\n    setTimeout(() => {\n      // Ignore if a composition has started since the timeout\n      if (!this._isComposing) {\n        const newValue = this._textarea.value;\n\n        const diff = newValue.replace(oldValue, '');\n\n        this._dataAlreadySent = diff;\n\n        if (newValue.length > oldValue.length) {\n          this._coreService.triggerDataEvent(diff, true);\n        } else if (newValue.length < oldValue.length) {\n          this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n        } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n          this._coreService.triggerDataEvent(newValue, true);\n        }\n\n      }\n    }, 0);\n  }\n\n  /**\n   * Positions the composition view on top of the cursor and the textarea just below it (so the\n   * IME helper dialog is positioned correctly).\n   * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n   *   necessary as the IME events across browsers are not consistently triggered.\n   */\n  public updateCompositionElements(dontRecurse?: boolean): void {\n    if (!this._isComposing) {\n      return;\n    }\n\n    if (this._bufferService.buffer.isCursorInViewport) {\n      const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n      const cellHeight = this._renderService.dimensions.css.cell.height;\n      const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n      const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n      this._compositionView.style.left = cursorLeft + 'px';\n      this._compositionView.style.top = cursorTop + 'px';\n      this._compositionView.style.height = cellHeight + 'px';\n      this._compositionView.style.lineHeight = cellHeight + 'px';\n      this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n      this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n      // Sync the textarea to the exact position of the composition view so the IME knows where the\n      // text is.\n      const compositionViewBounds = this._compositionView.getBoundingClientRect();\n      this._textarea.style.left = cursorLeft + 'px';\n      this._textarea.style.top = cursorTop + 'px';\n      // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n      this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n      this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n      this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n    }\n\n    if (!dontRecurse) {\n      setTimeout(() => this.updateCompositionElements(true), 0);\n    }\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n  const rect = element.getBoundingClientRect();\n  const elementStyle = window.getComputedStyle(element);\n  const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'));\n  const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'));\n  return [\n    event.clientX - rect.left - leftPadding,\n    event.clientY - rect.top - topPadding\n  ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick<Window, 'getComputedStyle'>, event: Pick<MouseEvent, 'clientX' | 'clientY'>, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n  // Coordinates cannot be measured if there are no valid\n  if (!hasValidCharSize) {\n    return undefined;\n  }\n\n  const coords = getCoordsRelativeToElement(window, event, element);\n  if (!coords) {\n    return undefined;\n  }\n\n  coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n  coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n  // Ensure coordinates are within the terminal viewport. Note that selections\n  // need an addition point of precision to cover the end point (as characters\n  // cover half of one char and half of the next).\n  coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n  coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n  return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n  UP = 'A',\n  DOWN = 'B',\n  RIGHT = 'C',\n  LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startX = bufferService.buffer.x;\n  const startY = bufferService.buffer.y;\n\n  // The alt buffer should try to navigate between rows\n  if (!bufferService.buffer.hasScrollback) {\n    return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n      moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n      moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n  }\n\n  // Only move horizontally for the normal buffer\n  let direction;\n  if (startY === targetY) {\n    direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n    return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n  }\n  direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n  const rowDifference = Math.abs(startY - targetY);\n  const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n    (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n    colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n  return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n  return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n  return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n    return '';\n  }\n  return repeat(bufferLine(\n    startX, startY, startX,\n    startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n  ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n  return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  let startRow;\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  const endRow = targetY;\n  const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n  return repeat(bufferLine(\n    startX, startRow, targetX, endRow,\n    direction === Direction.RIGHT, bufferService\n  ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n  let wrappedRows = 0;\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n    const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n    const line = bufferService.buffer.lines.get(startRow + (direction * i));\n    if (line?.isWrapped) {\n      wrappedRows++;\n    }\n  }\n\n  return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n  let rowCount = 0;\n  let line = bufferService.buffer.lines.get(currentRow);\n  let lineWraps = line?.isWrapped;\n\n  while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n    rowCount++;\n    line = bufferService.buffer.lines.get(--currentRow);\n    lineWraps = line?.isWrapped;\n  }\n\n  return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n  let startRow;\n  if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  if ((startX < targetX &&\n    startRow <= targetY) || // down/right or same y/right\n    (startX >= targetX &&\n    startRow < targetY)) {  // down/left or same y/left\n    return Direction.RIGHT;\n  }\n  return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n  return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n  startCol: number,\n  startRow: number,\n  endCol: number,\n  endRow: number,\n  forward: boolean,\n  bufferService: IBufferService\n): string {\n  let currentCol = startCol;\n  let currentRow = startRow;\n  let bufferStr = '';\n\n  while (currentCol !== endCol || currentRow !== endRow) {\n    currentCol += forward ? 1 : -1;\n\n    if (forward && currentCol > bufferService.cols - 1) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, startCol, currentCol\n      );\n      currentCol = 0;\n      startCol = 0;\n      currentRow++;\n    } else if (!forward && currentCol < 0) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, 0, startCol + 1\n      );\n      currentCol = bufferService.cols - 1;\n      startCol = currentCol;\n      currentRow--;\n    }\n  }\n\n  return bufferStr + bufferService.buffer.translateBufferLineToString(\n    currentRow, false, startCol, currentCol\n  );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n  const mod =  applicationCursor ? 'O' : '[';\n  return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n  count = Math.floor(count);\n  let rpt = '';\n  for (let i = 0; i < count; i++) {\n    rpt += str;\n  }\n  return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent, ReadonlyColorSet } from 'browser/Types';\nimport { color } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IInstantiationService, IOptionsService } from 'common/services/Services';\n\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\n\nlet nextTerminalId = 1;\n\n\n/**\n * A fallback renderer for when canvas is slow. This is not meant to be\n * particularly fast or feature complete, more just stable and usable for when\n * canvas is not an option.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n  private _rowFactory: DomRendererRowFactory;\n  private _terminalClass: number = nextTerminalId++;\n\n  private _themeStyleElement!: HTMLStyleElement;\n  private _dimensionsStyleElement!: HTMLStyleElement;\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[] = [];\n  private _selectionContainer: HTMLElement;\n  private _widthCache: WidthCache;\n\n  public dimensions: IRenderDimensions;\n\n  public readonly onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>()).event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _viewportElement: HTMLElement,\n    private readonly _linkifier2: ILinkifier2,\n    @IInstantiationService instantiationService: IInstantiationService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {\n    super();\n    this._rowContainer = document.createElement('div');\n    this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n    this._rowContainer.style.lineHeight = 'normal';\n    this._rowContainer.setAttribute('aria-hidden', 'true');\n    this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n    this._selectionContainer = document.createElement('div');\n    this._selectionContainer.classList.add(SELECTION_CLASS);\n    this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n    this.dimensions = createRenderDimensions();\n    this._updateDimensions();\n    this.register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this.register(this._themeService.onChangeColors(e => this._injectCss(e)));\n    this._injectCss(this._themeService.colors);\n\n    this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n    this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n    this._screenElement.appendChild(this._rowContainer);\n    this._screenElement.appendChild(this._selectionContainer);\n\n    this.register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n    this.register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n    this.register(toDisposable(() => {\n      this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n      // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n      // https://github.com/xtermjs/xterm.js/issues/2960\n      this._rowContainer.remove();\n      this._selectionContainer.remove();\n      this._widthCache.dispose();\n      this._themeStyleElement.remove();\n      this._dimensionsStyleElement.remove();\n    }));\n\n    this._widthCache = new WidthCache(document);\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  private _updateDimensions(): void {\n    const dpr = this._coreBrowserService.dpr;\n    this.dimensions.device.char.width = this._charSizeService.width * dpr;\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n    this.dimensions.device.char.left = 0;\n    this.dimensions.device.char.top = 0;\n    this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n    this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n    this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n    this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n    for (const element of this._rowElements) {\n      element.style.width = `${this.dimensions.css.canvas.width}px`;\n      element.style.height = `${this.dimensions.css.cell.height}px`;\n      element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n      // Make sure rows don't overflow onto following row\n      element.style.overflow = 'hidden';\n    }\n\n    if (!this._dimensionsStyleElement) {\n      this._dimensionsStyleElement = document.createElement('style');\n      this._screenElement.appendChild(this._dimensionsStyleElement);\n    }\n\n    const styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n      ` display: inline-block;` +   // TODO: find workaround for inline-block (creates ~20% render penalty)\n      ` height: 100%;` +\n      ` vertical-align: top;` +\n      `}`;\n\n    this._dimensionsStyleElement.textContent = styles;\n\n    this._selectionContainer.style.height = this._viewportElement.style.height;\n    this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n  }\n\n  private _injectCss(colors: ReadonlyColorSet): void {\n    if (!this._themeStyleElement) {\n      this._themeStyleElement = document.createElement('style');\n      this._screenElement.appendChild(this._themeStyleElement);\n    }\n\n    // Base CSS\n    let styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n      ` color: ${colors.foreground.css};` +\n      ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n      ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n      ` font-kerning: none;` +\n      ` white-space: pre` +\n      `}`;\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .xterm-dim {` +\n      ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n      `}`;\n    // Text styles\n    styles +=\n      `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n      ` font-style: italic;` +\n      `}`;\n    // Blink animation\n    styles +=\n      `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +\n      ` 50% {` +\n      `  border-bottom-style: hidden;` +\n      ` }` +\n      `}`;\n    styles +=\n      `@keyframes blink_block` + `_` + this._terminalClass + ` {` +\n      ` 0% {` +\n      `  background-color: ${colors.cursor.css};` +\n      `  color: ${colors.cursorAccent.css};` +\n      ` }` +\n      ` 50% {` +\n      `  background-color: inherit;` +\n      `  color: ${colors.cursor.css};` +\n      ` }` +\n      `}`;\n    // Cursor\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}:not(.${RowCss.CURSOR_STYLE_BLOCK_CLASS}) {` +\n      ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` background-color: ${colors.cursor.css};` +\n      ` color: ${colors.cursorAccent.css};` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n      ` outline: 1px solid ${colors.cursor.css};` +\n      ` outline-offset: -1px;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n      ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n      ` border-bottom: 1px ${colors.cursor.css};` +\n      ` border-bottom-style: solid;` +\n      ` height: calc(100% - 1px);` +\n      `}`;\n    // Selection\n    styles +=\n      `${this._terminalSelector} .${SELECTION_CLASS} {` +\n      ` position: absolute;` +\n      ` top: 0;` +\n      ` left: 0;` +\n      ` z-index: 1;` +\n      ` pointer-events: none;` +\n      `}` +\n      `${this._terminalSelector}.focus .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n      `}` +\n      `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n      `}`;\n    // Colors\n    for (const [i, c] of colors.ansi.entries()) {\n      styles +=\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n        `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n    }\n    styles +=\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n      `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n    this._themeStyleElement.textContent = styles;\n  }\n\n  /**\n   * default letter spacing\n   * Due to rounding issues in dimensions dpr calc glyph might render\n   * slightly too wide or too narrow. The method corrects the stacking offsets\n   * by applying a default letter-spacing for all chars.\n   * The value gets passed to the row factory to avoid setting this value again\n   * (render speedup is roughly 10%).\n   */\n  private _setDefaultSpacing(): void {\n    // measure same char as in CharSizeService to get the base deviation\n    const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n    this._rowContainer.style.letterSpacing = `${spacing}px`;\n    this._rowFactory.defaultSpacing = spacing;\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  private _refreshRowElements(cols: number, rows: number): void {\n    // Add missing elements\n    for (let i = this._rowElements.length; i <= rows; i++) {\n      const row = document.createElement('div');\n      this._rowContainer.appendChild(row);\n      this._rowElements.push(row);\n    }\n    // Remove excess elements\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    this._refreshRowElements(cols, rows);\n    this._updateDimensions();\n  }\n\n  public handleCharSizeChanged(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  public handleBlur(): void {\n    this._rowContainer.classList.remove(FOCUS_CLASS);\n  }\n\n  public handleFocus(): void {\n    this._rowContainer.classList.add(FOCUS_CLASS);\n    this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    // Remove all selections\n    this._selectionContainer.replaceChildren();\n    this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n    this.renderRows(0, this._bufferService.rows - 1);\n\n    // Selection does not exist\n    if (!start || !end) {\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n    const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n      return;\n    }\n\n    // Create the selections\n    const documentFragment = document.createDocumentFragment();\n\n    if (columnSelectMode) {\n      const isXFlipped = start[0] > end[0];\n      documentFragment.appendChild(\n        this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n      );\n    } else {\n      // Draw first row\n      const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n      const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n      documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n      // Draw middle rows\n      const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n      documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n      // Draw final row\n      if (viewportCappedStartRow !== viewportCappedEndRow) {\n        // Only draw viewportEndRow if it's not the same as viewporttartRow\n        const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n        documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));\n      }\n    }\n    this._selectionContainer.appendChild(documentFragment);\n  }\n\n  /**\n   * Creates a selection element at the specified position.\n   * @param row The row of the selection.\n   * @param colStart The start column.\n   * @param colEnd The end columns.\n   */\n  private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n    const element = document.createElement('div');\n    element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n    element.style.top = `${row * this.dimensions.css.cell.height}px`;\n    element.style.left = `${colStart * this.dimensions.css.cell.width}px`;\n    element.style.width = `${this.dimensions.css.cell.width * (colEnd - colStart)}px`;\n    return element;\n  }\n\n  public handleCursorMove(): void {\n    // No-op, the cursor is drawn when rows are drawn\n  }\n\n  private _handleOptionsChanged(): void {\n    // Force a refresh\n    this._updateDimensions();\n    // Refresh CSS\n    this._injectCss(this._themeService.colors);\n    // update spacing cache\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  public clear(): void {\n    for (const e of this._rowElements) {\n      /**\n       * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n       * `@testing-library/react`\n       *\n       * references:\n       * - https://github.com/testing-library/react-testing-library/issues/1146\n       * - https://github.com/jsdom/jsdom/issues/1245\n       */\n      e.replaceChildren();\n    }\n  }\n\n  public renderRows(start: number, end: number): void {\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n    const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n\n    for (let y = start; y <= end; y++) {\n      const row = y + buffer.ydisp;\n      const rowElement = this._rowElements[y];\n      const lineData = buffer.lines.get(row);\n      if (!rowElement || !lineData) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          lineData,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          -1,\n          -1\n        )\n      );\n    }\n  }\n\n  private get _terminalSelector(): string {\n    return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n  }\n\n  private _handleLinkHover(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n  }\n\n  private _handleLinkLeave(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n  }\n\n  private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n    /**\n     * NOTE: The linkifier may send out of viewport y-values if:\n     * - negative y-value: the link started at a higher line\n     * - y-value >= maxY: the link ends at a line below viewport\n     *\n     * For negative y-values we can simply adjust x = 0,\n     * as higher up link start means, that everything from\n     * (0,0) is a link under top-down-left-right char progression\n     *\n     * Additionally there might be a small chance of out-of-sync x|y-values\n     * from a race condition of render updates vs. link event handler execution:\n     * - (sync) resize: chances terminal buffer in sync, schedules render update async\n     * - (async) link handler race condition: new buffer metrics, but still on old render state\n     * - (async) render update: brings term metrics and render state back in sync\n     */\n    // clip coords into viewport\n    if (y < 0) x = 0;\n    if (y2 < 0) x2 = 0;\n    const maxY = this._bufferService.rows - 1;\n    y = Math.max(Math.min(y, maxY), 0);\n    y2 = Math.max(Math.min(y2, maxY), 0);\n\n    cols = Math.min(cols, this._bufferService.cols);\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, cols - 1);\n    const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n\n    // refresh rows within link range\n    for (let i = y; i <= y2; ++i) {\n      const row = i + buffer.ydisp;\n      const rowElement = this._rowElements[i];\n      const bufferline = buffer.lines.get(row);\n      if (!rowElement || !bufferline) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          bufferline,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          enabled ? (i === y ? x : 0) : -1,\n          enabled ? ((i === y2 ? x2 : cols) - 1) : -1\n        )\n      );\n    }\n  }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, IColor } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { color, rgba } from 'common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\nimport { excludeFromContrastRatioDemands } from 'browser/renderer/shared/RendererUtils';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { IColorContrastCache } from 'browser/Types';\n\n\nexport const enum RowCss {\n  BOLD_CLASS = 'xterm-bold',\n  DIM_CLASS = 'xterm-dim',\n  ITALIC_CLASS = 'xterm-italic',\n  UNDERLINE_CLASS = 'xterm-underline',\n  OVERLINE_CLASS = 'xterm-overline',\n  STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n  CURSOR_CLASS = 'xterm-cursor',\n  CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n  CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n  CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n  CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n  CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n  private _workCell: CellData = new CellData();\n\n  private _selectionStart: [number, number] | undefined;\n  private _selectionEnd: [number, number] | undefined;\n  private _columnSelectMode: boolean = false;\n\n  public defaultSpacing = 0;\n\n  constructor(\n    private readonly _document: Document,\n    @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {}\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionStart = start;\n    this._selectionEnd = end;\n    this._columnSelectMode = columnSelectMode;\n  }\n\n  public createRow(\n    lineData: IBufferLine,\n    row: number,\n    isCursorRow: boolean,\n    cursorStyle: string | undefined,\n    cursorInactiveStyle: string | undefined,\n    cursorX: number,\n    cursorBlink: boolean,\n    cellWidth: number,\n    widthCache: WidthCache,\n    linkStart: number,\n    linkEnd: number\n  ): HTMLSpanElement[] {\n\n    const elements: HTMLSpanElement[] = [];\n    const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n    const colors = this._themeService.colors;\n\n    let lineLength = lineData.getNoBgTrimmedLength();\n    if (isCursorRow && lineLength < cursorX + 1) {\n      lineLength = cursorX + 1;\n    }\n\n    let charElement: HTMLSpanElement | undefined;\n    let cellAmount = 0;\n    let text = '';\n    let oldBg = 0;\n    let oldFg = 0;\n    let oldExt = 0;\n    let oldLinkHover: number | boolean = false;\n    let oldSpacing = 0;\n    let oldIsInSelection: boolean = false;\n    let spacing = 0;\n    const classes: string[] = [];\n\n    const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n    for (let x = 0; x < lineLength; x++) {\n      lineData.loadCell(x, this._workCell);\n      let width = this._workCell.getWidth();\n\n      // The character to the left is a wide character, drawing is owned by the char at x-1\n      if (width === 0) {\n        continue;\n      }\n\n      // If true, indicates that the current character(s) to draw were joined.\n      let isJoined = false;\n      let lastCharX = x;\n\n      // Process any joined character ranges as needed. Because of how the\n      // ranges are produced, we know that they are valid for the characters\n      // and attributes of our input.\n      let cell = this._workCell;\n      if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n        isJoined = true;\n        const range = joinedRanges.shift()!;\n\n        // We already know the exact start and end column of the joined range,\n        // so we get the string and width representing it directly\n        cell = new JoinedCellData(\n          this._workCell,\n          lineData.translateToString(true, range[0], range[1]),\n          range[1] - range[0]\n        );\n\n        // Skip over the cells occupied by this range in the loop\n        lastCharX = range[1] - 1;\n\n        // Recalculate width\n        width = cell.getWidth();\n      }\n\n      const isInSelection = this._isCellInSelection(x, row);\n      const isCursorCell = isCursorRow && x === cursorX;\n      const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n\n      let isDecorated = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        isDecorated = true;\n      });\n\n      // get chars to render for this cell\n      let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n      if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n        chars = '\\xa0';\n      }\n\n      // lookup char render width and calc spacing\n      spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n      if (!charElement) {\n        charElement = this._document.createElement('span');\n      } else {\n        /**\n         * chars can only be merged on existing span if:\n         * - existing span only contains mergeable chars (cellAmount != 0)\n         * - bg did not change (or both are in selection)\n         * - fg did not change (or both are in selection and selection fg is set)\n         * - ext did not change\n         * - underline from hover state did not change\n         * - cell content renders to same letter-spacing\n         * - cell is not cursor\n         */\n        if (\n          cellAmount\n          && (\n            (isInSelection && oldIsInSelection)\n            || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n          )\n          && (\n            (isInSelection && oldIsInSelection && colors.selectionForeground)\n            || cell.fg === oldFg\n          )\n          && cell.extended.ext === oldExt\n          && isLinkHover === oldLinkHover\n          && spacing === oldSpacing\n          && !isCursorCell\n          && !isJoined\n          && !isDecorated\n        ) {\n          // no span alterations, thus only account chars skipping all code below\n          text += chars;\n          cellAmount++;\n          continue;\n        } else {\n          /**\n           * cannot merge:\n           * - apply left-over text to old span\n           * - create new span, reset state holders cellAmount & text\n           */\n          if (cellAmount) {\n            charElement.textContent = text;\n          }\n          charElement = this._document.createElement('span');\n          cellAmount = 0;\n          text = '';\n        }\n      }\n      // preserve conditions for next merger eval round\n      oldBg = cell.bg;\n      oldFg = cell.fg;\n      oldExt = cell.extended.ext;\n      oldLinkHover = isLinkHover;\n      oldSpacing = spacing;\n      oldIsInSelection = isInSelection;\n\n      if (isJoined) {\n        // The DOM renderer colors the background of the cursor but for ligatures all cells are\n        // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n        // the cursor looks the same when on any character of the ligature though\n        if (cursorX >= x && cursorX <= lastCharX) {\n          cursorX = x;\n        }\n      }\n\n      if (!this._coreService.isCursorHidden && isCursorCell) {\n        classes.push(RowCss.CURSOR_CLASS);\n        if (this._coreBrowserService.isFocused) {\n          if (cursorBlink) {\n            classes.push(RowCss.CURSOR_BLINK_CLASS);\n          }\n          classes.push(\n            cursorStyle === 'bar'\n              ? RowCss.CURSOR_STYLE_BAR_CLASS\n              : cursorStyle === 'underline'\n                ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n                : RowCss.CURSOR_STYLE_BLOCK_CLASS\n          );\n        } else {\n          if (cursorInactiveStyle) {\n            switch (cursorInactiveStyle) {\n              case 'outline':\n                classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n                break;\n              case 'block':\n                classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n                break;\n              case 'bar':\n                classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n                break;\n              case 'underline':\n                classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n                break;\n              default:\n                break;\n            }\n          }\n        }\n      }\n\n      if (cell.isBold()) {\n        classes.push(RowCss.BOLD_CLASS);\n      }\n\n      if (cell.isItalic()) {\n        classes.push(RowCss.ITALIC_CLASS);\n      }\n\n      if (cell.isDim()) {\n        classes.push(RowCss.DIM_CLASS);\n      }\n\n      if (cell.isInvisible()) {\n        text = WHITESPACE_CELL_CHAR;\n      } else {\n        text = cell.getChars() || WHITESPACE_CELL_CHAR;\n      }\n\n      if (cell.isUnderline()) {\n        classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n        if (!cell.isUnderlineColorDefault()) {\n          if (cell.isUnderlineColorRGB()) {\n            charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n          } else {\n            let fg = cell.getUnderlineColor();\n            if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n              fg += 8;\n            }\n            charElement.style.textDecorationColor = colors.ansi[fg].css;\n          }\n        }\n      }\n\n      if (cell.isOverline()) {\n        classes.push(RowCss.OVERLINE_CLASS);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n      }\n\n      if (cell.isStrikethrough()) {\n        classes.push(RowCss.STRIKETHROUGH_CLASS);\n      }\n\n      // apply link hover underline late, effectively overrides any previous text-decoration\n      // settings\n      if (isLinkHover) {\n        charElement.style.textDecoration = 'underline';\n      }\n\n      let fg = cell.getFgColor();\n      let fgColorMode = cell.getFgColorMode();\n      let bg = cell.getBgColor();\n      let bgColorMode = cell.getBgColorMode();\n      const isInverse = !!cell.isInverse();\n      if (isInverse) {\n        const temp = fg;\n        fg = bg;\n        bg = temp;\n        const temp2 = fgColorMode;\n        fgColorMode = bgColorMode;\n        bgColorMode = temp2;\n      }\n\n      // Apply any decoration foreground/background overrides, this must happen after inverse has\n      // been applied\n      let bgOverride: IColor | undefined;\n      let fgOverride: IColor | undefined;\n      let isTop = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        if (d.options.layer !== 'top' && isTop) {\n          return;\n        }\n        if (d.backgroundColorRGB) {\n          bgColorMode = Attributes.CM_RGB;\n          bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          bgOverride = d.backgroundColorRGB;\n        }\n        if (d.foregroundColorRGB) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          fgOverride = d.foregroundColorRGB;\n        }\n        isTop = d.options.layer === 'top';\n      });\n\n      // Apply selection\n      if (!isTop && isInSelection) {\n        // If in the selection, force the element to be above the selection to improve contrast and\n        // support opaque selections. The applies background is not actually needed here as\n        // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n        // contrast ratio\n        bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n        bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n        bgColorMode = Attributes.CM_RGB;\n        // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n        // ensure text is drawn above the selection.\n        isTop = true;\n        // Apply selection foreground if applicable\n        if (colors.selectionForeground) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n          fgOverride = colors.selectionForeground;\n        }\n      }\n\n      // If it's a top decoration, render above the selection\n      if (isTop) {\n        classes.push('xterm-decoration-top');\n      }\n\n      // Background\n      let resolvedBg: IColor;\n      switch (bgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          resolvedBg = colors.ansi[bg];\n          classes.push(`xterm-bg-${bg}`);\n          break;\n        case Attributes.CM_RGB:\n          resolvedBg = rgba.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n          this._addStyle(charElement, `background-color:#${padStart((bg >>> 0).toString(16), '0', 6)}`);\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (isInverse) {\n            resolvedBg = colors.foreground;\n            classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n          } else {\n            resolvedBg = colors.background;\n          }\n      }\n\n      // If there is no background override by now it's the original color, so apply dim if needed\n      if (!bgOverride) {\n        if (cell.isDim()) {\n          bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n        }\n      }\n\n      // Foreground\n      switch (fgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n            fg += 8;\n          }\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n            classes.push(`xterm-fg-${fg}`);\n          }\n          break;\n        case Attributes.CM_RGB:\n          const color = rgba.toColor(\n            (fg >> 16) & 0xFF,\n            (fg >>  8) & 0xFF,\n            (fg      ) & 0xFF\n          );\n          if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n            this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`);\n          }\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, undefined)) {\n            if (isInverse) {\n              classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n            }\n          }\n      }\n\n      // apply CSS classes\n      // slightly faster than using classList by omitting\n      // checks for doubled entries (code above should not have doublets)\n      if (classes.length) {\n        charElement.className = classes.join(' ');\n        classes.length = 0;\n      }\n\n      // exclude conditions for cell merging - never merge these\n      if (!isCursorCell && !isJoined && !isDecorated) {\n        cellAmount++;\n      } else {\n        charElement.textContent = text;\n      }\n      // apply letter-spacing rule\n      if (spacing !== this.defaultSpacing) {\n        charElement.style.letterSpacing = `${spacing}px`;\n      }\n\n      elements.push(charElement);\n      x = lastCharX;\n    }\n\n    // postfix text of last merged span\n    if (charElement && cellAmount) {\n      charElement.textContent = text;\n    }\n\n    return elements;\n  }\n\n  private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n    if (this._optionsService.rawOptions.minimumContrastRatio === 1 || excludeFromContrastRatioDemands(cell.getCode())) {\n      return false;\n    }\n\n    // Try get from cache first, only use the cache when there are no decoration overrides\n    const cache = this._getContrastCache(cell);\n    let adjustedColor: IColor | undefined | null = undefined;\n    if (!bgOverride && !fgOverride) {\n      adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n    }\n\n    // Calculate and store in cache\n    if (adjustedColor === undefined) {\n      // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n      // non-dim cells\n      const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n      adjustedColor = color.ensureContrastRatio(bgOverride || bg, fgOverride || fg, ratio);\n      cache.setColor((bgOverride || bg).rgba, (fgOverride || fg).rgba, adjustedColor ?? null);\n    }\n\n    if (adjustedColor) {\n      this._addStyle(element, `color:${adjustedColor.css}`);\n      return true;\n    }\n\n    return false;\n  }\n\n  private _getContrastCache(cell: ICellData): IColorContrastCache {\n    if (cell.isDim()) {\n      return this._themeService.colors.halfContrastCache;\n    }\n    return this._themeService.colors.contrastCache;\n  }\n\n  private _addStyle(element: HTMLElement, style: string): void {\n    element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n  }\n\n  private _isCellInSelection(x: number, y: number): boolean {\n    const start = this._selectionStart;\n    const end = this._selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    if (this._columnSelectMode) {\n      if (start[0] <= end[0]) {\n        return x >= start[0] && y >= start[1] &&\n          x < end[0] && y <= end[1];\n      }\n      return x < start[0] && y >= start[1] &&\n        x >= end[0] && y <= end[1];\n    }\n    return (y > start[1] && y < end[1]) ||\n        (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n        (start[1] < end[1] && y === end[1] && x < end[0]) ||\n        (start[1] < end[1] && y === start[1] && x >= start[0]);\n  }\n}\n\nfunction padStart(text: string, padChar: string, length: number): string {\n  while (text.length < length) {\n    text = padChar + text;\n  }\n  return text;\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { FontWeight } from 'common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n  /** sentinel for unset values in flat cache */\n  FLAT_UNSET = -9999,\n  /** size of flat cache, size-1 equals highest codepoint handled by flat */\n  FLAT_SIZE = 256,\n  /** char repeat for measuring */\n  REPEAT = 32\n}\n\n\nconst enum FontVariant {\n  REGULAR = 0,\n  BOLD = 1,\n  ITALIC = 2,\n  BOLD_ITALIC = 3\n}\n\n\nexport class WidthCache implements IDisposable {\n  // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n  // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n  //       It has a small memory footprint (only 1MB for full BMP caching),\n  //       still the sweet spot is not reached before touching 32k different codepoints,\n  //       thus we store the remaining <<20% of terminal data in a holey structure.\n  protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n  // holey cache for bold, italic and bold&italic for any string\n  // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n  //        so a shared API across terminals is needed\n  protected _holey: Map<string, number> | undefined;\n\n  private _font = '';\n  private _fontSize = 0;\n  private _weight: FontWeight = 'normal';\n  private _weightBold: FontWeight = 'bold';\n  private _container: HTMLDivElement;\n  private _measureElements: HTMLSpanElement[] = [];\n\n  constructor(_document: Document) {\n    this._container = _document.createElement('div');\n    this._container.style.position = 'absolute';\n    this._container.style.top = '-50000px';\n    this._container.style.width = '50000px';\n    // SP should stack in spans\n    this._container.style.whiteSpace = 'pre';\n    // avoid undercuts in non-monospace fonts from kerning\n    this._container.style.fontKerning = 'none';\n\n    const regular = _document.createElement('span');\n\n    const bold = _document.createElement('span');\n    bold.style.fontWeight = 'bold';\n\n    const italic = _document.createElement('span');\n    italic.style.fontStyle = 'italic';\n\n    const boldItalic = _document.createElement('span');\n    boldItalic.style.fontWeight = 'bold';\n    boldItalic.style.fontStyle = 'italic';\n\n    // NOTE: must be in order of FontVariant\n    this._measureElements = [regular, bold, italic, boldItalic];\n    this._container.appendChild(regular);\n    this._container.appendChild(bold);\n    this._container.appendChild(italic);\n    this._container.appendChild(boldItalic);\n\n    _document.body.appendChild(this._container);\n\n    this.clear();\n  }\n\n  public dispose(): void {\n    this._container.remove();           // remove elements from DOM\n    this._measureElements.length = 0;   // release element refs\n    this._holey = undefined;            // free cache memory via GC\n  }\n\n  /**\n   * Clear the width cache.\n   */\n  public clear(): void {\n    this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n    // .clear() has some overhead, re-assign instead (>3 times faster)\n    this._holey = new Map<string, number>();\n  }\n\n  /**\n   * Set the font for measuring.\n   * Must be called for any changes on font settings.\n   * Also clears the cache.\n   */\n  public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n    // skip if nothing changed\n    if (font === this._font\n      && fontSize === this._fontSize\n      && weight === this._weight\n      && weightBold === this._weightBold\n    ) {\n      return;\n    }\n\n    this._font = font;\n    this._fontSize = fontSize;\n    this._weight = weight;\n    this._weightBold = weightBold;\n\n    this._container.style.fontFamily = this._font;\n    this._container.style.fontSize = `${this._fontSize}px`;\n    this._measureElements[FontVariant.REGULAR].style.fontWeight = `${weight}`;\n    this._measureElements[FontVariant.BOLD].style.fontWeight = `${weightBold}`;\n    this._measureElements[FontVariant.ITALIC].style.fontWeight = `${weight}`;\n    this._measureElements[FontVariant.BOLD_ITALIC].style.fontWeight = `${weightBold}`;\n\n    this.clear();\n  }\n\n  /**\n   * Get the render width for cell content `c` with current font settings.\n   * `variant` denotes the font variant to be used.\n   */\n  public get(c: string, bold: boolean | number, italic: boolean | number): number {\n    let cp = 0;\n    if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n      return this._flat[cp] !== WidthCacheSettings.FLAT_UNSET\n        ? this._flat[cp]\n        : (this._flat[cp] = this._measure(c, 0));\n    }\n    let key = c;\n    if (bold) key += 'B';\n    if (italic) key += 'I';\n    let width = this._holey!.get(key);\n    if (width === undefined) {\n      let variant = 0;\n      if (bold) variant |= FontVariant.BOLD;\n      if (italic) variant |= FontVariant.ITALIC;\n      width = this._measure(c, variant);\n      this._holey!.set(key, width);\n    }\n    return width;\n  }\n\n  protected _measure(c: string, variant: FontVariant): number {\n    const el = this._measureElements[variant];\n    el.textContent = c.repeat(WidthCacheSettings.REPEAT);\n    return el.offsetWidth / WidthCacheSettings.REPEAT;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n  if (!value) {\n    throw new Error('value must not be falsy');\n  }\n  return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n  // Only return true for Powerline symbols which require\n  // different padding and should be excluded from minimum contrast\n  // ratio standards\n  return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n  return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n  return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n  return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n  /**\n   * Whether select all is currently active.\n   */\n  public isSelectAllActive: boolean = false;\n\n  /**\n   * The minimal length of the selection from the start position. When double\n   * clicking on a word, the word will be selected which makes the selection\n   * start at the start of the word and makes this variable the length.\n   */\n  public selectionStartLength: number = 0;\n\n  /**\n   * The [x, y] position the selection starts at.\n   */\n  public selectionStart: [number, number] | undefined;\n\n  /**\n   * The [x, y] position the selection ends at.\n   */\n  public selectionEnd: [number, number] | undefined;\n\n  constructor(\n    private _bufferService: IBufferService\n  ) {\n  }\n\n  /**\n   * Clears the current selection.\n   */\n  public clearSelection(): void {\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n    this.isSelectAllActive = false;\n    this.selectionStartLength = 0;\n  }\n\n  /**\n   * The final selection start, taking into consideration select all.\n   */\n  public get finalSelectionStart(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [0, 0];\n    }\n\n    if (!this.selectionEnd || !this.selectionStart) {\n      return this.selectionStart;\n    }\n\n    return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n  }\n\n  /**\n   * The final selection end, taking into consideration select all, double click\n   * word selection and triple click line selection.\n   */\n  public get finalSelectionEnd(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n    }\n\n    if (!this.selectionStart) {\n      return undefined;\n    }\n\n    // Use the selection start + length if the end doesn't exist or they're reversed\n    if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n      const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n      if (startPlusLength > this._bufferService.cols) {\n        // Ensure the trailing EOL isn't included when the selection ends on the right edge\n        if (startPlusLength % this._bufferService.cols === 0) {\n          return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n        }\n        return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n      }\n      return [startPlusLength, this.selectionStart[1]];\n    }\n\n    // Ensure the the word/line is selected after a double/triple click\n    if (this.selectionStartLength) {\n      // Select the larger of the two when start and end are on the same line\n      if (this.selectionEnd[1] === this.selectionStart[1]) {\n        // Keep the whole wrapped word/line selected if the content wraps multiple lines\n        const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n        if (startPlusLength > this._bufferService.cols) {\n          return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n        }\n        return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n      }\n    }\n    return this.selectionEnd;\n  }\n\n  /**\n   * Returns whether the selection start and end are reversed.\n   */\n  public areSelectionValuesReversed(): boolean {\n    const start = this.selectionStart;\n    const end = this.selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   * @returns Whether a refresh is necessary.\n   */\n  public handleTrim(amount: number): boolean {\n    // Adjust the selection position based on the trimmed amount.\n    if (this.selectionStart) {\n      this.selectionStart[1] -= amount;\n    }\n    if (this.selectionEnd) {\n      this.selectionEnd[1] -= amount;\n    }\n\n    // The selection has moved off the buffer, clear it.\n    if (this.selectionEnd && this.selectionEnd[1] < 0) {\n      this.clearSelection();\n      return true;\n    }\n\n    // If the selection start is trimmed, ensure the start column is 0.\n    if (this.selectionStart && this.selectionStart[1] < 0) {\n      this.selectionStart[1] = 0;\n    }\n    return false;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\n\n\nconst enum MeasureSettings {\n  REPEAT = 32\n}\n\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n  public serviceBrand: undefined;\n\n  public width: number = 0;\n  public height: number = 0;\n  private _measureStrategy: IMeasureStrategy;\n\n  public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n  private readonly _onCharSizeChange = this.register(new EventEmitter<void>());\n  public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n  constructor(\n    document: Document,\n    parentElement: HTMLElement,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._measureStrategy = new DomMeasureStrategy(document, parentElement, this._optionsService);\n    this.register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n  }\n\n  public measure(): void {\n    const result = this._measureStrategy.measure();\n    if (result.width !== this.width || result.height !== this.height) {\n      this.width = result.width;\n      this.height = result.height;\n      this._onCharSizeChange.fire();\n    }\n  }\n}\n\ninterface IMeasureStrategy {\n  measure(): IReadonlyMeasureResult;\n}\n\ninterface IReadonlyMeasureResult {\n  readonly width: number;\n  readonly height: number;\n}\n\ninterface IMeasureResult {\n  width: number;\n  height: number;\n}\n\n// TODO: For supporting browsers we should also provide a CanvasCharDimensionsProvider that uses\n// ctx.measureText\nclass DomMeasureStrategy implements IMeasureStrategy {\n  private _result: IMeasureResult = { width: 0, height: 0 };\n  private _measureElement: HTMLElement;\n\n  constructor(\n    private _document: Document,\n    private _parentElement: HTMLElement,\n    private _optionsService: IOptionsService\n  ) {\n    this._measureElement = this._document.createElement('span');\n    this._measureElement.classList.add('xterm-char-measure-element');\n    this._measureElement.textContent = 'W'.repeat(MeasureSettings.REPEAT);\n    this._measureElement.setAttribute('aria-hidden', 'true');\n    this._measureElement.style.whiteSpace = 'pre';\n    this._measureElement.style.fontKerning = 'none';\n    this._parentElement.appendChild(this._measureElement);\n  }\n\n  public measure(): IReadonlyMeasureResult {\n    this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n    this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n    // Note that this triggers a synchronous layout\n    const geometry = {\n      height: Number(this._measureElement.offsetHeight),\n      width: Number(this._measureElement.offsetWidth)\n    };\n\n    // If values are 0 then the element is likely currently display:none, in which case we should\n    // retain the previous value.\n    if (geometry.width !== 0 && geometry.height !== 0) {\n      this._result.width = geometry.width / MeasureSettings.REPEAT;\n      this._result.height = Math.ceil(geometry.height);\n    }\n\n    return this._result;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoiner } from 'browser/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n  private _width: number;\n  // .content carries no meaning for joined CellData, simply nullify it\n  // thus we have to overload all other .content accessors\n  public content: number = 0;\n  public fg: number;\n  public bg: number;\n  public combinedData: string = '';\n\n  constructor(firstCell: ICellData, chars: string, width: number) {\n    super();\n    this.fg = firstCell.fg;\n    this.bg = firstCell.bg;\n    this.combinedData = chars;\n    this._width = width;\n  }\n\n  public isCombined(): number {\n    // always mark joined cell data as combined\n    return Content.IS_COMBINED_MASK;\n  }\n\n  public getWidth(): number {\n    return this._width;\n  }\n\n  public getChars(): string {\n    return this.combinedData;\n  }\n\n  public getCode(): number {\n    // code always gets the highest possible fake codepoint (read as -1)\n    // this is needed as code is used by caches as identifier\n    return 0x1FFFFF;\n  }\n\n  public setFromCharData(value: CharData): void {\n    throw new Error('not implemented');\n  }\n\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n  public serviceBrand: undefined;\n\n  private _characterJoiners: ICharacterJoiner[] = [];\n  private _nextCharacterJoinerId: number = 0;\n  private _workCell: CellData = new CellData();\n\n  constructor(\n    @IBufferService private _bufferService: IBufferService\n  ) { }\n\n  public register(handler: (text: string) => [number, number][]): number {\n    const joiner: ICharacterJoiner = {\n      id: this._nextCharacterJoinerId++,\n      handler\n    };\n\n    this._characterJoiners.push(joiner);\n    return joiner.id;\n  }\n\n  public deregister(joinerId: number): boolean {\n    for (let i = 0; i < this._characterJoiners.length; i++) {\n      if (this._characterJoiners[i].id === joinerId) {\n        this._characterJoiners.splice(i, 1);\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public getJoinedCharacters(row: number): [number, number][] {\n    if (this._characterJoiners.length === 0) {\n      return [];\n    }\n\n    const line = this._bufferService.buffer.lines.get(row);\n    if (!line || line.length === 0) {\n      return [];\n    }\n\n    const ranges: [number, number][] = [];\n    const lineStr = line.translateToString(true);\n\n    // Because some cells can be represented by multiple javascript characters,\n    // we track the cell and the string indexes separately. This allows us to\n    // translate the string ranges we get from the joiners back into cell ranges\n    // for use when rendering\n    let rangeStartColumn = 0;\n    let currentStringIndex = 0;\n    let rangeStartStringIndex = 0;\n    let rangeAttrFG = line.getFg(0);\n    let rangeAttrBG = line.getBg(0);\n\n    for (let x = 0; x < line.getTrimmedLength(); x++) {\n      line.loadCell(x, this._workCell);\n\n      if (this._workCell.getWidth() === 0) {\n        // If this character is of width 0, skip it.\n        continue;\n      }\n\n      // End of range\n      if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n        // If we ended up with a sequence of more than one character,\n        // look for ranges to join.\n        if (x - rangeStartColumn > 1) {\n          const joinedRanges = this._getJoinedRanges(\n            lineStr,\n            rangeStartStringIndex,\n            currentStringIndex,\n            line,\n            rangeStartColumn\n          );\n          for (let i = 0; i < joinedRanges.length; i++) {\n            ranges.push(joinedRanges[i]);\n          }\n        }\n\n        // Reset our markers for a new range.\n        rangeStartColumn = x;\n        rangeStartStringIndex = currentStringIndex;\n        rangeAttrFG = this._workCell.fg;\n        rangeAttrBG = this._workCell.bg;\n      }\n\n      currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n    }\n\n    // Process any trailing ranges.\n    if (this._bufferService.cols - rangeStartColumn > 1) {\n      const joinedRanges = this._getJoinedRanges(\n        lineStr,\n        rangeStartStringIndex,\n        currentStringIndex,\n        line,\n        rangeStartColumn\n      );\n      for (let i = 0; i < joinedRanges.length; i++) {\n        ranges.push(joinedRanges[i]);\n      }\n    }\n\n    return ranges;\n  }\n\n  /**\n   * Given a segment of a line of text, find all ranges of text that should be\n   * joined in a single rendering unit. Ranges are internally converted to\n   * column ranges, rather than string ranges.\n   * @param line String representation of the full line of text\n   * @param startIndex Start position of the range to search in the string (inclusive)\n   * @param endIndex End position of the range to search in the string (exclusive)\n   */\n  private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n    const text = line.substring(startIndex, endIndex);\n    // At this point we already know that there is at least one joiner so\n    // we can just pull its value and assign it directly rather than\n    // merging it into an empty array, which incurs unnecessary writes.\n    let allJoinedRanges: [number, number][] = [];\n    try {\n      allJoinedRanges = this._characterJoiners[0].handler(text);\n    } catch (error) {\n      console.error(error);\n    }\n    for (let i = 1; i < this._characterJoiners.length; i++) {\n      // We merge any overlapping ranges across the different joiners\n      try {\n        const joinerRanges = this._characterJoiners[i].handler(text);\n        for (let j = 0; j < joinerRanges.length; j++) {\n          CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    }\n    this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n    return allJoinedRanges;\n  }\n\n  /**\n   * Modifies the provided ranges in-place to adjust for variations between\n   * string length and cell width so that the range represents a cell range,\n   * rather than the string range the joiner provides.\n   * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n   * @param line Cell data for the relevant line in the terminal\n   * @param startCol Offset within the line to start from\n   */\n  private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n    let currentRangeIndex = 0;\n    let currentRangeStarted = false;\n    let currentStringIndex = 0;\n    let currentRange = ranges[currentRangeIndex];\n\n    // If we got through all of the ranges, stop searching\n    if (!currentRange) {\n      return;\n    }\n\n    for (let x = startCol; x < this._bufferService.cols; x++) {\n      const width = line.getWidth(x);\n      const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n      // We skip zero-width characters when creating the string to join the text\n      // so we do the same here\n      if (width === 0) {\n        continue;\n      }\n\n      // Adjust the start of the range\n      if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n        currentRange[0] = x;\n        currentRangeStarted = true;\n      }\n\n      // Adjust the end of the range\n      if (currentRange[1] <= currentStringIndex) {\n        currentRange[1] = x;\n\n        // We're finished with this range, so we move to the next one\n        currentRange = ranges[++currentRangeIndex];\n\n        // If there are no more ranges left, stop searching\n        if (!currentRange) {\n          break;\n        }\n\n        // Ranges can be on adjacent characters. Because the end index of the\n        // ranges are exclusive, this means that the index for the start of a\n        // range can be the same as the end index of the previous range. To\n        // account for the start of the next range, we check here just in case.\n        if (currentRange[0] <= currentStringIndex) {\n          currentRange[0] = x;\n          currentRangeStarted = true;\n        } else {\n          currentRangeStarted = false;\n        }\n      }\n\n      // Adjust the string index based on the character length to line up with\n      // the column adjustment\n      currentStringIndex += length;\n    }\n\n    // If there is still a range left at the end, it must extend all the way to\n    // the end of the line.\n    if (currentRange) {\n      currentRange[1] = this._bufferService.cols;\n    }\n  }\n\n  /**\n   * Merges the range defined by the provided start and end into the list of\n   * existing ranges. The merge is done in place on the existing range for\n   * performance and is also returned.\n   * @param ranges Existing range list\n   * @param newRange Tuple of two numbers representing the new range to merge in.\n   * @returns The ranges input with the new range merged in place\n   */\n  private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n    let inRange = false;\n    for (let i = 0; i < ranges.length; i++) {\n      const range = ranges[i];\n      if (!inRange) {\n        if (newRange[1] <= range[0]) {\n          // Case 1: New range is before the search range\n          ranges.splice(i, 0, newRange);\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 2: New range is either wholly contained within the\n          // search range or overlaps with the front of it\n          range[0] = Math.min(newRange[0], range[0]);\n          return ranges;\n        }\n\n        if (newRange[0] < range[1]) {\n          // Case 3: New range either wholly contains the search range\n          // or overlaps with the end of it\n          range[0] = Math.min(newRange[0], range[0]);\n          inRange = true;\n        }\n\n        // Case 4: New range starts after the search range\n        continue;\n      } else {\n        if (newRange[1] <= range[0]) {\n          // Case 5: New range extends from previous range but doesn't\n          // reach the current one\n          ranges[i - 1][1] = newRange[1];\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 6: New range extends from prvious range into the\n          // current range\n          ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n          ranges.splice(i, 1);\n          return ranges;\n        }\n\n        // Case 7: New range extends from previous range past the\n        // end of the current range\n        ranges.splice(i, 1);\n        i--;\n      }\n    }\n\n    if (inRange) {\n      // Case 8: New range extends past the last existing range\n      ranges[ranges.length - 1][1] = newRange[1];\n    } else {\n      // Case 9: New range starts after the last existing range\n      ranges.push(newRange);\n    }\n\n    return ranges;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\n\nexport class CoreBrowserService implements ICoreBrowserService {\n  public serviceBrand: undefined;\n\n  private _isFocused = false;\n  private _cachedIsFocused: boolean | undefined = undefined;\n\n  constructor(\n    private _textarea: HTMLTextAreaElement,\n    public readonly window: Window & typeof globalThis\n  ) {\n    this._textarea.addEventListener('focus', () => this._isFocused = true);\n    this._textarea.addEventListener('blur', () => this._isFocused = false);\n  }\n\n  public get dpr(): number {\n    return this.window.devicePixelRatio;\n  }\n\n  public get isFocused(): boolean {\n    if (this._cachedIsFocused === undefined) {\n      this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n      queueMicrotask(() => this._cachedIsFocused = undefined);\n    }\n    return this._cachedIsFocused;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService, IRenderService, IMouseService } from './Services';\nimport { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse';\n\nexport class MouseService implements IMouseService {\n  public serviceBrand: undefined;\n\n  constructor(\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService\n  ) {\n  }\n\n  public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n    return getCoords(\n      window,\n      event,\n      element,\n      colCount,\n      rowCount,\n      this._charSizeService.hasValidSize,\n      this._renderService.dimensions.css.cell.width,\n      this._renderService.dimensions.css.cell.height,\n      isSelection\n    );\n  }\n\n  public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n    const coords = getCoordsRelativeToElement(window, event, element);\n    if (!this._charSizeService.hasValidSize) {\n      return undefined;\n    }\n    coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n    coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n    return {\n      col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n      row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n      x: Math.floor(coords[0]),\n      y: Math.floor(coords[1])\n    };\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable } from 'common/Lifecycle';\nimport { DebouncedIdleTask } from 'common/TaskQueue';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\ninterface ISelectionState {\n  start: [number, number] | undefined;\n  end: [number, number] | undefined;\n  columnSelectMode: boolean;\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n  public serviceBrand: undefined;\n\n  private _renderer: MutableDisposable<IRenderer> = this.register(new MutableDisposable());\n  private _renderDebouncer: IRenderDebouncerWithCallback;\n  private _screenDprMonitor: ScreenDprMonitor;\n  private _pausedResizeTask = new DebouncedIdleTask();\n\n  private _isPaused: boolean = false;\n  private _needsFullRefresh: boolean = false;\n  private _isNextRenderRedrawOnly: boolean = true;\n  private _needsSelectionRefresh: boolean = false;\n  private _canvasWidth: number = 0;\n  private _canvasHeight: number = 0;\n  private _selectionState: ISelectionState = {\n    start: undefined,\n    end: undefined,\n    columnSelectMode: false\n  };\n\n  private readonly _onDimensionsChange = this.register(new EventEmitter<IRenderDimensions>());\n  public readonly onDimensionsChange =  this._onDimensionsChange.event;\n  private readonly _onRenderedViewportChange = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n  private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onRefreshRequest = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n  public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n  constructor(\n    private _rowCount: number,\n    screenElement: HTMLElement,\n    @IOptionsService optionsService: IOptionsService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IDecorationService decorationService: IDecorationService,\n    @IBufferService bufferService: IBufferService,\n    @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n    @IThemeService themeService: IThemeService\n  ) {\n    super();\n\n    this._renderDebouncer = new RenderDebouncer(coreBrowserService.window, (start, end) => this._renderRows(start, end));\n    this.register(this._renderDebouncer);\n\n    this._screenDprMonitor = new ScreenDprMonitor(coreBrowserService.window);\n    this._screenDprMonitor.setListener(() => this.handleDevicePixelRatioChange());\n    this.register(this._screenDprMonitor);\n\n    this.register(bufferService.onResize(() => this._fullRefresh()));\n    this.register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n    this.register(optionsService.onOptionChange(() => this._handleOptionsChanged()));\n    this.register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n    // Do a full refresh whenever any decoration is added or removed. This may not actually result\n    // in changes but since decorations should be used sparingly or added/removed all in the same\n    // frame this should have minimal performance impact.\n    this.register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n    this.register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n    // Clear the renderer when the a change that could affect glyphs occurs\n    this.register(optionsService.onMultipleOptionChange([\n      'customGlyphs',\n      'drawBoldTextInBrightColors',\n      'letterSpacing',\n      'lineHeight',\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'fontWeightBold',\n      'minimumContrastRatio'\n    ], () => {\n      this.clear();\n      this.handleResize(bufferService.cols, bufferService.rows);\n      this._fullRefresh();\n    }));\n\n    // Refresh the cursor line when the cursor changes\n    this.register(optionsService.onMultipleOptionChange([\n      'cursorBlink',\n      'cursorStyle'\n    ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, true)));\n\n    // dprchange should handle this case, we need this as well for browsers that don't support the\n    // matchMedia query.\n    this.register(addDisposableDomListener(coreBrowserService.window, 'resize', () => this.handleDevicePixelRatioChange()));\n\n    this.register(themeService.onChangeColors(() => this._fullRefresh()));\n\n    // Detect whether IntersectionObserver is detected and enable renderer pause\n    // and resume based on terminal visibility if so\n    if ('IntersectionObserver' in coreBrowserService.window) {\n      const observer = new coreBrowserService.window.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n      observer.observe(screenElement);\n      this.register({ dispose: () => observer.disconnect() });\n    }\n  }\n\n  private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n    this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n\n    // Terminal was hidden on open\n    if (!this._isPaused && !this._charSizeService.hasValidSize) {\n      this._charSizeService.measure();\n    }\n\n    if (!this._isPaused && this._needsFullRefresh) {\n      this._pausedResizeTask.flush();\n      this.refreshRows(0, this._rowCount - 1);\n      this._needsFullRefresh = false;\n    }\n  }\n\n  public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n      return;\n    }\n    if (!isRedrawOnly) {\n      this._isNextRenderRedrawOnly = false;\n    }\n    this._renderDebouncer.refresh(start, end, this._rowCount);\n  }\n\n  private _renderRows(start: number, end: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n\n    // Since this is debounced, a resize event could have happened between the time a refresh was\n    // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n    // given the current viewport state.\n    start = Math.min(start, this._rowCount - 1);\n    end = Math.min(end, this._rowCount - 1);\n\n    // Render\n    this._renderer.value.renderRows(start, end);\n\n    // Update selection if needed\n    if (this._needsSelectionRefresh) {\n      this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n      this._needsSelectionRefresh = false;\n    }\n\n    // Fire render event only if it was not a redraw\n    if (!this._isNextRenderRedrawOnly) {\n      this._onRenderedViewportChange.fire({ start, end });\n    }\n    this._onRender.fire({ start, end });\n    this._isNextRenderRedrawOnly = true;\n  }\n\n  public resize(cols: number, rows: number): void {\n    this._rowCount = rows;\n    this._fireOnCanvasResize();\n  }\n\n  private _handleOptionsChanged(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this.refreshRows(0, this._rowCount - 1);\n    this._fireOnCanvasResize();\n  }\n\n  private _fireOnCanvasResize(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    // Don't fire the event if the dimensions haven't changed\n    if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n      return;\n    }\n    this._onDimensionsChange.fire(this._renderer.value.dimensions);\n  }\n\n  public hasRenderer(): boolean {\n    return !!this._renderer.value;\n  }\n\n  public setRenderer(renderer: IRenderer): void {\n    this._renderer.value = renderer;\n    this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n    // Force a refresh\n    this._needsSelectionRefresh = true;\n    this._fullRefresh();\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    return this._renderDebouncer.addRefreshCallback(callback);\n  }\n\n  private _fullRefresh(): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n    } else {\n      this.refreshRows(0, this._rowCount - 1);\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.clearTextureAtlas?.();\n    this._fullRefresh();\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n    // when devicePixelRatio changes\n    this._charSizeService.measure();\n\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.handleDevicePixelRatioChange();\n    this.refreshRows(0, this._rowCount - 1);\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    if (this._isPaused) {\n      this._pausedResizeTask.set(() => this._renderer.value!.handleResize(cols, rows));\n    } else {\n      this._renderer.value.handleResize(cols, rows);\n    }\n    this._fullRefresh();\n  }\n\n  // TODO: Is this useful when we have onResize?\n  public handleCharSizeChanged(): void {\n    this._renderer.value?.handleCharSizeChanged();\n  }\n\n  public handleBlur(): void {\n    this._renderer.value?.handleBlur();\n  }\n\n  public handleFocus(): void {\n    this._renderer.value?.handleFocus();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionState.start = start;\n    this._selectionState.end = end;\n    this._selectionState.columnSelectMode = columnSelectMode;\n    this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n  }\n\n  public handleCursorMove(): void {\n    this._renderer.value?.handleCursorMove();\n  }\n\n  public clear(): void {\n    this._renderer.value?.clear();\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from 'browser/Types';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { ICoreBrowserService, IMouseService, IRenderService, ISelectionService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport * as Browser from 'common/Platform';\nimport { IBufferLine, IDisposable } from 'common/Types';\nimport { getRangeLength } from 'common/buffer/BufferRange';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n  start: number;\n  length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n  NORMAL,\n  WORD,\n  LINE,\n  COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n  public serviceBrand: undefined;\n\n  protected _model: SelectionModel;\n\n  /**\n   * The amount to scroll every drag scroll update (depends on how far the mouse\n   * drag is above or below the terminal).\n   */\n  private _dragScrollAmount: number = 0;\n\n  /**\n   * The current selection mode.\n   */\n  protected _activeSelectionMode: SelectionMode;\n\n  /**\n   * A setInterval timer that is active while the mouse is down whose callback\n   * scrolls the viewport when necessary.\n   */\n  private _dragScrollIntervalTimer: number | undefined;\n\n  /**\n   * The animation frame ID used for refreshing the selection.\n   */\n  private _refreshAnimationFrame: number | undefined;\n\n  /**\n   * Whether selection is enabled.\n   */\n  private _enabled = true;\n\n  private _mouseMoveListener: EventListener;\n  private _mouseUpListener: EventListener;\n  private _trimListener: IDisposable;\n  private _workCell: CellData = new CellData();\n\n  private _mouseDownTimeStamp: number = 0;\n  private _oldHasSelection: boolean = false;\n  private _oldSelectionStart: [number, number] | undefined = undefined;\n  private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n  private readonly _onLinuxMouseSelection = this.register(new EventEmitter<string>());\n  public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n  private readonly _onRedrawRequest = this.register(new EventEmitter<ISelectionRedrawRequestEvent>());\n  public readonly onRequestRedraw = this._onRedrawRequest.event;\n  private readonly _onSelectionChange = this.register(new EventEmitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onRequestScrollLines = this.register(new EventEmitter<ISelectionRequestScrollLinesEvent>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _linkifier: ILinkifier2,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IMouseService private readonly _mouseService: IMouseService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n    super();\n\n    // Init listeners\n    this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n    this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n    this._coreService.onUserInput(() => {\n      if (this.hasSelection) {\n        this.clearSelection();\n      }\n    });\n    this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n    this.enable();\n\n    this._model = new SelectionModel(this._bufferService);\n    this._activeSelectionMode = SelectionMode.NORMAL;\n\n    this.register(toDisposable(() => {\n      this._removeMouseDownListeners();\n    }));\n  }\n\n  public reset(): void {\n    this.clearSelection();\n  }\n\n  /**\n   * Disables the selection manager. This is useful for when terminal mouse\n   * are enabled.\n   */\n  public disable(): void {\n    this.clearSelection();\n    this._enabled = false;\n  }\n\n  /**\n   * Enable the selection manager.\n   */\n  public enable(): void {\n    this._enabled = true;\n  }\n\n  public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n  public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n  /**\n   * Gets whether there is an active text selection.\n   */\n  public get hasSelection(): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[0] !== end[0] || start[1] !== end[1];\n  }\n\n  /**\n   * Gets the text currently selected.\n   */\n  public get selectionText(): string {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return '';\n    }\n\n    const buffer = this._bufferService.buffer;\n    const result: string[] = [];\n\n    if (this._activeSelectionMode === SelectionMode.COLUMN) {\n      // Ignore zero width selections\n      if (start[0] === end[0]) {\n        return '';\n      }\n\n      // For column selection it's not enough to rely on final selection's swapping of reversed\n      // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n      const startCol = start[0] < end[0] ? start[0] : end[0];\n      const endCol = start[0] < end[0] ? end[0] : start[0];\n      for (let i = start[1]; i <= end[1]; i++) {\n        const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n        result.push(lineText);\n      }\n    } else {\n      // Get first row\n      const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n      result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n      // Get middle rows\n      for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n        const bufferLine = buffer.lines.get(i);\n        const lineText = buffer.translateBufferLineToString(i, true);\n        if (bufferLine?.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n\n      // Get final row\n      if (start[1] !== end[1]) {\n        const bufferLine = buffer.lines.get(end[1]);\n        const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n        if (bufferLine && bufferLine!.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n    }\n\n    // Format string by replacing non-breaking space chars with regular spaces\n    // and joining the array into a multi-line string.\n    const formattedResult = result.map(line => {\n      return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n    }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n    return formattedResult;\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Queues a refresh, redrawing the selection on the next opportunity.\n   * @param isLinuxMouseSelection Whether the selection should be registered as a new\n   * selection on Linux.\n   */\n  public refresh(isLinuxMouseSelection?: boolean): void {\n    // Queue the refresh for the renderer\n    if (!this._refreshAnimationFrame) {\n      this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n    }\n\n    // If the platform is Linux and the refresh call comes from a mouse event,\n    // we need to update the selection for middle click to paste selection.\n    if (Browser.isLinux && isLinuxMouseSelection) {\n      const selectionText = this.selectionText;\n      if (selectionText.length) {\n        this._onLinuxMouseSelection.fire(this.selectionText);\n      }\n    }\n  }\n\n  /**\n   * Fires the refresh event, causing consumers to pick it up and redraw the\n   * selection state.\n   */\n  private _refresh(): void {\n    this._refreshAnimationFrame = undefined;\n    this._onRedrawRequest.fire({\n      start: this._model.finalSelectionStart,\n      end: this._model.finalSelectionEnd,\n      columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n    });\n  }\n\n  /**\n   * Checks if the current click was inside the current selection\n   * @param event The mouse event\n   */\n  private _isClickInSelection(event: MouseEvent): boolean {\n    const coords = this._getMouseBufferCoords(event);\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n\n    if (!start || !end || !coords) {\n      return false;\n    }\n\n    return this._areCoordsInSelection(coords, start, end);\n  }\n\n  public isCellInSelection(x: number, y: number): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return this._areCoordsInSelection([x, y], start, end);\n  }\n\n  protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n    return (coords[1] > start[1] && coords[1] < end[1]) ||\n        (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n  }\n\n  /**\n   * Selects word at the current mouse event coordinates.\n   * @param event The mouse event.\n   */\n  private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n    // Check if there is a link under the cursor first and select that if so\n    const range = this._linkifier.currentLink?.link?.range;\n    if (range) {\n      this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n      this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._selectWordAt(coords, allowWhitespaceOnlySelection);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._model.isSelectAllActive = true;\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._model.clearSelection();\n    start = Math.max(start, 0);\n    end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n    this._model.selectionStart = [0, start];\n    this._model.selectionEnd = [this._bufferService.cols, end];\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   */\n  private _handleTrim(amount: number): void {\n    const needsRefresh = this._model.handleTrim(amount);\n    if (needsRefresh) {\n      this.refresh();\n    }\n  }\n\n  /**\n   * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n   * @param event The mouse event.\n   */\n  private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n    const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n    if (!coords) {\n      return undefined;\n    }\n\n    // Convert to 0-based\n    coords[0]--;\n    coords[1]--;\n\n    // Convert viewport coords to buffer coords\n    coords[1] += this._bufferService.buffer.ydisp;\n    return coords;\n  }\n\n  /**\n   * Gets the amount the viewport should be scrolled based on how far out of the\n   * terminal the mouse is.\n   * @param event The mouse event.\n   */\n  private _getMouseEventScrollAmount(event: MouseEvent): number {\n    let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n    const terminalHeight = this._renderService.dimensions.css.canvas.height;\n    if (offset >= 0 && offset <= terminalHeight) {\n      return 0;\n    }\n    if (offset > terminalHeight) {\n      offset -= terminalHeight;\n    }\n\n    offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n    offset /= DRAG_SCROLL_MAX_THRESHOLD;\n    return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n  }\n\n  /**\n   * Returns whether the selection manager should force selection, regardless of\n   * whether the terminal is in mouse events mode.\n   * @param event The mouse event.\n   */\n  public shouldForceSelection(event: MouseEvent): boolean {\n    if (Browser.isMac) {\n      return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n    }\n\n    return event.shiftKey;\n  }\n\n  /**\n   * Handles te mousedown event, setting up for a new selection.\n   * @param event The mousedown event.\n   */\n  public handleMouseDown(event: MouseEvent): void {\n    this._mouseDownTimeStamp = event.timeStamp;\n    // If we have selection, we want the context menu on right click even if the\n    // terminal is in mouse mode.\n    if (event.button === 2 && this.hasSelection) {\n      return;\n    }\n\n    // Only action the primary button\n    if (event.button !== 0) {\n      return;\n    }\n\n    // Allow selection when using a specific modifier key, even when disabled\n    if (!this._enabled) {\n      if (!this.shouldForceSelection(event)) {\n        return;\n      }\n\n      // Don't send the mouse down event to the current process, we want to select\n      event.stopPropagation();\n    }\n\n    // Tell the browser not to start a regular selection\n    event.preventDefault();\n\n    // Reset drag scroll state\n    this._dragScrollAmount = 0;\n\n    if (this._enabled && event.shiftKey) {\n      this._handleIncrementalClick(event);\n    } else {\n      if (event.detail === 1) {\n        this._handleSingleClick(event);\n      } else if (event.detail === 2) {\n        this._handleDoubleClick(event);\n      } else if (event.detail === 3) {\n        this._handleTripleClick(event);\n      }\n    }\n\n    this._addMouseDownListeners();\n    this.refresh(true);\n  }\n\n  /**\n   * Adds listeners when mousedown is triggered.\n   */\n  private _addMouseDownListeners(): void {\n    // Listen on the document so that dragging outside of viewport works\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n    }\n    this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n  }\n\n  /**\n   * Removes the listeners that are registered when mousedown is triggered.\n   */\n  private _removeMouseDownListeners(): void {\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n    }\n    this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n    this._dragScrollIntervalTimer = undefined;\n  }\n\n  /**\n   * Performs an incremental click, setting the selection end position to the mouse\n   * position.\n   * @param event The mouse event.\n   */\n  private _handleIncrementalClick(event: MouseEvent): void {\n    if (this._model.selectionStart) {\n      this._model.selectionEnd = this._getMouseBufferCoords(event);\n    }\n  }\n\n  /**\n   * Performs a single click, resetting relevant state and setting the selection\n   * start position.\n   * @param event The mouse event.\n   */\n  private _handleSingleClick(event: MouseEvent): void {\n    this._model.selectionStartLength = 0;\n    this._model.isSelectAllActive = false;\n    this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n    // Initialize the new selection\n    this._model.selectionStart = this._getMouseBufferCoords(event);\n    if (!this._model.selectionStart) {\n      return;\n    }\n    this._model.selectionEnd = undefined;\n\n    // Ensure the line exists\n    const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n    if (!line) {\n      return;\n    }\n\n    // Return early if the click event is not in the buffer (eg. in scroll bar)\n    if (line.length === this._model.selectionStart[0]) {\n      return;\n    }\n\n    // If the mouse is over the second half of a wide character, adjust the\n    // selection to cover the whole character\n    if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n      this._model.selectionStart[0]++;\n    }\n  }\n\n  /**\n   * Performs a double click, selecting the current word.\n   * @param event The mouse event.\n   */\n  private _handleDoubleClick(event: MouseEvent): void {\n    if (this._selectWordAtCursor(event, true)) {\n      this._activeSelectionMode = SelectionMode.WORD;\n    }\n  }\n\n  /**\n   * Performs a triple click, selecting the current line and activating line\n   * select mode.\n   * @param event The mouse event.\n   */\n  private _handleTripleClick(event: MouseEvent): void {\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._activeSelectionMode = SelectionMode.LINE;\n      this._selectLineAt(coords[1]);\n    }\n  }\n\n  /**\n   * Returns whether the selection manager should operate in column select mode\n   * @param event the mouse or keyboard event\n   */\n  public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n    return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n  }\n\n  /**\n   * Handles the mousemove event when the mouse button is down, recording the\n   * end of the selection and refreshing the selection.\n   * @param event The mousemove event.\n   */\n  private _handleMouseMove(event: MouseEvent): void {\n    // If the mousemove listener is active it means that a selection is\n    // currently being made, we should stop propagation to prevent mouse events\n    // to be sent to the pty.\n    event.stopImmediatePropagation();\n\n    // Do nothing if there is no selection start, this can happen if the first\n    // click in the terminal is an incremental click\n    if (!this._model.selectionStart) {\n      return;\n    }\n\n    // Record the previous position so we know whether to redraw the selection\n    // at the end.\n    const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n    // Set the initial selection end based on the mouse coordinates\n    this._model.selectionEnd = this._getMouseBufferCoords(event);\n    if (!this._model.selectionEnd) {\n      this.refresh(true);\n      return;\n    }\n\n    // Select the entire line if line select mode is active.\n    if (this._activeSelectionMode === SelectionMode.LINE) {\n      if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n        this._model.selectionEnd[0] = 0;\n      } else {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      }\n    } else if (this._activeSelectionMode === SelectionMode.WORD) {\n      this._selectToWordAt(this._model.selectionEnd);\n    }\n\n    // Determine the amount of scrolling that will happen.\n    this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n    // If the cursor was above or below the viewport, make sure it's at the\n    // start or end of the viewport respectively. This should only happen when\n    // NOT in column select mode.\n    if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n      if (this._dragScrollAmount > 0) {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      } else if (this._dragScrollAmount < 0) {\n        this._model.selectionEnd[0] = 0;\n      }\n    }\n\n    // If the character is a wide character include the cell to the right in the\n    // selection. Note that selections at the very end of the line will never\n    // have a character.\n    const buffer = this._bufferService.buffer;\n    if (this._model.selectionEnd[1] < buffer.lines.length) {\n      const line = buffer.lines.get(this._model.selectionEnd[1]);\n      if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n        this._model.selectionEnd[0]++;\n      }\n    }\n\n    // Only draw here if the selection changes.\n    if (!previousSelectionEnd ||\n      previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n      previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n      this.refresh(true);\n    }\n  }\n\n  /**\n   * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n   * scrolling of the viewport.\n   */\n  private _dragScroll(): void {\n    if (!this._model.selectionEnd || !this._model.selectionStart) {\n      return;\n    }\n    if (this._dragScrollAmount) {\n      this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n      // Re-evaluate selection\n      // If the cursor was above or below the viewport, make sure it's at the\n      // start or end of the viewport respectively. This should only happen when\n      // NOT in column select mode.\n      const buffer = this._bufferService.buffer;\n      if (this._dragScrollAmount > 0) {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = this._bufferService.cols;\n        }\n        this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n      } else {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = 0;\n        }\n        this._model.selectionEnd[1] = buffer.ydisp;\n      }\n      this.refresh();\n    }\n  }\n\n  /**\n   * Handles the mouseup event, removing the mousedown listeners.\n   * @param event The mouseup event.\n   */\n  private _handleMouseUp(event: MouseEvent): void {\n    const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n    this._removeMouseDownListeners();\n\n    if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n      if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n        const coordinates = this._mouseService.getCoords(\n          event,\n          this._element,\n          this._bufferService.cols,\n          this._bufferService.rows,\n          false\n        );\n        if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n          const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n          this._coreService.triggerDataEvent(sequence, true);\n        }\n      }\n    } else {\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  private _fireEventIfSelectionChanged(): void {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n    if (!hasSelection) {\n      if (this._oldHasSelection) {\n        this._fireOnSelectionChange(start, end, hasSelection);\n      }\n      return;\n    }\n\n    // Sanity check, these should not be undefined as there is a selection\n    if (!start || !end) {\n      return;\n    }\n\n    if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n      start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n      end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n      this._fireOnSelectionChange(start, end, hasSelection);\n    }\n  }\n\n  private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n    this._oldSelectionStart = start;\n    this._oldSelectionEnd = end;\n    this._oldHasSelection = hasSelection;\n    this._onSelectionChange.fire();\n  }\n\n  private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n    this.clearSelection();\n    // Only adjust the selection on trim, shiftElements is rarely used (only in\n    // reverseIndex) and delete in a splice is only ever used when the same\n    // number of elements was just added. Given this is could actually be\n    // beneficial to leave the selection as is for these cases.\n    this._trimListener.dispose();\n    this._trimListener = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n  }\n\n  /**\n   * Converts a viewport column (0 to cols - 1) to the character index on the\n   * buffer line, the latter takes into account wide and null characters.\n   * @param bufferLine The buffer line to use.\n   * @param x The x index in the buffer line to convert.\n   */\n  private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n    let charIndex = x;\n    for (let i = 0; x >= i; i++) {\n      const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n      if (this._workCell.getWidth() === 0) {\n        // Wide characters aren't included in the line string so decrement the\n        // index so the index is back on the wide character.\n        charIndex--;\n      } else if (length > 1 && x !== i) {\n        // Emojis take up multiple characters, so adjust accordingly. For these\n        // we don't want ot include the character at the column as we're\n        // returning the start index in the string, not the end index.\n        charIndex += length - 1;\n      }\n    }\n    return charIndex;\n  }\n\n  public setSelection(col: number, row: number, length: number): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this._model.selectionStart = [col, row];\n    this._model.selectionStartLength = length;\n    this.refresh();\n    this._fireEventIfSelectionChanged();\n  }\n\n  public rightClickSelect(ev: MouseEvent): void {\n    if (!this._isClickInSelection(ev)) {\n      if (this._selectWordAtCursor(ev, false)) {\n        this.refresh(true);\n      }\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  /**\n   * Gets positional information for the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n    // Ensure coords are within viewport (eg. not within scroll bar)\n    if (coords[0] >= this._bufferService.cols) {\n      return undefined;\n    }\n\n    const buffer = this._bufferService.buffer;\n    const bufferLine = buffer.lines.get(coords[1]);\n    if (!bufferLine) {\n      return undefined;\n    }\n\n    const line = buffer.translateBufferLineToString(coords[1], false);\n\n    // Get actual index, taking into consideration wide characters\n    let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n    let endIndex = startIndex;\n\n    // Record offset to be used later\n    const charOffset = coords[0] - startIndex;\n    let leftWideCharCount = 0;\n    let rightWideCharCount = 0;\n    let leftLongCharOffset = 0;\n    let rightLongCharOffset = 0;\n\n    if (line.charAt(startIndex) === ' ') {\n      // Expand until non-whitespace is hit\n      while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n        startIndex--;\n      }\n      while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n        endIndex++;\n      }\n    } else {\n      // Expand until whitespace is hit. This algorithm works by scanning left\n      // and right from the starting position, keeping both the index format\n      // (line) and the column format (bufferLine) in sync. When a wide\n      // character is hit, it is recorded and the column index is adjusted.\n      let startCol = coords[0];\n      let endCol = coords[0];\n\n      // Consider the initial position, skip it and increment the wide char\n      // variable\n      if (bufferLine.getWidth(startCol) === 0) {\n        leftWideCharCount++;\n        startCol--;\n      }\n      if (bufferLine.getWidth(endCol) === 2) {\n        rightWideCharCount++;\n        endCol++;\n      }\n\n      // Adjust the end index for characters whose length are > 1 (emojis)\n      const length = bufferLine.getString(endCol).length;\n      if (length > 1) {\n        rightLongCharOffset += length - 1;\n        endIndex += length - 1;\n      }\n\n      // Expand the string in both directions until a space is hit\n      while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n        bufferLine.loadCell(startCol - 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 0) {\n          // If the next character is a wide char, record it and skip the column\n          leftWideCharCount++;\n          startCol--;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          leftLongCharOffset += length - 1;\n          startIndex -= length - 1;\n        }\n        startIndex--;\n        startCol--;\n      }\n      while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n        bufferLine.loadCell(endCol + 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 2) {\n          // If the next character is a wide char, record it and skip the column\n          rightWideCharCount++;\n          endCol++;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          rightLongCharOffset += length - 1;\n          endIndex += length - 1;\n        }\n        endIndex++;\n        endCol++;\n      }\n    }\n\n    // Incremenet the end index so it is at the start of the next character\n    endIndex++;\n\n    // Calculate the start _column_, converting the the string indexes back to\n    // column coordinates.\n    let start =\n        startIndex // The index of the selection's start char in the line string\n        + charOffset // The difference between the initial char's column and index\n        - leftWideCharCount // The number of wide chars left of the initial char\n        + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n    // Calculate the length in _columns_, converting the the string indexes back\n    // to column coordinates.\n    let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n      endIndex // The index of the selection's end char in the line string\n      - startIndex // The index of the selection's start char in the line string\n      + leftWideCharCount // The number of wide chars left of the initial char\n      + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n      - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n      - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n    if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n      return undefined;\n    }\n\n    // Recurse upwards if the line is wrapped and the word wraps to the above line\n    if (followWrappedLinesAbove) {\n      if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n        const previousBufferLine = buffer.lines.get(coords[1] - 1);\n        if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n          const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n          if (previousLineWordPosition) {\n            const offset = this._bufferService.cols - previousLineWordPosition.start;\n            start -= offset;\n            length += offset;\n          }\n        }\n      }\n    }\n\n    // Recurse downwards if the line is wrapped and the word wraps to the next line\n    if (followWrappedLinesBelow) {\n      if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n        const nextBufferLine = buffer.lines.get(coords[1] + 1);\n        if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n          const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n          if (nextLineWordPosition) {\n            length += nextLineWordPosition.length;\n          }\n        }\n      }\n    }\n\n    return { start, length };\n  }\n\n  /**\n   * Selects the word at the coordinates specified.\n   * @param coords The coordinates to get the word at.\n   * @param allowWhitespaceOnlySelection If whitespace should be selected\n   */\n  protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n    const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n    if (wordPosition) {\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        coords[1]--;\n      }\n      this._model.selectionStart = [wordPosition.start, coords[1]];\n      this._model.selectionStartLength = wordPosition.length;\n    }\n  }\n\n  /**\n   * Sets the selection end to the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _selectToWordAt(coords: [number, number]): void {\n    const wordPosition = this._getWordAt(coords, true);\n    if (wordPosition) {\n      let endRow = coords[1];\n\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        endRow--;\n      }\n\n      // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n      // case we're interested in the start of the word, not the end\n      if (!this._model.areSelectionValuesReversed()) {\n        while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n          wordPosition.length -= this._bufferService.cols;\n          endRow++;\n        }\n      }\n\n      this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n    }\n  }\n\n  /**\n   * Gets whether the character is considered a word separator by the select\n   * word logic.\n   * @param cell The cell to check.\n   */\n  private _isCharWordSeparator(cell: CellData): boolean {\n    // Zero width characters are never separators as they are always to the\n    // right of wide characters\n    if (cell.getWidth() === 0) {\n      return false;\n    }\n    return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n  }\n\n  /**\n   * Selects the line specified.\n   * @param line The line index.\n   */\n  protected _selectLineAt(line: number): void {\n    const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n    const range: IBufferRange = {\n      start: { x: 0, y: wrappedRange.first },\n      end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n    };\n    this._model.selectionStart = [0, wrappedRange.first];\n    this._model.selectionEnd = undefined;\n    this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable } from 'common/Types';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n  serviceBrand: undefined;\n\n  readonly width: number;\n  readonly height: number;\n  readonly hasValidSize: boolean;\n\n  readonly onCharSizeChange: IEvent<void>;\n\n  measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n  serviceBrand: undefined;\n\n  readonly isFocused: boolean;\n  /**\n   * Parent window that the terminal is rendered into. DOM and rendering APIs\n   * (e.g. requestAnimationFrame) should be invoked in the context of this\n   * window.\n   */\n  readonly window: Window & typeof globalThis;\n  /**\n   * Helper for getting the devicePixelRatio of the parent window.\n   */\n  readonly dpr: number;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n  serviceBrand: undefined;\n\n  getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n  getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n  serviceBrand: undefined;\n\n  onDimensionsChange: IEvent<IRenderDimensions>;\n  /**\n   * Fires when buffer changes are rendered. This does not fire when only cursor\n   * or selections are rendered.\n   */\n  onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n  /**\n   * Fires on render\n   */\n  onRender: IEvent<{ start: number, end: number }>;\n  onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n  dimensions: IRenderDimensions;\n\n  addRefreshCallback(callback: FrameRequestCallback): number;\n\n  refreshRows(start: number, end: number): void;\n  clearTextureAtlas(): void;\n  resize(cols: number, rows: number): void;\n  hasRenderer(): boolean;\n  setRenderer(renderer: IRenderer): void;\n  handleDevicePixelRatioChange(): void;\n  handleResize(cols: number, rows: number): void;\n  handleCharSizeChanged(): void;\n  handleBlur(): void;\n  handleFocus(): void;\n  handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n  handleCursorMove(): void;\n  clear(): void;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n  serviceBrand: undefined;\n\n  readonly selectionText: string;\n  readonly hasSelection: boolean;\n  readonly selectionStart: [number, number] | undefined;\n  readonly selectionEnd: [number, number] | undefined;\n\n  readonly onLinuxMouseSelection: IEvent<string>;\n  readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n  readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n  readonly onSelectionChange: IEvent<void>;\n\n  disable(): void;\n  enable(): void;\n  reset(): void;\n  setSelection(row: number, col: number, length: number): void;\n  selectAll(): void;\n  selectLines(start: number, end: number): void;\n  clearSelection(): void;\n  rightClickSelect(event: MouseEvent): void;\n  shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n  shouldForceSelection(event: MouseEvent): boolean;\n  refresh(isLinuxMouseSelection?: boolean): void;\n  handleMouseDown(event: MouseEvent): void;\n  isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n  serviceBrand: undefined;\n\n  register(handler: (text: string) => [number, number][]): number;\n  deregister(joinerId: number): boolean;\n  getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator<IThemeService>('ThemeService');\nexport interface IThemeService {\n  serviceBrand: undefined;\n\n  readonly colors: ReadonlyColorSet;\n\n  readonly onChangeColors: IEvent<ReadonlyColorSet>;\n\n  restoreColor(slot?: AllColorIndex): void;\n  /**\n   * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n   * prevent accidental writes.\n   */\n  modifyColors(callback: (colors: IColorSet) => void): void;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\nimport { IThemeService } from 'browser/services/Services';\nimport { IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { channels, color, css, NULL_COLOR } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IOptionsService, ITheme } from 'common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from 'common/Types';\n\ninterface IRestoreColorSet {\n  foreground: IColor;\n  background: IColor;\n  cursor: IColor;\n  ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = css.toColor('#000000');\nconst DEFAULT_SELECTION = {\n  css: 'rgba(255, 255, 255, 0.3)',\n  rgba: 0xFFFFFF4D\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n  const colors = [\n    // dark:\n    css.toColor('#2e3436'),\n    css.toColor('#cc0000'),\n    css.toColor('#4e9a06'),\n    css.toColor('#c4a000'),\n    css.toColor('#3465a4'),\n    css.toColor('#75507b'),\n    css.toColor('#06989a'),\n    css.toColor('#d3d7cf'),\n    // bright:\n    css.toColor('#555753'),\n    css.toColor('#ef2929'),\n    css.toColor('#8ae234'),\n    css.toColor('#fce94f'),\n    css.toColor('#729fcf'),\n    css.toColor('#ad7fa8'),\n    css.toColor('#34e2e2'),\n    css.toColor('#eeeeec')\n  ];\n\n  // Fill in the remaining 240 ANSI colors.\n  // Generate colors (16-231)\n  const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n  for (let i = 0; i < 216; i++) {\n    const r = v[(i / 36) % 6 | 0];\n    const g = v[(i / 6) % 6 | 0];\n    const b = v[i % 6];\n    colors.push({\n      css: channels.toCss(r, g, b),\n      rgba: channels.toRgba(r, g, b)\n    });\n  }\n\n  // Generate greys (232-255)\n  for (let i = 0; i < 24; i++) {\n    const c = 8 + i * 10;\n    colors.push({\n      css: channels.toCss(c, c, c),\n      rgba: channels.toRgba(c, c, c)\n    });\n  }\n\n  return colors;\n})());\n\nexport class ThemeService extends Disposable implements IThemeService {\n  public serviceBrand: undefined;\n\n  private _colors: IColorSet;\n  private _contrastCache: IColorContrastCache = new ColorContrastCache();\n  private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n  private _restoreColors!: IRestoreColorSet;\n\n  public get colors(): ReadonlyColorSet { return this._colors; }\n\n  private readonly _onChangeColors = this.register(new EventEmitter<ReadonlyColorSet>());\n  public readonly onChangeColors = this._onChangeColors.event;\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n\n    this._colors = {\n      foreground: DEFAULT_FOREGROUND,\n      background: DEFAULT_BACKGROUND,\n      cursor: DEFAULT_CURSOR,\n      cursorAccent: DEFAULT_CURSOR_ACCENT,\n      selectionForeground: undefined,\n      selectionBackgroundTransparent: DEFAULT_SELECTION,\n      selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n      selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      ansi: DEFAULT_ANSI_COLORS.slice(),\n      contrastCache: this._contrastCache,\n      halfContrastCache: this._halfContrastCache\n    };\n    this._updateRestoreColors();\n    this._setTheme(this._optionsService.rawOptions.theme);\n\n    this.register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n    this.register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n  }\n\n  /**\n   * Sets the terminal's theme.\n   * @param theme The  theme to use. If a partial theme is provided then default\n   * colors will be used where colors are not defined.\n   */\n  private _setTheme(theme: ITheme = {}): void {\n    const colors = this._colors;\n    colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n    colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n    colors.cursor = parseColor(theme.cursor, DEFAULT_CURSOR);\n    colors.cursorAccent = parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT);\n    colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n    colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n    colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n    if (colors.selectionForeground === NULL_COLOR) {\n      colors.selectionForeground = undefined;\n    }\n\n    /**\n     * If selection color is opaque, blend it with background with 0.3 opacity\n     * Issue #2737\n     */\n    if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n    }\n    if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n    }\n    colors.ansi = DEFAULT_ANSI_COLORS.slice();\n    colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n    colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n    colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n    colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n    colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n    colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n    colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n    colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n    colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n    colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n    colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n    colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n    colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n    colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n    colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n    colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n    if (theme.extendedAnsi) {\n      const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n      for (let i = 0; i < colorCount; i++) {\n        colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n      }\n    }\n    // Clear our the cache\n    this._contrastCache.clear();\n    this._halfContrastCache.clear();\n    this._updateRestoreColors();\n    this._onChangeColors.fire(this.colors);\n  }\n\n  public restoreColor(slot?: AllColorIndex): void {\n    this._restoreColor(slot);\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _restoreColor(slot: AllColorIndex | undefined): void {\n    // unset slot restores all ansi colors\n    if (slot === undefined) {\n      for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n        this._colors.ansi[i] = this._restoreColors.ansi[i];\n      }\n      return;\n    }\n    switch (slot) {\n      case SpecialColorIndex.FOREGROUND:\n        this._colors.foreground = this._restoreColors.foreground;\n        break;\n      case SpecialColorIndex.BACKGROUND:\n        this._colors.background = this._restoreColors.background;\n        break;\n      case SpecialColorIndex.CURSOR:\n        this._colors.cursor = this._restoreColors.cursor;\n        break;\n      default:\n        this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n    }\n  }\n\n  public modifyColors(callback: (colors: IColorSet) => void): void {\n    callback(this._colors);\n    // Assume the change happened\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _updateRestoreColors(): void {\n    this._restoreColors = {\n      foreground: this._colors.foreground,\n      background: this._colors.background,\n      cursor: this._colors.cursor,\n      ansi: this._colors.ansi.slice()\n    };\n  }\n}\n\nfunction parseColor(\n  cssString: string | undefined,\n  fallback: IColor\n): IColor {\n  if (cssString !== undefined) {\n    try {\n      return css.toColor(cssString);\n    } catch {\n      // no-op\n    }\n  }\n  return fallback;\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\n\nexport interface IInsertEvent {\n  index: number;\n  amount: number;\n}\n\nexport interface IDeleteEvent {\n  index: number;\n  amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> extends Disposable implements ICircularList<T> {\n  protected _array: (T | undefined)[];\n  private _startIndex: number;\n  private _length: number;\n\n  public readonly onDeleteEmitter = this.register(new EventEmitter<IDeleteEvent>());\n  public readonly onDelete = this.onDeleteEmitter.event;\n  public readonly onInsertEmitter = this.register(new EventEmitter<IInsertEvent>());\n  public readonly onInsert = this.onInsertEmitter.event;\n  public readonly onTrimEmitter = this.register(new EventEmitter<number>());\n  public readonly onTrim = this.onTrimEmitter.event;\n\n  constructor(\n    private _maxLength: number\n  ) {\n    super();\n    this._array = new Array<T>(this._maxLength);\n    this._startIndex = 0;\n    this._length = 0;\n  }\n\n  public get maxLength(): number {\n    return this._maxLength;\n  }\n\n  public set maxLength(newMaxLength: number) {\n    // There was no change in maxLength, return early.\n    if (this._maxLength === newMaxLength) {\n      return;\n    }\n\n    // Reconstruct array, starting at index 0. Only transfer values from the\n    // indexes 0 to length.\n    const newArray = new Array<T | undefined>(newMaxLength);\n    for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n      newArray[i] = this._array[this._getCyclicIndex(i)];\n    }\n    this._array = newArray;\n    this._maxLength = newMaxLength;\n    this._startIndex = 0;\n  }\n\n  public get length(): number {\n    return this._length;\n  }\n\n  public set length(newLength: number) {\n    if (newLength > this._length) {\n      for (let i = this._length; i < newLength; i++) {\n        this._array[i] = undefined;\n      }\n    }\n    this._length = newLength;\n  }\n\n  /**\n   * Gets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index of the value to get.\n   * @returns The value corresponding to the index.\n   */\n  public get(index: number): T | undefined {\n    return this._array[this._getCyclicIndex(index)];\n  }\n\n  /**\n   * Sets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index to set.\n   * @param value The value to set.\n   */\n  public set(index: number, value: T | undefined): void {\n    this._array[this._getCyclicIndex(index)] = value;\n  }\n\n  /**\n   * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n   * if the maximum length is reached.\n   * @param value The value to push onto the list.\n   */\n  public push(value: T): void {\n    this._array[this._getCyclicIndex(this._length)] = value;\n    if (this._length === this._maxLength) {\n      this._startIndex = ++this._startIndex % this._maxLength;\n      this.onTrimEmitter.fire(1);\n    } else {\n      this._length++;\n    }\n  }\n\n  /**\n   * Advance ringbuffer index and return current element for recycling.\n   * Note: The buffer must be full for this method to work.\n   * @throws When the buffer is not full.\n   */\n  public recycle(): T {\n    if (this._length !== this._maxLength) {\n      throw new Error('Can only recycle when the buffer is full');\n    }\n    this._startIndex = ++this._startIndex % this._maxLength;\n    this.onTrimEmitter.fire(1);\n    return this._array[this._getCyclicIndex(this._length - 1)]!;\n  }\n\n  /**\n   * Ringbuffer is at max length.\n   */\n  public get isFull(): boolean {\n    return this._length === this._maxLength;\n  }\n\n  /**\n   * Removes and returns the last value on the list.\n   * @returns The popped value.\n   */\n  public pop(): T | undefined {\n    return this._array[this._getCyclicIndex(this._length-- - 1)];\n  }\n\n  /**\n   * Deletes and/or inserts items at a particular index (in that order). Unlike\n   * Array.prototype.splice, this operation does not return the deleted items as a new array in\n   * order to save creating a new array. Note that this operation may shift all values in the list\n   * in the worst case.\n   * @param start The index to delete and/or insert.\n   * @param deleteCount The number of elements to delete.\n   * @param items The items to insert.\n   */\n  public splice(start: number, deleteCount: number, ...items: T[]): void {\n    // Delete items\n    if (deleteCount) {\n      for (let i = start; i < this._length - deleteCount; i++) {\n        this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n      }\n      this._length -= deleteCount;\n      this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n    }\n\n    // Add items\n    for (let i = this._length - 1; i >= start; i--) {\n      this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n    }\n    for (let i = 0; i < items.length; i++) {\n      this._array[this._getCyclicIndex(start + i)] = items[i];\n    }\n    if (items.length) {\n      this.onInsertEmitter.fire({ index: start, amount: items.length });\n    }\n\n    // Adjust length as needed\n    if (this._length + items.length > this._maxLength) {\n      const countToTrim = (this._length + items.length) - this._maxLength;\n      this._startIndex += countToTrim;\n      this._length = this._maxLength;\n      this.onTrimEmitter.fire(countToTrim);\n    } else {\n      this._length += items.length;\n    }\n  }\n\n  /**\n   * Trims a number of items from the start of the list.\n   * @param count The number of items to remove.\n   */\n  public trimStart(count: number): void {\n    if (count > this._length) {\n      count = this._length;\n    }\n    this._startIndex += count;\n    this._length -= count;\n    this.onTrimEmitter.fire(count);\n  }\n\n  public shiftElements(start: number, count: number, offset: number): void {\n    if (count <= 0) {\n      return;\n    }\n    if (start < 0 || start >= this._length) {\n      throw new Error('start argument out of range');\n    }\n    if (start + offset < 0) {\n      throw new Error('Cannot shift elements in list beyond index 0');\n    }\n\n    if (offset > 0) {\n      for (let i = count - 1; i >= 0; i--) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n      const expandListBy = (start + count + offset) - this._length;\n      if (expandListBy > 0) {\n        this._length += expandListBy;\n        while (this._length > this._maxLength) {\n          this._length--;\n          this._startIndex++;\n          this.onTrimEmitter.fire(1);\n        }\n      }\n    } else {\n      for (let i = 0; i < count; i++) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n    }\n  }\n\n  /**\n   * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n   * backing array to get the element associated with the regular index.\n   * @param index The regular index.\n   * @returns The cyclic index.\n   */\n  private _getCyclicIndex(index: number): number {\n    return (this._startIndex + index) % this._maxLength;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n  if (typeof val !== 'object') {\n    return val;\n  }\n\n  // If we're cloning an array, use an array as the base, otherwise use an object\n  const clonedObject: any = Array.isArray(val) ? [] : {};\n\n  for (const key in val) {\n    // Recursively clone eack item unless we're at the maximum depth\n    clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));\n  }\n\n  return clonedObject as T;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n  export function toCss(r: number, g: number, b: number, a?: number): string {\n    if (a !== undefined) {\n      return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n    }\n    return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n  }\n\n  export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n    // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n    // on LE systems, before it can be used for direct 32-bit buffer writes.\n    // >>> 0 forces an unsigned int\n    return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n  }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n  export function blend(bg: IColor, fg: IColor): IColor {\n    $a = (fg.rgba & 0xFF) / 255;\n    if ($a === 1) {\n      return {\n        css: fg.css,\n        rgba: fg.rgba\n      };\n    }\n    const fgR = (fg.rgba >> 24) & 0xFF;\n    const fgG = (fg.rgba >> 16) & 0xFF;\n    const fgB = (fg.rgba >> 8) & 0xFF;\n    const bgR = (bg.rgba >> 24) & 0xFF;\n    const bgG = (bg.rgba >> 16) & 0xFF;\n    const bgB = (bg.rgba >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    const css = channels.toCss($r, $g, $b);\n    const rgba = channels.toRgba($r, $g, $b);\n    return { css, rgba };\n  }\n\n  export function isOpaque(color: IColor): boolean {\n    return (color.rgba & 0xFF) === 0xFF;\n  }\n\n  export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n    const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n    if (!result) {\n      return undefined;\n    }\n    return rgba.toColor(\n      (result >> 24 & 0xFF),\n      (result >> 16 & 0xFF),\n      (result >> 8  & 0xFF)\n    );\n  }\n\n  export function opaque(color: IColor): IColor {\n    const rgbaColor = (color.rgba | 0xFF) >>> 0;\n    [$r, $g, $b] = rgba.toChannels(rgbaColor);\n    return {\n      css: channels.toCss($r, $g, $b),\n      rgba: rgbaColor\n    };\n  }\n\n  export function opacity(color: IColor, opacity: number): IColor {\n    $a = Math.round(opacity * 0xFF);\n    [$r, $g, $b] = rgba.toChannels(color.rgba);\n    return {\n      css: channels.toCss($r, $g, $b, $a),\n      rgba: channels.toRgba($r, $g, $b, $a)\n    };\n  }\n\n  export function multiplyOpacity(color: IColor, factor: number): IColor {\n    $a = color.rgba & 0xFF;\n    return opacity(color, ($a * factor) / 0xFF);\n  }\n\n  export function toColorRGB(color: IColor): IColorRGB {\n    return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n  }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  if (!isNode) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return rgba.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $a = parseInt(css.slice(4, 5).repeat(2), 16);\n          return rgba.toColor($r, $g, $b, $a);\n        }\n        case 7: // #rrggbb\n          return {\n            css,\n            rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n          };\n        case 9: // #rrggbbaa\n          return {\n            css,\n            rgba: parseInt(css.slice(1), 16) >>> 0\n          };\n      }\n    }\n\n    // Formats: rgb() or rgba()\n    const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n    if (rgbaMatch) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return rgba.toColor($r, $g, $b, $a);\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param rgb The color to use.\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance(rgb: number): number {\n    return relativeLuminance2(\n      (rgb >> 16) & 0xFF,\n      (rgb >> 8 ) & 0xFF,\n      (rgb      ) & 0xFF);\n  }\n\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param r The red channel (0x00 to 0xFF).\n   * @param g The green channel (0x00 to 0xFF).\n   * @param b The blue channel (0x00 to 0xFF).\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance2(r: number, g: number, b: number): number {\n    const rs = r / 255;\n    const gs = g / 255;\n    const bs = b / 255;\n    const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n    const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n    const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n    return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n  /**\n   * Given a foreground color and a background color, either increase or reduce the luminance of the\n   * foreground color until the specified contrast ratio is met. If pure white or black is hit\n   * without the contrast ratio being met, go the other direction using the background color as the\n   * foreground color and take either the first or second result depending on which has the higher\n   * contrast ratio.\n   *\n   * `undefined` will be returned if the contrast ratio is already met.\n   *\n   * @param bgRgba The background color in rgba format.\n   * @param fgRgba The foreground color in rgba format.\n   * @param ratio The contrast ratio to achieve.\n   */\n  export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n    const bgL = rgb.relativeLuminance(bgRgba >> 8);\n    const fgL = rgb.relativeLuminance(fgRgba >> 8);\n    const cr = contrastRatio(bgL, fgL);\n    if (cr < ratio) {\n      if (fgL < bgL) {\n        const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n        if (resultARatio < ratio) {\n          const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n          const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n          return resultARatio > resultBRatio ? resultA : resultB;\n        }\n        return resultA;\n      }\n      const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n      const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n      if (resultARatio < ratio) {\n        const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n        return resultARatio > resultBRatio ? resultA : resultB;\n      }\n      return resultA;\n    }\n    return undefined;\n  }\n\n  export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to reducing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n      // Reduce by 10% until the ratio is hit\n      fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n      fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n      fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to increasing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n      // Increase by 10% until the ratio is hit\n      fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n      fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n      fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  // FIXME: Move this to channels NS?\n  export function toChannels(value: number): [number, number, number, number] {\n    return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n  }\n\n  export function toColor(r: number, g: number, b: number, a?: number): IColor {\n    return {\n      css: channels.toCss(r, g, b, a),\n      rgba: channels.toRgba(r, g, b, a)\n    };\n  }\n}\n\nexport function toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n  if (l1 < l2) {\n    return (l2 + 0.05) / (l1 + 0.05);\n  }\n  return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent, ScrollSource } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\nimport { OscLinkService } from 'common/services/OscLinkService';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n  protected readonly _instantiationService: IInstantiationService;\n  protected readonly _bufferService: IBufferService;\n  protected readonly _logService: ILogService;\n  protected readonly _charsetService: ICharsetService;\n  protected readonly _oscLinkService: IOscLinkService;\n\n  public readonly coreMouseService: ICoreMouseService;\n  public readonly coreService: ICoreService;\n  public readonly unicodeService: IUnicodeService;\n  public readonly optionsService: IOptionsService;\n\n  protected _inputHandler: InputHandler;\n  private _writeBuffer: WriteBuffer;\n  private _windowsWrappingHeuristics = this.register(new MutableDisposable());\n\n  private readonly _onBinary = this.register(new EventEmitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onData = this.register(new EventEmitter<string>());\n  public readonly onData = this._onData.event;\n  protected _onLineFeed = this.register(new EventEmitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());\n  public readonly onResize = this._onResize.event;\n  protected readonly _onWriteParsed = this.register(new EventEmitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  /**\n   * Internally we track the source of the scroll but this is meaningless outside the library so\n   * it's filtered out.\n   */\n  protected _onScrollApi?: EventEmitter<number, void>;\n  protected _onScroll = this.register(new EventEmitter<IScrollEvent, void>());\n  public get onScroll(): IEvent<number, void> {\n    if (!this._onScrollApi) {\n      this._onScrollApi = this.register(new EventEmitter<number, void>());\n      this._onScroll.event(ev => {\n        this._onScrollApi?.fire(ev.position);\n      });\n    }\n    return this._onScrollApi.event;\n  }\n\n  public get cols(): number { return this._bufferService.cols; }\n  public get rows(): number { return this._bufferService.rows; }\n  public get buffers(): IBufferSet { return this._bufferService.buffers; }\n  public get options(): Required<ITerminalOptions> { return this.optionsService.options; }\n  public set options(options: ITerminalOptions) {\n    for (const key in options) {\n      this.optionsService.options[key] = options[key];\n    }\n  }\n\n  constructor(\n    options: Partial<ITerminalOptions>\n  ) {\n    super();\n\n    // Setup and initialize services\n    this._instantiationService = new InstantiationService();\n    this.optionsService = this.register(new OptionsService(options));\n    this._instantiationService.setService(IOptionsService, this.optionsService);\n    this._bufferService = this.register(this._instantiationService.createInstance(BufferService));\n    this._instantiationService.setService(IBufferService, this._bufferService);\n    this._logService = this.register(this._instantiationService.createInstance(LogService));\n    this._instantiationService.setService(ILogService, this._logService);\n    this.coreService = this.register(this._instantiationService.createInstance(CoreService));\n    this._instantiationService.setService(ICoreService, this.coreService);\n    this.coreMouseService = this.register(this._instantiationService.createInstance(CoreMouseService));\n    this._instantiationService.setService(ICoreMouseService, this.coreMouseService);\n    this.unicodeService = this.register(this._instantiationService.createInstance(UnicodeService));\n    this._instantiationService.setService(IUnicodeService, this.unicodeService);\n    this._charsetService = this._instantiationService.createInstance(CharsetService);\n    this._instantiationService.setService(ICharsetService, this._charsetService);\n    this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n    this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n    // Register input handler and handle/forward events\n    this._inputHandler = this.register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService));\n    this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));\n    this.register(this._inputHandler);\n\n    // Setup listeners\n    this.register(forwardEvent(this._bufferService.onResize, this._onResize));\n    this.register(forwardEvent(this.coreService.onData, this._onData));\n    this.register(forwardEvent(this.coreService.onBinary, this._onBinary));\n    this.register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom()));\n    this.register(this.coreService.onUserInput(() =>  this._writeBuffer.handleUserInput()));\n    this.register(this.optionsService.onMultipleOptionChange(['windowsMode', 'windowsPty'], () => this._handleWindowsPtyOptionChange()));\n    this.register(this._bufferService.onScroll(event => {\n      this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n      this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n    }));\n    this.register(this._inputHandler.onScroll(event => {\n      this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n      this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n    }));\n\n    // Setup WriteBuffer\n    this._writeBuffer = this.register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n    this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._writeBuffer.write(data, callback);\n  }\n\n  /**\n   * Write data to terminal synchonously.\n   *\n   * This method is unreliable with async parser handlers, thus should not\n   * be used anymore. If you need blocking semantics on data input consider\n   * `write` with a callback instead.\n   *\n   * @deprecated Unreliable, will be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n      this._logService.warn('writeSync is unreliable and will be removed soon.');\n      hasWriteSyncWarnHappened = true;\n    }\n    this._writeBuffer.writeSync(data, maxSubsequentCalls);\n  }\n\n  public resize(x: number, y: number): void {\n    if (isNaN(x) || isNaN(y)) {\n      return;\n    }\n\n    x = Math.max(x, MINIMUM_COLS);\n    y = Math.max(y, MINIMUM_ROWS);\n\n    this._bufferService.resize(x, y);\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    this._bufferService.scroll(eraseAttr, isWrapped);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n   * unwanted events being handled by the viewport when the event was triggered from the viewport\n   * originally.\n   * @param source Which component the event came from.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n    this._bufferService.scrollLines(disp, suppressScrollEvent, source);\n  }\n\n  public scrollPages(pageCount: number): void {\n    this.scrollLines(pageCount * (this.rows - 1));\n  }\n\n  public scrollToTop(): void {\n    this.scrollLines(-this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToBottom(): void {\n    this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToLine(line: number): void {\n    const scrollAmount = line - this._bufferService.buffer.ydisp;\n    if (scrollAmount !== 0) {\n      this.scrollLines(scrollAmount);\n    }\n  }\n\n  /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerEscHandler(id, callback);\n  }\n\n  /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerDcsHandler(id, callback);\n  }\n\n  /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerCsiHandler(id, callback);\n  }\n\n  /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerOscHandler(ident, callback);\n  }\n\n  protected _setup(): void {\n    this._handleWindowsPtyOptionChange();\n  }\n\n  public reset(): void {\n    this._inputHandler.reset();\n    this._bufferService.reset();\n    this._charsetService.reset();\n    this.coreService.reset();\n    this.coreMouseService.reset();\n  }\n\n\n  private _handleWindowsPtyOptionChange(): void {\n    let value = false;\n    const windowsPty = this.optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber !== undefined && windowsPty.buildNumber !== undefined) {\n      value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n    } else if (this.optionsService.rawOptions.windowsMode) {\n      value = true;\n    }\n    if (value) {\n      this._enableWindowsWrappingHeuristics();\n    } else {\n      this._windowsWrappingHeuristics.clear();\n    }\n  }\n\n  protected _enableWindowsWrappingHeuristics(): void {\n    if (!this._windowsWrappingHeuristics.value) {\n      const disposables: IDisposable[] = [];\n      disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n      disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n        updateWindowsModeWrappedState(this._bufferService);\n        return false;\n      }));\n      this._windowsWrappingHeuristics.value = toDisposable(() => {\n        for (const d of disposables) {\n          d.dispose();\n        }\n      });\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n  (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n  (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n  event: IEvent<T, U>;\n  fire(arg1: T, arg2: U): void;\n  dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n  private _listeners: IListener<T, U>[] = [];\n  private _event?: IEvent<T, U>;\n  private _disposed: boolean = false;\n\n  public get event(): IEvent<T, U> {\n    if (!this._event) {\n      this._event = (listener: (arg1: T, arg2: U) => any) => {\n        this._listeners.push(listener);\n        const disposable = {\n          dispose: () => {\n            if (!this._disposed) {\n              for (let i = 0; i < this._listeners.length; i++) {\n                if (this._listeners[i] === listener) {\n                  this._listeners.splice(i, 1);\n                  return;\n                }\n              }\n            }\n          }\n        };\n        return disposable;\n      };\n    }\n    return this._event;\n  }\n\n  public fire(arg1: T, arg2: U): void {\n    const queue: IListener<T, U>[] = [];\n    for (let i = 0; i < this._listeners.length; i++) {\n      queue.push(this._listeners[i]);\n    }\n    for (let i = 0; i < queue.length; i++) {\n      queue[i].call(undefined, arg1, arg2);\n    }\n  }\n\n  public dispose(): void {\n    this.clearListeners();\n    this._disposed = true;\n  }\n\n  public clearListeners(): void {\n    if (this._listeners) {\n      this._listeners.length = 0;\n    }\n  }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n  return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, ICoreMouseService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\nimport { IBuffer } from 'common/buffer/Types';\nimport { parseColor } from 'common/input/XParseColor';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y   ESC   CSI   \"Control Sequence Introducer\"   \"ESC [\"   \"Start of a CSI sequence.\"\n// @vt: #Y   ESC   OSC   \"Operating System Command\"      \"ESC ]\"   \"Start of an OSC sequence.\"\n// @vt: #Y   ESC   DCS   \"Device Control String\"         \"ESC P\"   \"Start of a DCS sequence.\"\n// @vt: #Y   ESC   ST    \"String Terminator\"             \"ESC \\\"   \"Terminator used for string type sequences.\"\n// @vt: #Y   ESC   PM    \"Privacy Message\"               \"ESC ^\"   \"Start of a privacy message.\"\n// @vt: #Y   ESC   APC   \"Application Program Command\"   \"ESC _\"   \"Start of an APC sequence.\"\n// @vt: #Y   C1    CSI   \"Control Sequence Introducer\"   \"\\x9B\"    \"Start of a CSI sequence.\"\n// @vt: #Y   C1    OSC   \"Operating System Command\"      \"\\x9D\"    \"Start of an OSC sequence.\"\n// @vt: #Y   C1    DCS   \"Device Control String\"         \"\\x90\"    \"Start of a DCS sequence.\"\n// @vt: #Y   C1    ST    \"String Terminator\"             \"\\x9C\"    \"Terminator used for string type sequences.\"\n// @vt: #Y   C1    PM    \"Privacy Message\"               \"\\x9E\"    \"Start of a privacy message.\"\n// @vt: #Y   C1    APC   \"Application Program Command\"   \"\\x9F\"    \"Start of an APC sequence.\"\n// @vt: #Y   C0    NUL   \"Null\"                          \"\\0, \\x00\"  \"NUL is ignored.\"\n// @vt: #Y   C0    ESC   \"Escape\"                        \"\\e, \\x1B\"  \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #E[Supported via xterm-addon-image.]  DCS   SIXEL       \"SIXEL Graphics\"          \"DCS Ps ; Ps ; Ps ; q \tPt ST\"  \"Draw SIXEL image.\"\n// @vt: #N  DCS   DECUDK      \"User Defined Keys\"       \"DCS Ps ; Ps \\| Pt ST\"           \"Definitions for user-defined keys.\"\n// @vt: #N  DCS   XTGETTCAP   \"Request Terminfo String\" \"DCS + q Pt ST\"                 \"Request Terminfo String.\"\n// @vt: #N  DCS   XTSETTCAP   \"Set Terminfo Data\"       \"DCS + p Pt ST\"                 \"Set Terminfo Data.\"\n// @vt: #N  OSC   1           \"Set Icon Name\"           \"OSC 1 ; Pt BEL\"                \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n  if (n > 24) {\n    return opts.setWinLines || false;\n  }\n  switch (n) {\n    case 1: return !!opts.restoreWin;\n    case 2: return !!opts.minimizeWin;\n    case 3: return !!opts.setWinPosition;\n    case 4: return !!opts.setWinSizePixels;\n    case 5: return !!opts.raiseWin;\n    case 6: return !!opts.lowerWin;\n    case 7: return !!opts.refreshWin;\n    case 8: return !!opts.setWinSizeChars;\n    case 9: return !!opts.maximizeWin;\n    case 10: return !!opts.fullscreenWin;\n    case 11: return !!opts.getWinState;\n    case 13: return !!opts.getWinPosition;\n    case 14: return !!opts.getWinSizePixels;\n    case 15: return !!opts.getScreenSizePixels;\n    case 16: return !!opts.getCellSizePixels;\n    case 18: return !!opts.getWinSizeChars;\n    case 19: return !!opts.getScreenSizeChars;\n    case 20: return !!opts.getIconTitle;\n    case 21: return !!opts.getWinTitle;\n    case 22: return !!opts.pushTitle;\n    case 23: return !!opts.popTitle;\n    case 24: return !!opts.setWinLines;\n  }\n  return false;\n}\n\nexport enum WindowsOptionsReportType {\n  GET_WIN_SIZE_PIXELS = 0,\n  GET_CELL_SIZE_PIXELS = 1\n}\n\n// create a warning log if an async handler takes longer than the limit (in ms)\nconst SLOW_ASYNC_LIMIT = 5000;\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n  private _parseBuffer: Uint32Array = new Uint32Array(4096);\n  private _stringDecoder: StringToUtf32 = new StringToUtf32();\n  private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n  private _workCell: CellData = new CellData();\n  private _windowTitle = '';\n  private _iconName = '';\n  private _dirtyRowTracker: IDirtyRowTracker;\n  protected _windowTitleStack: string[] = [];\n  protected _iconNameStack: string[] = [];\n\n  private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n  public getAttrData(): IAttributeData { return this._curAttrData; }\n  private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n  private _activeBuffer: IBuffer;\n\n  private readonly _onRequestBell = this.register(new EventEmitter<void>());\n  public readonly onRequestBell = this._onRequestBell.event;\n  private readonly _onRequestRefreshRows = this.register(new EventEmitter<number, number>());\n  public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n  private readonly _onRequestReset = this.register(new EventEmitter<void>());\n  public readonly onRequestReset = this._onRequestReset.event;\n  private readonly _onRequestSendFocus = this.register(new EventEmitter<void>());\n  public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n  private readonly _onRequestSyncScrollBar = this.register(new EventEmitter<void>());\n  public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n  private readonly _onRequestWindowsOptionsReport = this.register(new EventEmitter<WindowsOptionsReportType>());\n  public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n  private readonly _onA11yChar = this.register(new EventEmitter<string>());\n  public readonly onA11yChar = this._onA11yChar.event;\n  private readonly _onA11yTab = this.register(new EventEmitter<number>());\n  public readonly onA11yTab = this._onA11yTab.event;\n  private readonly _onCursorMove = this.register(new EventEmitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onLineFeed = this.register(new EventEmitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  private readonly _onScroll = this.register(new EventEmitter<number>());\n  public readonly onScroll = this._onScroll.event;\n  private readonly _onTitleChange = this.register(new EventEmitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onColor = this.register(new EventEmitter<IColorEvent>());\n  public readonly onColor = this._onColor.event;\n\n  private _parseStack: IParseStack = {\n    paused: false,\n    cursorStartX: 0,\n    cursorStartY: 0,\n    decodedLength: 0,\n    position: 0\n  };\n\n  constructor(\n    private readonly _bufferService: IBufferService,\n    private readonly _charsetService: ICharsetService,\n    private readonly _coreService: ICoreService,\n    private readonly _logService: ILogService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _oscLinkService: IOscLinkService,\n    private readonly _coreMouseService: ICoreMouseService,\n    private readonly _unicodeService: IUnicodeService,\n    private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n  ) {\n    super();\n    this.register(this._parser);\n    this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n    // Track properties used in performance critical code manually to avoid using slow getters\n    this._activeBuffer = this._bufferService.buffer;\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n    /**\n     * custom fallback handlers\n     */\n    this._parser.setCsiHandlerFallback((ident, params) => {\n      this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n    });\n    this._parser.setEscHandlerFallback(ident => {\n      this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n    });\n    this._parser.setExecuteHandlerFallback(code => {\n      this._logService.debug('Unknown EXECUTE code: ', { code });\n    });\n    this._parser.setOscHandlerFallback((identifier, action, data) => {\n      this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n    });\n    this._parser.setDcsHandlerFallback((ident, action, payload) => {\n      if (action === 'HOOK') {\n        payload = payload.toArray();\n      }\n      this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n    });\n\n    /**\n     * print handler\n     */\n    this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n    /**\n     * CSI handler\n     */\n    this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n    this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n    this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n    this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n    this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n    this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n    this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n    this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n    this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n    this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n    this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n    this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n    this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n    this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n    this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n    this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n    this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n    this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n    this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n    this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n    this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n    this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n    this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n    this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n    this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n    this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n    this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n    this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n    this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n    this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n    this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n    this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n    /**\n     * execute handler\n     */\n    this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n    this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n    this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n    this._parser.setExecuteHandler(C0.HT, () => this.tab());\n    this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n    this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n    // FIXME:   What do to with missing? Old code just added those to print.\n\n    this._parser.setExecuteHandler(C1.IND, () => this.index());\n    this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n    this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n    /**\n     * OSC handler\n     */\n    //   0 - icon name + title\n    this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n    //   1 - icon name\n    this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n    //   2 - title\n    this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n    //   3 - set property X in the form \"prop=value\"\n    //   4 - Change Color Number\n    this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n    //   5 - Change Special Color Number\n    //   6 - Enable/disable Special Color Number c\n    //   7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n    //   8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n    this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n    //  10 - Change VT100 text foreground color to Pt.\n    this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n    //  11 - Change VT100 text background color to Pt.\n    this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n    //  12 - Change text cursor color to Pt.\n    this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n    //  13 - Change mouse foreground color to Pt.\n    //  14 - Change mouse background color to Pt.\n    //  15 - Change Tektronix foreground color to Pt.\n    //  16 - Change Tektronix background color to Pt.\n    //  17 - Change highlight background color to Pt.\n    //  18 - Change Tektronix cursor color to Pt.\n    //  19 - Change highlight foreground color to Pt.\n    //  46 - Change Log File to Pt.\n    //  50 - Set Font to Pt.\n    //  51 - reserved for Emacs shell.\n    //  52 - Manipulate Selection Data.\n    // 104 ; c - Reset Color Number c.\n    this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n    // 105 ; c - Reset Special Color Number c.\n    // 106 ; c; f - Enable/disable Special Color Number c.\n    // 110 - Reset VT100 text foreground color.\n    this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n    // 111 - Reset VT100 text background color.\n    this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n    // 112 - Reset text cursor color.\n    this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n    // 113 - Reset mouse foreground color.\n    // 114 - Reset mouse background color.\n    // 115 - Reset Tektronix foreground color.\n    // 116 - Reset Tektronix background color.\n    // 117 - Reset highlight color.\n    // 118 - Reset Tektronix cursor color.\n    // 119 - Reset highlight foreground color.\n\n    /**\n     * ESC handlers\n     */\n    this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n    this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n    this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n    this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n    this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n    this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n    this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n    this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n    this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n    this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n    this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n    this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n    for (const flag in CHARSETS) {\n      this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n      this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n      this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n      this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n      this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n      this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n      this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n    }\n    this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n    /**\n     * error handler\n     */\n    this._parser.setErrorHandler((state: IParsingState) => {\n      this._logService.error('Parsing error: ', state);\n      return state;\n    });\n\n    /**\n     * DCS handler\n     */\n    this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n  }\n\n  /**\n   * Async parse support.\n   */\n  private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n    this._parseStack.paused = true;\n    this._parseStack.cursorStartX = cursorStartX;\n    this._parseStack.cursorStartY = cursorStartY;\n    this._parseStack.decodedLength = decodedLength;\n    this._parseStack.position = position;\n  }\n\n  private _logSlowResolvingAsync(p: Promise<boolean>): void {\n    // log a limited warning about an async handler taking too long\n    if (this._logService.logLevel <= LogLevelEnum.WARN) {\n      Promise.race([p, new Promise((res, rej) => setTimeout(() => rej('#SLOW_TIMEOUT'), SLOW_ASYNC_LIMIT))])\n        .catch(err => {\n          if (err !== '#SLOW_TIMEOUT') {\n            throw err;\n          }\n          console.warn(`async parser handler taking longer than ${SLOW_ASYNC_LIMIT} ms`);\n        });\n    }\n  }\n\n  private _getCurrentLinkId(): number {\n    return this._curAttrData.extended.urlId;\n  }\n\n  /**\n   * Parse call with async handler support.\n   *\n   * Whether the stack state got preserved for the next call, is indicated by the return value:\n   * - undefined (void):\n   *   all handlers were sync, no stack save, continue normally with next chunk\n   * - Promise\\<boolean\\>:\n   *   execution stopped at async handler, stack saved, continue with same chunk and the promise\n   *   resolve value as `promiseResult` until the method returns `undefined`\n   *\n   * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n   * and proper continuation of async parser handlers.\n   */\n  public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean> {\n    let result: void | Promise<boolean>;\n    let cursorStartX = this._activeBuffer.x;\n    let cursorStartY = this._activeBuffer.y;\n    let start = 0;\n    const wasPaused = this._parseStack.paused;\n\n    if (wasPaused) {\n      // assumption: _parseBuffer never mutates between async calls\n      if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n        this._logSlowResolvingAsync(result);\n        return result;\n      }\n      cursorStartX = this._parseStack.cursorStartX;\n      cursorStartY = this._parseStack.cursorStartY;\n      this._parseStack.paused = false;\n      if (data.length > MAX_PARSEBUFFER_LENGTH) {\n        start = this._parseStack.position + MAX_PARSEBUFFER_LENGTH;\n      }\n    }\n\n    // Log debug data, the log level gate is to prevent extra work in this hot path\n    if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n      this._logService.debug(`parsing data${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`, typeof data === 'string'\n        ? data.split('').map(e => e.charCodeAt(0))\n        : data\n      );\n    }\n\n    // resize input buffer if needed\n    if (this._parseBuffer.length < data.length) {\n      if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n        this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n      }\n    }\n\n    // Clear the dirty row service so we know which lines changed as a result of parsing\n    // Important: do not clear between async calls, otherwise we lost pending update information.\n    if (!wasPaused) {\n      this._dirtyRowTracker.clearRange();\n    }\n\n    // process big data in smaller chunks\n    if (data.length > MAX_PARSEBUFFER_LENGTH) {\n      for (let i = start; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n        const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n          : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, i);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    } else {\n      if (!wasPaused) {\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data, this._parseBuffer)\n          : this._utf8Decoder.decode(data, this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, 0);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    }\n\n    if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n      this._onCursorMove.fire();\n    }\n\n    // Refresh any dirty rows accumulated as part of parsing\n    this._onRequestRefreshRows.fire(this._dirtyRowTracker.start, this._dirtyRowTracker.end);\n  }\n\n  public print(data: Uint32Array, start: number, end: number): void {\n    let code: number;\n    let chWidth: number;\n    const charset = this._charsetService.charset;\n    const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n    const cols = this._bufferService.cols;\n    const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n    const insertMode = this._coreService.modes.insertMode;\n    const curAttr = this._curAttrData;\n    let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n    if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n    }\n\n    for (let pos = start; pos < end; ++pos) {\n      code = data[pos];\n\n      // calculate print space\n      // expensive call, therefore we save width in line buffer\n      chWidth = this._unicodeService.wcwidth(code);\n\n      // get charset replacement character\n      // charset is only defined for ASCII, therefore we only\n      // search for an replacement char if code < 127\n      if (code < 127 && charset) {\n        const ch = charset[String.fromCharCode(code)];\n        if (ch) {\n          code = ch.charCodeAt(0);\n        }\n      }\n\n      if (screenReaderMode) {\n        this._onA11yChar.fire(stringFromCodePoint(code));\n      }\n      if (this._getCurrentLinkId()) {\n        this._oscLinkService.addLineToLink(this._getCurrentLinkId(), this._activeBuffer.ybase + this._activeBuffer.y);\n      }\n\n      // insert combining char at last cursor position\n      // this._activeBuffer.x should never be 0 for a combining char\n      // since they always follow a cell consuming char\n      // therefore we can test for this._activeBuffer.x to avoid overflow left\n      if (!chWidth && this._activeBuffer.x) {\n        if (!bufferRow.getWidth(this._activeBuffer.x - 1)) {\n          // found empty cell after fullwidth, need to go 2 cells back\n          // it is save to step 2 cells back here\n          // since an empty cell is only set by fullwidth chars\n          bufferRow.addCodepointToCell(this._activeBuffer.x - 2, code);\n        } else {\n          bufferRow.addCodepointToCell(this._activeBuffer.x - 1, code);\n        }\n        continue;\n      }\n\n      // goto next line if ch would overflow\n      // NOTE: To avoid costly width checks here,\n      // the terminal does not allow a cols < 2.\n      if (this._activeBuffer.x + chWidth - 1 >= cols) {\n        // autowrap - DECAWM\n        // automatically wraps to the beginning of the next line\n        if (wraparoundMode) {\n          // clear left over cells to the right\n          while (this._activeBuffer.x < cols) {\n            bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n          }\n          this._activeBuffer.x = 0;\n          this._activeBuffer.y++;\n          if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n            this._activeBuffer.y--;\n            this._bufferService.scroll(this._eraseAttrData(), true);\n          } else {\n            if (this._activeBuffer.y >= this._bufferService.rows) {\n              this._activeBuffer.y = this._bufferService.rows - 1;\n            }\n            // The line already exists (eg. the initial viewport), mark it as a\n            // wrapped line\n            this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n          }\n          // row changed, get it again\n          bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n        } else {\n          this._activeBuffer.x = cols - 1;\n          if (chWidth === 2) {\n            // FIXME: check for xterm behavior\n            // What to do here? We got a wide char that does not fit into last cell\n            continue;\n          }\n        }\n      }\n\n      // insert mode: move characters to right\n      if (insertMode) {\n        // right shift cells according to the width\n        bufferRow.insertCells(this._activeBuffer.x, chWidth, this._activeBuffer.getNullCell(curAttr), curAttr);\n        // test last cell - since the last cell has only room for\n        // a halfwidth char any fullwidth shifted there is lost\n        // and will be set to empty cell\n        if (bufferRow.getWidth(cols - 1) === 2) {\n          bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended);\n        }\n      }\n\n      // write current char to buffer and advance cursor\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended);\n\n      // fullwidth char - also set next cell to placeholder stub and advance cursor\n      // for graphemes bigger than fullwidth we can simply loop to zero\n      // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n      if (chWidth > 0) {\n        while (--chWidth) {\n          // other than a regular empty cell a cell following a wide char has no width\n          bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended);\n        }\n      }\n    }\n    // store last char in Parser.precedingCodepoint for REP to work correctly\n    // This needs to check whether:\n    //  - fullwidth + surrogates: reset\n    //  - combining: only base char gets carried on (bug in xterm?)\n    if (end - start > 0) {\n      bufferRow.loadCell(this._activeBuffer.x - 1, this._workCell);\n      if (this._workCell.getWidth() === 2 || this._workCell.getCode() > 0xFFFF) {\n        this._parser.precedingCodepoint = 0;\n      } else if (this._workCell.isCombined()) {\n        this._parser.precedingCodepoint = this._workCell.getChars().charCodeAt(0);\n      } else {\n        this._parser.precedingCodepoint = this._workCell.content;\n      }\n    }\n\n    // handle wide chars: reset cell to the right if it is second cell of a wide char\n    if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n    }\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Forward registerCsiHandler from parser.\n   */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    if (id.final === 't' && !id.prefix && !id.intermediates) {\n      // security: always check whether window option is allowed\n      return this._parser.registerCsiHandler(id, params => {\n        if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n          return true;\n        }\n        return callback(params);\n      });\n    }\n    return this._parser.registerCsiHandler(id, callback);\n  }\n\n  /**\n   * Forward registerDcsHandler from parser.\n   */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n  }\n\n  /**\n   * Forward registerEscHandler from parser.\n   */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerEscHandler(id, callback);\n  }\n\n  /**\n   * Forward registerOscHandler from parser.\n   */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerOscHandler(ident, new OscHandler(callback));\n  }\n\n  /**\n   * BEL\n   * Bell (Ctrl-G).\n   *\n   * @vt: #Y   C0    BEL   \"Bell\"  \"\\a, \\x07\"  \"Ring the bell.\"\n   * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n   * and `ITerminalOptions.bellSound`.\n   */\n  public bell(): boolean {\n    this._onRequestBell.fire();\n    return true;\n  }\n\n  /**\n   * LF\n   * Line Feed or New Line (NL).  (LF  is Ctrl-J).\n   *\n   * @vt: #Y   C0    LF   \"Line Feed\"            \"\\n, \\x0A\"  \"Move the cursor one row down, scrolling if needed.\"\n   * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n   *\n   * @vt: #Y   C0    VT   \"Vertical Tabulation\"  \"\\v, \\x0B\"  \"Treated as LF.\"\n   * @vt: #Y   C0    FF   \"Form Feed\"            \"\\f, \\x0C\"  \"Treated as LF.\"\n   */\n  public lineFeed(): boolean {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._optionsService.rawOptions.convertEol) {\n      this._activeBuffer.x = 0;\n    }\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    } else {\n      // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n      // the line. This is particularly important on conpty/Windows where revisiting lines to\n      // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n      // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n      // 21376 and above.\n      this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n    }\n    // If the end of the line is hit, prevent this action from wrapping around to the next line.\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      this._activeBuffer.x--;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    this._onLineFeed.fire();\n    return true;\n  }\n\n  /**\n   * CR\n   * Carriage Return (Ctrl-M).\n   *\n   * @vt: #Y   C0    CR   \"Carriage Return\"  \"\\r, \\x0D\"  \"Move the cursor to the beginning of the row.\"\n   */\n  public carriageReturn(): boolean {\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * BS\n   * Backspace (Ctrl-H).\n   *\n   * @vt: #Y   C0    BS   \"Backspace\"  \"\\b, \\x08\"  \"Move the cursor one position to the left.\"\n   * By default it is not possible to move the cursor past the leftmost position.\n   * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n   * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n   * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n   * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n   */\n  public backspace(): boolean {\n    // reverse wrap-around is disabled\n    if (!this._coreService.decPrivateModes.reverseWraparound) {\n      this._restrictCursor();\n      if (this._activeBuffer.x > 0) {\n        this._activeBuffer.x--;\n      }\n      return true;\n    }\n\n    // reverse wrap-around is enabled\n    // other than for normal operation mode, reverse wrap-around allows the cursor\n    // to be at x=cols to be able to address the last cell of a row by BS\n    this._restrictCursor(this._bufferService.cols);\n\n    if (this._activeBuffer.x > 0) {\n      this._activeBuffer.x--;\n    } else {\n      /**\n       * reverse wrap-around handling:\n       * Our implementation deviates from xterm on purpose. Details:\n       * - only previous soft NLs can be reversed (isWrapped=true)\n       * - only works within scrollborders (top/bottom, left/right not yet supported)\n       * - cannot peek into scrollbuffer\n       * - any cursor movement sequence keeps working as expected\n       */\n      if (this._activeBuffer.x === 0\n        && this._activeBuffer.y > this._activeBuffer.scrollTop\n        && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n        && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n        this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n        this._activeBuffer.y--;\n        this._activeBuffer.x = this._bufferService.cols - 1;\n        // find last taken cell - last cell can have 3 different states:\n        // - hasContent(true) + hasWidth(1): narrow char - we are done\n        // - hasWidth(0): second part of wide char - we are done\n        // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n        //   cell further back\n        const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n        if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n          this._activeBuffer.x--;\n          // We do this only once, since width=1 + hasContent=false currently happens only once\n          // before early wrapping of a wide char.\n          // This needs to be fixed once we support graphemes taking more than 2 cells.\n        }\n      }\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * TAB\n   * Horizontal Tab (HT) (Ctrl-I).\n   *\n   * @vt: #Y   C0    HT   \"Horizontal Tabulation\"  \"\\t, \\x09\"  \"Move the cursor to the next character tab stop.\"\n   */\n  public tab(): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    const originalX = this._activeBuffer.x;\n    this._activeBuffer.x = this._activeBuffer.nextStop();\n    if (this._optionsService.rawOptions.screenReaderMode) {\n      this._onA11yTab.fire(this._activeBuffer.x - originalX);\n    }\n    return true;\n  }\n\n  /**\n   * SO\n   * Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This invokes the\n   * G1 character set.\n   *\n   * @vt: #P[Only limited ISO-2022 charset support.]  C0    SO   \"Shift Out\"  \"\\x0E\"  \"Switch to an alternative character set.\"\n   */\n  public shiftOut(): boolean {\n    this._charsetService.setgLevel(1);\n    return true;\n  }\n\n  /**\n   * SI\n   * Shift In (Ctrl-O) -> Switch to Standard Character Set.  This invokes the G0\n   * character set (the default).\n   *\n   * @vt: #Y   C0    SI   \"Shift In\"   \"\\x0F\"  \"Return to regular character set after Shift Out.\"\n   */\n  public shiftIn(): boolean {\n    this._charsetService.setgLevel(0);\n    return true;\n  }\n\n  /**\n   * Restrict cursor to viewport size / scroll margin (origin mode).\n   */\n  private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n    this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n    this._activeBuffer.y = this._coreService.decPrivateModes.origin\n      ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n      : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set absolute cursor position.\n   */\n  private _setCursor(x: number, y: number): void {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._coreService.decPrivateModes.origin) {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n    } else {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = y;\n    }\n    this._restrictCursor();\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set relative cursor position.\n   */\n  private _moveCursor(x: number, y: number): void {\n    // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n    // before calculating the new position\n    this._restrictCursor();\n    this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n  }\n\n  /**\n   * CSI Ps A\n   * Cursor Up Ps Times (default = 1) (CUU).\n   *\n   * @vt: #Y CSI CUU   \"Cursor Up\"   \"CSI Ps A\"  \"Move cursor `Ps` times up (default=1).\"\n   * If the cursor would pass the top scroll margin, it will stop there.\n   */\n  public cursorUp(params: IParams): boolean {\n    // stop at scrollTop\n    const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n    if (diffToTop >= 0) {\n      this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, -(params.params[0] || 1));\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps B\n   * Cursor Down Ps Times (default = 1) (CUD).\n   *\n   * @vt: #Y CSI CUD   \"Cursor Down\"   \"CSI Ps B\"  \"Move cursor `Ps` times down (default=1).\"\n   * If the cursor would pass the bottom scroll margin, it will stop there.\n   */\n  public cursorDown(params: IParams): boolean {\n    // stop at scrollBottom\n    const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n    if (diffToBottom >= 0) {\n      this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, params.params[0] || 1);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps C\n   * Cursor Forward Ps Times (default = 1) (CUF).\n   *\n   * @vt: #Y CSI CUF   \"Cursor Forward\"    \"CSI Ps C\"  \"Move cursor `Ps` times forward (default=1).\"\n   */\n  public cursorForward(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps D\n   * Cursor Backward Ps Times (default = 1) (CUB).\n   *\n   * @vt: #Y CSI CUB   \"Cursor Backward\"   \"CSI Ps D\"  \"Move cursor `Ps` times backward (default=1).\"\n   */\n  public cursorBackward(params: IParams): boolean {\n    this._moveCursor(-(params.params[0] || 1), 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps E\n   * Cursor Next Line Ps Times (default = 1) (CNL).\n   * Other than cursorDown (CUD) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CNL   \"Cursor Next Line\"  \"CSI Ps E\"  \"Move cursor `Ps` times down (default=1) and to the first column.\"\n   * Same as CUD, additionally places the cursor at the first column.\n   */\n  public cursorNextLine(params: IParams): boolean {\n    this.cursorDown(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps F\n   * Cursor Previous Line Ps Times (default = 1) (CPL).\n   * Other than cursorUp (CUU) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CPL   \"Cursor Backward\"   \"CSI Ps F\"  \"Move cursor `Ps` times up (default=1) and to the first column.\"\n   * Same as CUU, additionally places the cursor at the first column.\n   */\n  public cursorPrecedingLine(params: IParams): boolean {\n    this.cursorUp(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps G\n   * Cursor Character Absolute  [column] (default = [row,1]) (CHA).\n   *\n   * @vt: #Y CSI CHA   \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n   */\n  public cursorCharAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps H\n   * Cursor Position [row;column] (default = [1,1]) (CUP).\n   *\n   * @vt: #Y CSI CUP   \"Cursor Position\"   \"CSI Ps ; Ps H\"  \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n   * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n   * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n   * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n   */\n  public cursorPosition(params: IParams): boolean {\n    this._setCursor(\n      // col\n      (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n      // row\n      (params.params[0] || 1) - 1\n    );\n    return true;\n  }\n\n  /**\n   * CSI Pm `  Character Position Absolute\n   *   [column] (default = [row,1]) (HPA).\n   * Currently same functionality as CHA.\n   *\n   * @vt: #Y CSI HPA   \"Horizontal Position Absolute\"  \"CSI Ps ` \" \"Same as CHA.\"\n   */\n  public charPosAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Pm a  Character Position Relative\n   *   [columns] (default = [row,col+1]) (HPR)\n   *\n   * @vt: #Y CSI HPR   \"Horizontal Position Relative\"  \"CSI Ps a\"  \"Same as CUF.\"\n   */\n  public hPositionRelative(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Pm d  Vertical Position Absolute (VPA)\n   *   [row] (default = [1,column])\n   *\n   * @vt: #Y CSI VPA   \"Vertical Position Absolute\"    \"CSI Ps d\"  \"Move cursor to `Ps`-th row (default=1).\"\n   */\n  public linePosAbsolute(params: IParams): boolean {\n    this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n    return true;\n  }\n\n  /**\n   * CSI Pm e  Vertical Position Relative (VPR)\n   *   [rows] (default = [row+1,column])\n   * reuse CSI Ps B ?\n   *\n   * @vt: #Y CSI VPR   \"Vertical Position Relative\"    \"CSI Ps e\"  \"Move cursor `Ps` times down (default=1).\"\n   */\n  public vPositionRelative(params: IParams): boolean {\n    this._moveCursor(0, params.params[0] || 1);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps f\n   *   Horizontal and Vertical Position [row;column] (default =\n   *   [1,1]) (HVP).\n   *   Same as CUP.\n   *\n   * @vt: #Y CSI HVP   \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\"  \"Same as CUP.\"\n   */\n  public hVPosition(params: IParams): boolean {\n    this.cursorPosition(params);\n    return true;\n  }\n\n  /**\n   * CSI Ps g  Tab Clear (TBC).\n   *     Ps = 0  -> Clear Current Column (default).\n   *     Ps = 3  -> Clear All.\n   * Potentially:\n   *   Ps = 2  -> Clear Stops on Line.\n   *   http://vt100.net/annarbor/aaa-ug/section6.html\n   *\n   * @vt: #Y CSI TBC   \"Tab Clear\" \"CSI Ps g\"  \"Clear tab stops at current position (0) or all (3) (default=0).\"\n   * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n   */\n  public tabClear(params: IParams): boolean {\n    const param = params.params[0];\n    if (param === 0) {\n      delete this._activeBuffer.tabs[this._activeBuffer.x];\n    } else if (param === 3) {\n      this._activeBuffer.tabs = {};\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps I\n   *   Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n   *\n   * @vt: #Y CSI CHT   \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n   */\n  public cursorForwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.nextStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps Z  Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n   *\n   * @vt: #Y CSI CBT   \"Cursor Backward Tabulation\"  \"CSI Ps Z\"  \"Move cursor `Ps` tabs backward (default=1).\"\n   */\n  public cursorBackwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.prevStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps \" q  Select Character Protection Attribute (DECSCA).\n   *\n   * @vt: #Y CSI DECSCA   \"Select Character Protection Attribute\"  \"CSI Ps \" q\"  \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n   */\n  public selectProtected(params: IParams): boolean {\n    const p = params.params[0];\n    if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n    if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n    return true;\n  }\n\n\n  /**\n   * Helper method to erase cells in a terminal row.\n   * The cell gets replaced with the eraseChar of the terminal.\n   * @param y The row index relative to the viewport.\n   * @param start The start x index of the range to be erased.\n   * @param end The end x index of the range to be erased (exclusive).\n   * @param clearWrap clear the isWrapped flag\n   * @param respectProtect Whether to respect the protection attribute (DECSCA).\n   */\n  private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n    line.replaceCells(\n      start,\n      end,\n      this._activeBuffer.getNullCell(this._eraseAttrData()),\n      this._eraseAttrData(),\n      respectProtect\n    );\n    if (clearWrap) {\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n   * the terminal and the isWrapped property is set to false.\n   * @param y row index\n   */\n  private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n    if (line) {\n      line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n      this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * CSI Ps J  Erase in Display (ED).\n   *     Ps = 0  -> Erase Below (default).\n   *     Ps = 1  -> Erase Above.\n   *     Ps = 2  -> Erase All.\n   *     Ps = 3  -> Erase Saved Lines (xterm).\n   * CSI ? Ps J\n   *   Erase in Display (DECSED).\n   *     Ps = 0  -> Selective Erase Below (default).\n   *     Ps = 1  -> Selective Erase Above.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI ED  \"Erase In Display\"  \"CSI Ps J\"  \"Erase various parts of the viewport.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                       |\n   * | -- | ------------------------------------------------------------ |\n   * | 0  | Erase from the cursor through the end of the viewport.       |\n   * | 1  | Erase from the beginning of the viewport through the cursor. |\n   * | 2  | Erase complete viewport.                                     |\n   * | 3  | Erase scrollback.                                            |\n   *\n   * @vt: #Y CSI DECSED   \"Selective Erase In Display\"  \"CSI ? Ps J\"  \"Same as ED with respecting protection flag.\"\n   */\n  public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    let j;\n    switch (params.params[0]) {\n      case 0:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        for (; j < this._bufferService.rows; j++) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(j);\n        break;\n      case 1:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        // Deleted front part of line and everything before. This line will no longer be wrapped.\n        this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n        if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n          // Deleted entire previous line. This next line can no longer be wrapped.\n          this._activeBuffer.lines.get(j + 1)!.isWrapped = false;\n        }\n        while (j--) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(0);\n        break;\n      case 2:\n        j = this._bufferService.rows;\n        this._dirtyRowTracker.markDirty(j - 1);\n        while (j--) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(0);\n        break;\n      case 3:\n        // Clear scrollback (everything not in viewport)\n        const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n        if (scrollBackSize > 0) {\n          this._activeBuffer.lines.trimStart(scrollBackSize);\n          this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n          this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n          // Force a scroll event to refresh viewport\n          this._onScroll.fire(0);\n        }\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps K  Erase in Line (EL).\n   *     Ps = 0  -> Erase to Right (default).\n   *     Ps = 1  -> Erase to Left.\n   *     Ps = 2  -> Erase All.\n   * CSI ? Ps K\n   *   Erase in Line (DECSEL).\n   *     Ps = 0  -> Selective Erase to Right (default).\n   *     Ps = 1  -> Selective Erase to Left.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI EL    \"Erase In Line\"  \"CSI Ps K\"  \"Erase various parts of the active row.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                   |\n   * | -- | -------------------------------------------------------- |\n   * | 0  | Erase from the cursor through the end of the row.        |\n   * | 1  | Erase from the beginning of the line through the cursor. |\n   * | 2  | Erase complete line.                                     |\n   *\n   * @vt: #Y CSI DECSEL   \"Selective Erase In Line\"  \"CSI ? Ps K\"  \"Same as EL with respecting protecting flag.\"\n   */\n  public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    switch (params.params[0]) {\n      case 0:\n        this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        break;\n      case 1:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n        break;\n      case 2:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n        break;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps L\n   * Insert Ps Line(s) (default = 1) (IL).\n   *\n   * @vt: #Y CSI IL  \"Insert Line\"   \"CSI Ps L\"  \"Insert `Ps` blank lines at active row (default=1).\"\n   * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n   * The cursor is set to the first column.\n   * IL has no effect if the cursor is outside the scroll margins.\n   */\n  public insertLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1L\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n      this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps M\n   * Delete Ps Line(s) (default = 1) (DL).\n   *\n   * @vt: #Y CSI DL  \"Delete Line\"   \"CSI Ps M\"  \"Delete `Ps` lines at active row (default=1).\"\n   * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n   * The cursor is set to the first column.\n   * DL has no effect if the cursor is outside the scroll margins.\n   */\n  public deleteLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    let j: number;\n    j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1M\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(row, 1);\n      this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps @\n   * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n   *\n   * @vt: #Y CSI ICH  \"Insert Characters\"   \"CSI Ps @\"  \"Insert `Ps` (blank) characters (default = 1).\"\n   * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n   * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n   * past the right margin are lost.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public insertChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.insertCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps P\n   * Delete Ps Character(s) (default = 1) (DCH).\n   *\n   * @vt: #Y CSI DCH   \"Delete Character\"  \"CSI Ps P\"  \"Delete `Ps` characters (default=1).\"\n   * As characters are deleted, the remaining characters between the cursor and right margin move to\n   * the left. Character attributes move with the characters. The terminal adds blank characters at\n   * the right margin.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public deleteChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.deleteCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps S  Scroll up Ps lines (default = 1) (SU).\n   *\n   * @vt: #Y CSI SU  \"Scroll Up\"   \"CSI Ps S\"  \"Scroll `Ps` lines up (default=1).\"\n   *\n   *\n   * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n   */\n  public scrollUp(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps T  Scroll down Ps lines (default = 1) (SD).\n   *\n   * @vt: #Y CSI SD  \"Scroll Down\"   \"CSI Ps T\"  \"Scroll `Ps` lines down (default=1).\"\n   */\n  public scrollDown(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP @  Scroll left Ps columns (default = 1) (SL) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/00\n   * Parameter default value: Pn = 1\n   * SL causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always left shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SL  \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollLeft(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP A  Scroll right Ps columns (default = 1) (SR) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/01\n   * Parameter default value: Pn = 1\n   * SR causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always right shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SR  \"Scroll Right\"  \"CSI Ps SP A\"   \"Scroll viewport `Ps` times to the right.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n   * Content at the right margin is lost.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollRight(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' }\n   * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n   *\n   * @vt: #Y CSI DECIC \"Insert Columns\"  \"CSI Ps ' }\"  \"Insert `Ps` columns at cursor position.\"\n   * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n   * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n   * outside the scrolling margins.\n   */\n  public insertColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' ~\n   * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n   *\n   * @vt: #Y CSI DECDC \"Delete Columns\"  \"CSI Ps ' ~\"  \"Delete `Ps` columns at cursor position.\"\n   * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n   * moving content to the left. Blank columns are added at the right margin.\n   * DECDC has no effect outside the scrolling margins.\n   */\n  public deleteColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps X\n   * Erase Ps Character(s) (default = 1) (ECH).\n   *\n   * @vt: #Y CSI ECH   \"Erase Character\"   \"CSI Ps X\"  \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n   * ED erases `Ps` characters from current cursor position to the right.\n   * ED works inside or outside the scrolling margins.\n   */\n  public eraseChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.replaceCells(\n        this._activeBuffer.x,\n        this._activeBuffer.x + (params.params[0] || 1),\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps b  Repeat the preceding graphic character Ps times (REP).\n   * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n   *    Notation: (Pn)\n   *    Representation: CSI Pn 06/02\n   *    Parameter default value: Pn = 1\n   *    REP is used to indicate that the preceding character in the data stream,\n   *    if it is a graphic character (represented by one or more bit combinations) including SPACE,\n   *    is to be repeated n times, where n equals the value of Pn.\n   *    If the character preceding REP is a control function or part of a control function,\n   *    the effect of REP is not defined by this Standard.\n   *\n   * Since we propagate the terminal as xterm-256color we have to follow xterm's behavior:\n   *    - fullwidth + surrogate chars are ignored\n   *    - for combining chars only the base char gets repeated\n   *    - text attrs are applied normally\n   *    - wrap around is respected\n   *    - any valid sequence resets the carried forward char\n   *\n   * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n   * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n   *\n   * @vt: #Y CSI REP   \"Repeat Preceding Character\"    \"CSI Ps b\"  \"Repeat preceding character `Ps` times (default=1).\"\n   * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n   * set. REP has no effect if the sequence does not follow a printable ASCII character\n   * (NOOP for any other sequence in between or NON ASCII characters).\n   */\n  public repeatPrecedingCharacter(params: IParams): boolean {\n    if (!this._parser.precedingCodepoint) {\n      return true;\n    }\n    // call print to insert the chars and handle correct wrapping\n    const length = params.params[0] || 1;\n    const data = new Uint32Array(length);\n    for (let i = 0; i < length; ++i) {\n      data[i] = this._parser.precedingCodepoint;\n    }\n    this.print(data, 0, data.length);\n    return true;\n  }\n\n  /**\n   * CSI Ps c  Send Device Attributes (Primary DA).\n   *     Ps = 0  or omitted -> request attributes from terminal.  The\n   *     response depends on the decTerminalID resource setting.\n   *     -> CSI ? 1 ; 2 c  (``VT100 with Advanced Video Option'')\n   *     -> CSI ? 1 ; 0 c  (``VT101 with No Options'')\n   *     -> CSI ? 6 c  (``VT102'')\n   *     -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c  (``VT220'')\n   *   The VT100-style response parameters do not mean anything by\n   *   themselves.  VT220 parameters do, telling the host what fea-\n   *   tures the terminal supports:\n   *     Ps = 1  -> 132-columns.\n   *     Ps = 2  -> Printer.\n   *     Ps = 6  -> Selective erase.\n   *     Ps = 8  -> User-defined keys.\n   *     Ps = 9  -> National replacement character sets.\n   *     Ps = 1 5  -> Technical characters.\n   *     Ps = 2 2  -> ANSI color, e.g., VT525.\n   *     Ps = 2 9  -> ANSI text locator (i.e., DEC Locator mode).\n   *\n   * @vt: #Y CSI DA1   \"Primary Device Attributes\"     \"CSI c\"  \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesPrimary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n    } else if (this._is('linux')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n    }\n    return true;\n  }\n\n  /**\n   * CSI > Ps c\n   *   Send Device Attributes (Secondary DA).\n   *     Ps = 0  or omitted -> request the terminal's identification\n   *     code.  The response depends on the decTerminalID resource set-\n   *     ting.  It should apply only to VT220 and up, but xterm extends\n   *     this to VT100.\n   *     -> CSI  > Pp ; Pv ; Pc c\n   *   where Pp denotes the terminal type\n   *     Pp = 0  -> ``VT100''.\n   *     Pp = 1  -> ``VT220''.\n   *   and Pv is the firmware version (for xterm, this was originally\n   *   the XFree86 patch number, starting with 95).  In a DEC termi-\n   *   nal, Pc indicates the ROM cartridge registration number and is\n   *   always zero.\n   * More information:\n   *   xterm/charproc.c - line 2012, for more information.\n   *   vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n   *\n   * @vt: #Y CSI DA2   \"Secondary Device Attributes\"   \"CSI > c\" \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesSecondary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    // xterm and urxvt\n    // seem to spit this\n    // out around ~370 times (?).\n    if (this._is('xterm')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n    } else if (this._is('rxvt-unicode')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n    } else if (this._is('linux')) {\n      // not supported by linux console.\n      // linux console echoes parameters.\n      this._coreService.triggerDataEvent(params.params[0] + 'c');\n    } else if (this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n    }\n    return true;\n  }\n\n  /**\n   * Evaluate if the current terminal is the given argument.\n   * @param term The terminal name to evaluate\n   */\n  private _is(term: string): boolean {\n    return (this._optionsService.rawOptions.termName + '').indexOf(term) === 0;\n  }\n\n  /**\n   * CSI Pm h  Set Mode (SM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Insert Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Automatic Newline (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI SM    \"Set Mode\"  \"CSI Pm h\"  \"Set various terminal modes.\"\n   * Supported param values by SM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Insert Mode (IRM).                     | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Automatic Newline (LNM).               | #Y      |\n   */\n  public setMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = true;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = true;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm h\n   *   DEC Private Mode Set (DECSET).\n   *     Ps = 1  -> Application Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate USASCII for character sets G0-G3\n   *     (DECANM), and set VT100 mode.\n   *     Ps = 3  -> 132 Column Mode (DECCOLM).\n   *     Ps = 4  -> Smooth (Slow) Scroll (DECSCLM).\n   *     Ps = 5  -> Reverse Video (DECSCNM).\n   *     Ps = 6  -> Origin Mode (DECOM).\n   *     Ps = 7  -> Wraparound Mode (DECAWM).\n   *     Ps = 8  -> Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Send Mouse X & Y on button press.  See the sec-\n   *     tion Mouse Tracking.\n   *     Ps = 1 0  -> Show toolbar (rxvt).\n   *     Ps = 1 2  -> Start Blinking Cursor (att610).\n   *     Ps = 1 8  -> Print form feed (DECPFF).\n   *     Ps = 1 9  -> Set print extent to full screen (DECPEX).\n   *     Ps = 2 5  -> Show Cursor (DECTCEM).\n   *     Ps = 3 0  -> Show scrollbar (rxvt).\n   *     Ps = 3 5  -> Enable font-shifting functions (rxvt).\n   *     Ps = 3 8  -> Enter Tektronix Mode (DECTEK).\n   *     Ps = 4 0  -> Allow 80 -> 132 Mode.\n   *     Ps = 4 1  -> more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Enable Nation Replacement Character sets (DECN-\n   *     RCM).\n   *     Ps = 4 4  -> Turn On Margin Bell.\n   *     Ps = 4 5  -> Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Start Logging.  This is normally disabled by a\n   *     compile-time option.\n   *     Ps = 4 7  -> Use Alternate Screen Buffer.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 6 6  -> Application keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends backspace (DECBKM).\n   *     Ps = 1 0 0 0  -> Send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Enable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Scroll to bottom on tty output (rxvt).\n   *     Ps = 1 0 1 1  -> Scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Interpret \"meta\" key, sets eighth bit.\n   *     (enables the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Enable special modifiers for Alt and Num-\n   *     Lock keys.  (This enables the numLock resource).\n   *     Ps = 1 0 3 6  -> Send ESC   when Meta modifies a key.  (This\n   *     enables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send DEL from the editing-keypad Delete\n   *     key.\n   *     Ps = 1 0 3 9  -> Send ESC  when Alt modifies a key.  (This\n   *     enables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Keep selection even if not highlighted.\n   *     (This enables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the CLIPBOARD selection.  (This enables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Enable Urgency window manager hint when\n   *     Control-G is received.  (This enables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Enable raising of the window when Control-G\n   *     is received.  (enables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Alternate Screen Buffer.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Save cursor as in DECSC.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Save cursor as in DECSC and use Alternate\n   *     Screen Buffer, clearing it first.  (This may be disabled by\n   *     the titeInhibit resource).  This combines the effects of the 1\n   *     0 4 7  and 1 0 4 8  modes.  Use this with terminfo-based\n   *     applications rather than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Set terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Set Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Set HP function-key mode.\n   *     Ps = 1 0 5 3  -> Set SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Set legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Set VT220 keyboard emulation.\n   *     Ps = 2 0 0 4  -> Set bracketed paste mode.\n   * Modes:\n   *   http: *vt100.net/docs/vt220-rm/chapter4.html\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECSET  \"DEC Private Set Mode\" \"CSI ? Pm h\"  \"Set various terminal attributes.\"\n   * Supported param values by DECSET:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | --------|\n   * | 1     | Application Cursor Keys (DECCKM).                       | #Y      |\n   * | 2     | Designate US-ASCII for character sets G0-G3 (DECANM).   | #Y      |\n   * | 3     | 132 Column Mode (DECCOLM).                              | #Y      |\n   * | 6     | Origin Mode (DECOM).                                    | #Y      |\n   * | 7     | Auto-wrap Mode (DECAWM).                                | #Y      |\n   * | 8     | Auto-repeat Keys (DECARM). Always on.                   | #N      |\n   * | 9     | X10 xterm mouse protocol.                               | #Y      |\n   * | 12    | Start Blinking Cursor.                                  | #Y      |\n   * | 25    | Show Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | Reverse wrap-around.                                    | #Y      |\n   * | 47    | Use Alternate Screen Buffer.                            | #Y      |\n   * | 66    | Application keypad (DECNKM).                            | #Y      |\n   * | 1000  | X11 xterm mouse protocol.                               | #Y      |\n   * | 1002  | Use Cell Motion Mouse Tracking.                         | #Y      |\n   * | 1003  | Use All Motion Mouse Tracking.                          | #Y      |\n   * | 1004  | Send FocusIn/FocusOut events                            | #Y      |\n   * | 1005  | Enable UTF-8 Mouse Mode.                                | #N      |\n   * | 1006  | Enable SGR Mouse Mode.                                  | #Y      |\n   * | 1015  | Enable urxvt Mouse Mode.                                | #N      |\n   * | 1016  | Enable SGR-Pixels Mouse Mode.                           | #Y      |\n   * | 1047  | Use Alternate Screen Buffer.                            | #Y      |\n   * | 1048  | Save cursor as in DECSC.                                | #Y      |\n   * | 1049  | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n   * | 2004  | Set bracketed paste mode.                               | #Y      |\n   *\n   *\n   * FIXME: implement DECSCNM, 1049 should clear altbuffer\n   */\n  public setModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = true;\n          break;\n        case 2:\n          this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n          // set VT100 mode here\n          break;\n        case 3:\n          /**\n           * DECCOLM - 132 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(132, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = true;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = true;\n          break;\n        case 12:\n          this._optionsService.options.cursorBlink = true;\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = true;\n          break;\n        case 66:\n          this._logService.debug('Serial port requested application keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = true;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n          // no release, no motion, no wheel, no modifiers.\n          this._coreMouseService.activeProtocol = 'X10';\n          break;\n        case 1000: // vt200 mouse\n          // no motion.\n          this._coreMouseService.activeProtocol = 'VT200';\n          break;\n        case 1002: // button event mouse\n          this._coreMouseService.activeProtocol = 'DRAG';\n          break;\n        case 1003: // any event mouse\n          // any event - sends motion events,\n          // even if there is no button held down.\n          this._coreMouseService.activeProtocol = 'ANY';\n          break;\n        case 1004: // send focusin/focusout events\n          // focusin: ^[[I\n          // focusout: ^[[O\n          this._coreService.decPrivateModes.sendFocus = true;\n          this._onRequestSendFocus.fire();\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._coreMouseService.activeEncoding = 'SGR';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._coreMouseService.activeEncoding = 'SGR_PIXELS';\n          break;\n        case 25: // show cursor\n          this._coreService.isCursorHidden = false;\n          break;\n        case 1048: // alt screen cursor\n          this.saveCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n          this.saveCursor();\n        // FALL-THROUGH\n        case 47: // alt screen buffer\n        case 1047: // alt screen buffer\n          this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = true;\n          break;\n      }\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI Pm l  Reset Mode (RM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Replace Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Normal Linefeed (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI RM    \"Reset Mode\"  \"CSI Pm l\"  \"Set various terminal attributes.\"\n   * Supported param values by RM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Replace Mode (IRM). (default)          | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Normal Linefeed (LNM).                 | #Y      |\n   *\n   *\n   * FIXME: why is LNM commented out?\n   */\n  public resetMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = false;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = false;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm l\n   *   DEC Private Mode Reset (DECRST).\n   *     Ps = 1  -> Normal Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate VT52 mode (DECANM).\n   *     Ps = 3  -> 80 Column Mode (DECCOLM).\n   *     Ps = 4  -> Jump (Fast) Scroll (DECSCLM).\n   *     Ps = 5  -> Normal Video (DECSCNM).\n   *     Ps = 6  -> Normal Cursor Mode (DECOM).\n   *     Ps = 7  -> No Wraparound Mode (DECAWM).\n   *     Ps = 8  -> No Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Don't send Mouse X & Y on button press.\n   *     Ps = 1 0  -> Hide toolbar (rxvt).\n   *     Ps = 1 2  -> Stop Blinking Cursor (att610).\n   *     Ps = 1 8  -> Don't print form feed (DECPFF).\n   *     Ps = 1 9  -> Limit print to scrolling region (DECPEX).\n   *     Ps = 2 5  -> Hide Cursor (DECTCEM).\n   *     Ps = 3 0  -> Don't show scrollbar (rxvt).\n   *     Ps = 3 5  -> Disable font-shifting functions (rxvt).\n   *     Ps = 4 0  -> Disallow 80 -> 132 Mode.\n   *     Ps = 4 1  -> No more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Disable Nation Replacement Character sets (DEC-\n   *     NRCM).\n   *     Ps = 4 4  -> Turn Off Margin Bell.\n   *     Ps = 4 5  -> No Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Stop Logging.  (This is normally disabled by a\n   *     compile-time option).\n   *     Ps = 4 7  -> Use Normal Screen Buffer.\n   *     Ps = 6 6  -> Numeric keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends delete (DECBKM).\n   *     Ps = 1 0 0 0  -> Don't send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Don't use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Don't use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Don't use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Don't send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Disable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Don't scroll to bottom on tty output\n   *     (rxvt).\n   *     Ps = 1 0 1 1  -> Don't scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Don't interpret \"meta\" key.  (This disables\n   *     the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Disable special modifiers for Alt and Num-\n   *     Lock keys.  (This disables the numLock resource).\n   *     Ps = 1 0 3 6  -> Don't send ESC  when Meta modifies a key.\n   *     (This disables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send VT220 Remove from the editing-keypad\n   *     Delete key.\n   *     Ps = 1 0 3 9  -> Don't send ESC  when Alt modifies a key.\n   *     (This disables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Do not keep selection when not highlighted.\n   *     (This disables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the PRIMARY selection.  (This disables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Disable Urgency window manager hint when\n   *     Control-G is received.  (This disables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Disable raising of the window when Control-\n   *     G is received.  (This disables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Normal Screen Buffer, clearing screen\n   *     first if in the Alternate Screen.  (This may be disabled by\n   *     the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Restore cursor as in DECRC.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Use Normal Screen Buffer and restore cursor\n   *     as in DECRC.  (This may be disabled by the titeInhibit\n   *     resource).  This combines the effects of the 1 0 4 7  and 1 0\n   *     4 8  modes.  Use this with terminfo-based applications rather\n   *     than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Reset terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Reset Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Reset HP function-key mode.\n   *     Ps = 1 0 5 3  -> Reset SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Reset legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Reset keyboard emulation to Sun/PC style.\n   *     Ps = 2 0 0 4  -> Reset bracketed paste mode.\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECRST  \"DEC Private Reset Mode\" \"CSI ? Pm l\"  \"Reset various terminal attributes.\"\n   * Supported param values by DECRST:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | ------- |\n   * | 1     | Normal Cursor Keys (DECCKM).                            | #Y      |\n   * | 2     | Designate VT52 mode (DECANM).                           | #N      |\n   * | 3     | 80 Column Mode (DECCOLM).                               | #B[Switches to old column width instead of 80.] |\n   * | 6     | Normal Cursor Mode (DECOM).                             | #Y      |\n   * | 7     | No Wraparound Mode (DECAWM).                            | #Y      |\n   * | 8     | No Auto-repeat Keys (DECARM).                           | #N      |\n   * | 9     | Don't send Mouse X & Y on button press.                 | #Y      |\n   * | 12    | Stop Blinking Cursor.                                   | #Y      |\n   * | 25    | Hide Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | No reverse wrap-around.                                 | #Y      |\n   * | 47    | Use Normal Screen Buffer.                               | #Y      |\n   * | 66    | Numeric keypad (DECNKM).                                | #Y      |\n   * | 1000  | Don't send Mouse reports.                               | #Y      |\n   * | 1002  | Don't use Cell Motion Mouse Tracking.                   | #Y      |\n   * | 1003  | Don't use All Motion Mouse Tracking.                    | #Y      |\n   * | 1004  | Don't send FocusIn/FocusOut events.                     | #Y      |\n   * | 1005  | Disable UTF-8 Mouse Mode.                               | #N      |\n   * | 1006  | Disable SGR Mouse Mode.                                 | #Y      |\n   * | 1015  | Disable urxvt Mouse Mode.                               | #N      |\n   * | 1016  | Disable SGR-Pixels Mouse Mode.                          | #Y      |\n   * | 1047  | Use Normal Screen Buffer (clearing screen if in alt).   | #Y      |\n   * | 1048  | Restore cursor as in DECRC.                             | #Y      |\n   * | 1049  | Use Normal Screen Buffer and restore cursor.            | #Y      |\n   * | 2004  | Reset bracketed paste mode.                             | #Y      |\n   *\n   *\n   * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n   */\n  public resetModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = false;\n          break;\n        case 3:\n          /**\n           * DECCOLM - 80 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(80, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = false;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = false;\n          break;\n        case 12:\n          this._optionsService.options.cursorBlink = false;\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = false;\n          break;\n        case 66:\n          this._logService.debug('Switching back to normal keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = false;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n        case 1000: // vt200 mouse\n        case 1002: // button event mouse\n        case 1003: // any event mouse\n          this._coreMouseService.activeProtocol = 'NONE';\n          break;\n        case 1004: // send focusin/focusout events\n          this._coreService.decPrivateModes.sendFocus = false;\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._coreMouseService.activeEncoding = 'DEFAULT';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._coreMouseService.activeEncoding = 'DEFAULT';\n          break;\n        case 25: // hide cursor\n          this._coreService.isCursorHidden = true;\n          break;\n        case 1048: // alt screen cursor\n          this.restoreCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n        // FALL-THROUGH\n        case 47: // normal screen buffer\n        case 1047: // normal screen buffer - clearing it first\n          // Ensure the selection manager has the correct buffer\n          this._bufferService.buffers.activateNormalBuffer();\n          if (params.params[i] === 1049) {\n            this.restoreCursor();\n          }\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = false;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps $ p Request ANSI Mode (DECRQM).\n   *\n   * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n   * and Pm is the mode value:\n   *    0 - not recognized\n   *    1 - set\n   *    2 - reset\n   *    3 - permanently set\n   *    4 - permanently reset\n   *\n   * @vt: #Y  CSI   DECRQM  \"Request Mode\"  \"CSI Ps $p\"  \"Request mode state.\"\n   * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n   * or DECSET/DECRST, and `Pm` is the mode value:\n   * - 0: not recognized\n   * - 1: set\n   * - 2: reset\n   * - 3: permanently set\n   * - 4: permanently reset\n   *\n   * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n   * that a certain operation mode is not implemented and cannot be used.\n   *\n   * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n   * and only report, whether the alternate buffer is set.\n   *\n   * Mouse encodings and mouse protocols are handled mutual exclusive,\n   * thus only one of each of those can be set at a given time.\n   *\n   * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n   * e.g. if the default implementation already exposes a certain behavior. If you find\n   * discrepancies in the mode reports, please file a bug.\n   */\n  public requestMode(params: IParams, ansi: boolean): boolean {\n    // return value as in DECRPM\n    const enum V {\n      NOT_RECOGNIZED = 0,\n      SET = 1,\n      RESET = 2,\n      PERMANENTLY_SET = 3,\n      PERMANENTLY_RESET = 4\n    }\n\n    // access helpers\n    const dm = this._coreService.decPrivateModes;\n    const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._coreMouseService;\n    const cs = this._coreService;\n    const { buffers, cols } = this._bufferService;\n    const { active, alt } = buffers;\n    const opts = this._optionsService.rawOptions;\n\n    const f = (m: number, v: V): boolean => {\n      cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n      return true;\n    };\n    const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n    const p = params.params[0];\n\n    if (ansi) {\n      if (p === 2) return f(p, V.PERMANENTLY_RESET);\n      if (p === 4) return f(p, b2v(cs.modes.insertMode));\n      if (p === 12) return f(p, V.PERMANENTLY_SET);\n      if (p === 20) return f(p, b2v(opts.convertEol));\n      return f(p, V.NOT_RECOGNIZED);\n    }\n\n    if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n    if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n    if (p === 6) return f(p, b2v(dm.origin));\n    if (p === 7) return f(p, b2v(dm.wraparound));\n    if (p === 8) return f(p, V.PERMANENTLY_SET);\n    if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n    if (p === 12) return f(p, b2v(opts.cursorBlink));\n    if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n    if (p === 45) return f(p, b2v(dm.reverseWraparound));\n    if (p === 66) return f(p, b2v(dm.applicationKeypad));\n    if (p === 67) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n    if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n    if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n    if (p === 1004) return f(p, b2v(dm.sendFocus));\n    if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n    if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n    if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n    if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n    if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n    return f(p, V.NOT_RECOGNIZED);\n  }\n\n  /**\n   * Helper to write color information packed with color mode.\n   */\n  private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n    if (mode === 2) {\n      color |= Attributes.CM_RGB;\n      color &= ~Attributes.RGB_MASK;\n      color |= AttributeData.fromColorRGB([c1, c2, c3]);\n    } else if (mode === 5) {\n      color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n      color |= Attributes.CM_P256 | (c1 & 0xff);\n    }\n    return color;\n  }\n\n  /**\n   * Helper to extract and apply color params/subparams.\n   * Returns advance for params index.\n   */\n  private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n    // normalize params\n    // meaning: [target, CM, ign, val, val, val]\n    // RGB    : [ 38/48,  2, ign,   r,   g,   b]\n    // P256   : [ 38/48,  5, ign,   v, ign, ign]\n    const accu = [0, 0, -1, 0, 0, 0];\n\n    // alignment placeholder for non color space sequences\n    let cSpace = 0;\n\n    // return advance we took in params\n    let advance = 0;\n\n    do {\n      accu[advance + cSpace] = params.params[pos + advance];\n      if (params.hasSubParams(pos + advance)) {\n        const subparams = params.getSubParams(pos + advance)!;\n        let i = 0;\n        do {\n          if (accu[1] === 5) {\n            cSpace = 1;\n          }\n          accu[advance + i + 1 + cSpace] = subparams[i];\n        } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n        break;\n      }\n      // exit early if can decide color mode with semicolons\n      if ((accu[1] === 5 && advance + cSpace >= 2)\n        || (accu[1] === 2 && advance + cSpace >= 5)) {\n        break;\n      }\n      // offset colorSpace slot for semicolon mode\n      if (accu[1]) {\n        cSpace = 1;\n      }\n    } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n    // set default values to 0\n    for (let i = 2; i < accu.length; ++i) {\n      if (accu[i] === -1) {\n        accu[i] = 0;\n      }\n    }\n\n    // apply colors\n    switch (accu[0]) {\n      case 38:\n        attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 48:\n        attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 58:\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n    }\n\n    return advance;\n  }\n\n  /**\n   * SGR 4 subparams:\n   *    4:0   -   equal to SGR 24 (turn off all underline)\n   *    4:1   -   equal to SGR 4 (single underline)\n   *    4:2   -   equal to SGR 21 (double underline)\n   *    4:3   -   curly underline\n   *    4:4   -   dotted underline\n   *    4:5   -   dashed underline\n   */\n  private _processUnderline(style: number, attr: IAttributeData): void {\n    // treat extended attrs as immutable, thus always clone from old one\n    // this is needed since the buffer only holds references to it\n    attr.extended = attr.extended.clone();\n\n    // default to 1 == single underline\n    if (!~style || style > 5) {\n      style = 1;\n    }\n    attr.extended.underlineStyle = style;\n    attr.fg |= FgFlags.UNDERLINE;\n\n    // 0 deactivates underline\n    if (style === 0) {\n      attr.fg &= ~FgFlags.UNDERLINE;\n    }\n\n    // update HAS_EXTENDED in BG\n    attr.updateExtended();\n  }\n\n  private _processSGR0(attr: IAttributeData): void {\n    attr.fg = DEFAULT_ATTR_DATA.fg;\n    attr.bg = DEFAULT_ATTR_DATA.bg;\n    attr.extended = attr.extended.clone();\n    // Reset underline style and color. Note that we don't want to reset other\n    // fields such as the url id.\n    attr.extended.underlineStyle = UnderlineStyle.NONE;\n    attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    attr.updateExtended();\n  }\n\n  /**\n   * CSI Pm m  Character Attributes (SGR).\n   *\n   * @vt: #P[See below for supported attributes.]    CSI SGR   \"Select Graphic Rendition\"  \"CSI Pm m\"  \"Set/Reset various text attributes.\"\n   * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n   * are applied in order from left to right. The changed attributes are applied to all new\n   * characters received. If you move characters in the viewport by scrolling or any other means,\n   * then the attributes move with the characters.\n   *\n   * Supported param values by SGR:\n   *\n   * | Param     | Meaning                                                  | Support |\n   * | --------- | -------------------------------------------------------- | ------- |\n   * | 0         | Normal (default). Resets any other preceding SGR.        | #Y      |\n   * | 1         | Bold. (also see `options.drawBoldTextInBrightColors`)    | #Y      |\n   * | 2         | Faint, decreased intensity.                              | #Y      |\n   * | 3         | Italic.                                                  | #Y      |\n   * | 4         | Underlined (see below for style support).                | #Y      |\n   * | 5         | Slowly blinking.                                         | #N      |\n   * | 6         | Rapidly blinking.                                        | #N      |\n   * | 7         | Inverse. Flips foreground and background color.          | #Y      |\n   * | 8         | Invisible (hidden).                                      | #Y      |\n   * | 9         | Crossed-out characters (strikethrough).                  | #Y      |\n   * | 21        | Doubly underlined.                                       | #Y      |\n   * | 22        | Normal (neither bold nor faint).                         | #Y      |\n   * | 23        | No italic.                                               | #Y      |\n   * | 24        | Not underlined.                                          | #Y      |\n   * | 25        | Steady (not blinking).                                   | #Y      |\n   * | 27        | Positive (not inverse).                                  | #Y      |\n   * | 28        | Visible (not hidden).                                    | #Y      |\n   * | 29        | Not Crossed-out (strikethrough).                         | #Y      |\n   * | 30        | Foreground color: Black.                                 | #Y      |\n   * | 31        | Foreground color: Red.                                   | #Y      |\n   * | 32        | Foreground color: Green.                                 | #Y      |\n   * | 33        | Foreground color: Yellow.                                | #Y      |\n   * | 34        | Foreground color: Blue.                                  | #Y      |\n   * | 35        | Foreground color: Magenta.                               | #Y      |\n   * | 36        | Foreground color: Cyan.                                  | #Y      |\n   * | 37        | Foreground color: White.                                 | #Y      |\n   * | 38        | Foreground color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 39        | Foreground color: Default (original).                    | #Y      |\n   * | 40        | Background color: Black.                                 | #Y      |\n   * | 41        | Background color: Red.                                   | #Y      |\n   * | 42        | Background color: Green.                                 | #Y      |\n   * | 43        | Background color: Yellow.                                | #Y      |\n   * | 44        | Background color: Blue.                                  | #Y      |\n   * | 45        | Background color: Magenta.                               | #Y      |\n   * | 46        | Background color: Cyan.                                  | #Y      |\n   * | 47        | Background color: White.                                 | #Y      |\n   * | 48        | Background color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 49        | Background color: Default (original).                    | #Y      |\n   * | 53        | Overlined.                                               | #Y      |\n   * | 55        | Not Overlined.                                           | #Y      |\n   * | 58        | Underline color: Extended color.                         | #P[Support for RGB and indexed colors, see below.] |\n   * | 90 - 97   | Bright foreground color (analogous to 30 - 37).          | #Y      |\n   * | 100 - 107 | Bright background color (analogous to 40 - 47).          | #Y      |\n   *\n   * Underline supports subparams to denote the style in the form `4 : x`:\n   *\n   * | x      | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | No underline. Same as `SGR 24 m`.                             | #Y      |\n   * | 1      | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   * | 2      | Double underline.                                             | #Y      |\n   * | 3      | Curly underline.                                              | #Y      |\n   * | 4      | Dotted underline.                                             | #Y      |\n   * | 5      | Dashed underline.                                             | #Y      |\n   * | other  | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   *\n   * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n   * as follows:\n   *\n   * | Ps + 1 | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | Implementation defined.                                       | #N      |\n   * | 1      | Transparent.                                                  | #N      |\n   * | 2      | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`.  | #Y      |\n   * | 3      | CMY color.                                                    | #N      |\n   * | 4      | CMYK color.                                                   | #N      |\n   * | 5      | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y      |\n   *\n   *\n   * FIXME: blinking is implemented in attrs, but not working in renderers?\n   * FIXME: remove dead branch for p=100\n   */\n  public charAttributes(params: IParams): boolean {\n    // Optimize a single SGR0.\n    if (params.length === 1 && params.params[0] === 0) {\n      this._processSGR0(this._curAttrData);\n      return true;\n    }\n\n    const l = params.length;\n    let p;\n    const attr = this._curAttrData;\n\n    for (let i = 0; i < l; i++) {\n      p = params.params[i];\n      if (p >= 30 && p <= 37) {\n        // fg color 8\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 30);\n      } else if (p >= 40 && p <= 47) {\n        // bg color 8\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 40);\n      } else if (p >= 90 && p <= 97) {\n        // fg color 16\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n      } else if (p >= 100 && p <= 107) {\n        // bg color 16\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n      } else if (p === 0) {\n        // default\n        this._processSGR0(attr);\n      } else if (p === 1) {\n        // bold text\n        attr.fg |= FgFlags.BOLD;\n      } else if (p === 3) {\n        // italic text\n        attr.bg |= BgFlags.ITALIC;\n      } else if (p === 4) {\n        // underlined text\n        attr.fg |= FgFlags.UNDERLINE;\n        this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n      } else if (p === 5) {\n        // blink\n        attr.fg |= FgFlags.BLINK;\n      } else if (p === 7) {\n        // inverse and positive\n        // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n        attr.fg |= FgFlags.INVERSE;\n      } else if (p === 8) {\n        // invisible\n        attr.fg |= FgFlags.INVISIBLE;\n      } else if (p === 9) {\n        // strikethrough\n        attr.fg |= FgFlags.STRIKETHROUGH;\n      } else if (p === 2) {\n        // dimmed text\n        attr.bg |= BgFlags.DIM;\n      } else if (p === 21) {\n        // double underline\n        this._processUnderline(UnderlineStyle.DOUBLE, attr);\n      } else if (p === 22) {\n        // not bold nor faint\n        attr.fg &= ~FgFlags.BOLD;\n        attr.bg &= ~BgFlags.DIM;\n      } else if (p === 23) {\n        // not italic\n        attr.bg &= ~BgFlags.ITALIC;\n      } else if (p === 24) {\n        // not underlined\n        attr.fg &= ~FgFlags.UNDERLINE;\n        this._processUnderline(UnderlineStyle.NONE, attr);\n      } else if (p === 25) {\n        // not blink\n        attr.fg &= ~FgFlags.BLINK;\n      } else if (p === 27) {\n        // not inverse\n        attr.fg &= ~FgFlags.INVERSE;\n      } else if (p === 28) {\n        // not invisible\n        attr.fg &= ~FgFlags.INVISIBLE;\n      } else if (p === 29) {\n        // not strikethrough\n        attr.fg &= ~FgFlags.STRIKETHROUGH;\n      } else if (p === 39) {\n        // reset fg\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 49) {\n        // reset bg\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 38 || p === 48 || p === 58) {\n        // fg color 256 and RGB\n        i += this._extractColor(params, i, attr);\n      } else if (p === 53) {\n        // overline\n        attr.bg |= BgFlags.OVERLINE;\n      } else if (p === 55) {\n        // not overline\n        attr.bg &= ~BgFlags.OVERLINE;\n      } else if (p === 59) {\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = -1;\n        attr.updateExtended();\n      } else if (p === 100) { // FIXME: dead branch, p=100 already handled above!\n        // reset fg/bg\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else {\n        this._logService.debug('Unknown SGR attribute: %d.', p);\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps n  Device Status Report (DSR).\n   *     Ps = 5  -> Status Report.  Result (``OK'') is\n   *   CSI 0 n\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column].\n   *   Result is\n   *   CSI r ; c R\n   * CSI ? Ps n\n   *   Device Status Report (DSR, DEC-specific).\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI\n   *     ? r ; c R (assumes page is zero).\n   *     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready).\n   *     or CSI ? 1 1  n  (not ready).\n   *     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked)\n   *     or CSI ? 2 1  n  (locked).\n   *     Ps = 2 6  -> Report Keyboard status as\n   *   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American).\n   *   The last two parameters apply to VT400 & up, and denote key-\n   *   board ready and LK01 respectively.\n   *     Ps = 5 3  -> Report Locator status as\n   *   CSI ? 5 3  n  Locator available, if compiled-in, or\n   *   CSI ? 5 0  n  No Locator, if not.\n   *\n   * @vt: #Y CSI DSR   \"Device Status Report\"  \"CSI Ps n\"  \"Request cursor position (CPR) with `Ps` = 6.\"\n   */\n  public deviceStatus(params: IParams): boolean {\n    switch (params.params[0]) {\n      case 5:\n        // status report\n        this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n        break;\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n        break;\n    }\n    return true;\n  }\n\n  // @vt: #P[Only CPR is supported.]  CSI DECDSR  \"DEC Device Status Report\"  \"CSI ? Ps n\"  \"Only CPR is supported (same as DSR).\"\n  public deviceStatusPrivate(params: IParams): boolean {\n    // modern xterm doesnt seem to\n    // respond to any of these except ?6, 6, and 5\n    switch (params.params[0]) {\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n        break;\n      case 15:\n        // no printer\n        // this.handler(C0.ESC + '[?11n');\n        break;\n      case 25:\n        // dont support user defined keys\n        // this.handler(C0.ESC + '[?21n');\n        break;\n      case 26:\n        // north american keyboard\n        // this.handler(C0.ESC + '[?27;1;0;0n');\n        break;\n      case 53:\n        // no dec locator/mouse\n        // this.handler(C0.ESC + '[?50n');\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI ! p   Soft terminal reset (DECSTR).\n   * http://vt100.net/docs/vt220-rm/table4-10.html\n   *\n   * @vt: #Y CSI DECSTR  \"Soft Terminal Reset\"   \"CSI ! p\"   \"Reset several terminal attributes to initial state.\"\n   * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n   * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n   * sufficient.\n   *\n   * The following terminal attributes are reset to default values:\n   * - IRM is reset (dafault = false)\n   * - scroll margins are reset (default = viewport size)\n   * - erase attributes are reset to default\n   * - charsets are reset\n   * - DECSC data is reset to initial values\n   * - DECOM is reset to absolute mode\n   *\n   *\n   * FIXME: there are several more attributes missing (see VT520 manual)\n   */\n  public softReset(params: IParams): boolean {\n    this._coreService.isCursorHidden = false;\n    this._onRequestSyncScrollBar.fire();\n    this._activeBuffer.scrollTop = 0;\n    this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._coreService.reset();\n    this._charsetService.reset();\n\n    // reset DECSC data\n    this._activeBuffer.savedX = 0;\n    this._activeBuffer.savedY = this._activeBuffer.ybase;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n\n    // reset DECOM\n    this._coreService.decPrivateModes.origin = false;\n    return true;\n  }\n\n  /**\n   * CSI Ps SP q  Set cursor style (DECSCUSR, VT520).\n   *   Ps = 0  -> blinking block.\n   *   Ps = 1  -> blinking block (default).\n   *   Ps = 2  -> steady block.\n   *   Ps = 3  -> blinking underline.\n   *   Ps = 4  -> steady underline.\n   *   Ps = 5  -> blinking bar (xterm).\n   *   Ps = 6  -> steady bar (xterm).\n   *\n   * @vt: #Y CSI DECSCUSR  \"Set Cursor Style\"  \"CSI Ps SP q\"   \"Set cursor style.\"\n   * Supported cursor styles:\n   *  - empty, 0 or 1: steady block\n   *  - 2: blink block\n   *  - 3: steady underline\n   *  - 4: blink underline\n   *  - 5: steady bar\n   *  - 6: blink bar\n   */\n  public setCursorStyle(params: IParams): boolean {\n    const param = params.params[0] || 1;\n    switch (param) {\n      case 1:\n      case 2:\n        this._optionsService.options.cursorStyle = 'block';\n        break;\n      case 3:\n      case 4:\n        this._optionsService.options.cursorStyle = 'underline';\n        break;\n      case 5:\n      case 6:\n        this._optionsService.options.cursorStyle = 'bar';\n        break;\n    }\n    const isBlinking = param % 2 === 1;\n    this._optionsService.options.cursorBlink = isBlinking;\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps r\n   *   Set Scrolling Region [top;bottom] (default = full size of win-\n   *   dow) (DECSTBM).\n   *\n   * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n   */\n  public setScrollRegion(params: IParams): boolean {\n    const top = params.params[0] || 1;\n    let bottom: number;\n\n    if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n      bottom = this._bufferService.rows;\n    }\n\n    if (bottom > top) {\n      this._activeBuffer.scrollTop = top - 1;\n      this._activeBuffer.scrollBottom = bottom - 1;\n      this._setCursor(0, 0);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n   *\n   * Note: Only those listed below are supported. All others are left to integrators and\n   * need special treatment based on the embedding environment.\n   *\n   *    Ps = 1 4                                                          supported\n   *      Report xterm text area size in pixels.\n   *      Result is CSI 4 ; height ; width t\n   *    Ps = 14 ; 2                                                       not implemented\n   *    Ps = 16                                                           supported\n   *      Report xterm character cell size in pixels.\n   *      Result is CSI 6 ; height ; width t\n   *    Ps = 18                                                           supported\n   *      Report the size of the text area in characters.\n   *      Result is CSI 8 ; height ; width t\n   *    Ps = 20                                                           supported\n   *      Report xterm window's icon label.\n   *      Result is OSC L label ST\n   *    Ps = 21                                                           supported\n   *      Report xterm window's title.\n   *      Result is OSC l label ST\n   *    Ps = 22 ; 0  -> Save xterm icon and window title on stack.        supported\n   *    Ps = 22 ; 1  -> Save xterm icon title on stack.                   supported\n   *    Ps = 22 ; 2  -> Save xterm window title on stack.                 supported\n   *    Ps = 23 ; 0  -> Restore xterm icon and window title from stack.   supported\n   *    Ps = 23 ; 1  -> Restore xterm icon title from stack.              supported\n   *    Ps = 23 ; 2  -> Restore xterm window title from stack.            supported\n   *    Ps >= 24                                                          not implemented\n   */\n  public windowOptions(params: IParams): boolean {\n    if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n      return true;\n    }\n    const second = (params.length > 1) ? params.params[1] : 0;\n    switch (params.params[0]) {\n      case 14:  // GetWinSizePixels, returns CSI 4 ; height ; width t\n        if (second !== 2) {\n          this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n        }\n        break;\n      case 16:  // GetCellSizePixels, returns CSI 6 ; height ; width t\n        this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n        break;\n      case 18:  // GetWinSizeChars, returns CSI 8 ; height ; width t\n        if (this._bufferService) {\n          this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n        }\n        break;\n      case 22:  // PushTitle\n        if (second === 0 || second === 2) {\n          this._windowTitleStack.push(this._windowTitle);\n          if (this._windowTitleStack.length > STACK_LIMIT) {\n            this._windowTitleStack.shift();\n          }\n        }\n        if (second === 0 || second === 1) {\n          this._iconNameStack.push(this._iconName);\n          if (this._iconNameStack.length > STACK_LIMIT) {\n            this._iconNameStack.shift();\n          }\n        }\n        break;\n      case 23:  // PopTitle\n        if (second === 0 || second === 2) {\n          if (this._windowTitleStack.length) {\n            this.setTitle(this._windowTitleStack.pop()!);\n          }\n        }\n        if (second === 0 || second === 1) {\n          if (this._iconNameStack.length) {\n            this.setIconName(this._iconNameStack.pop()!);\n          }\n        }\n        break;\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI s\n   * ESC 7\n   *   Save cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCOSC   \"Save Cursor\"   \"CSI s\"   \"Save cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  SC   \"Save Cursor\"   \"ESC 7\"   \"Save cursor position, charmap and text attributes.\"\n   */\n  public saveCursor(params?: IParams): boolean {\n    this._activeBuffer.savedX = this._activeBuffer.x;\n    this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n    return true;\n  }\n\n\n  /**\n   * CSI u\n   * ESC 8\n   *   Restore cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCORC \"Restore Cursor\"  \"CSI u\"   \"Restore cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  RC \"Restore Cursor\"  \"ESC 8\"   \"Restore cursor position, charmap and text attributes.\"\n   */\n  public restoreCursor(params?: IParams): boolean {\n    this._activeBuffer.x = this._activeBuffer.savedX || 0;\n    this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n    this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n    this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n    this._charsetService.charset = (this as any)._savedCharset;\n    if (this._activeBuffer.savedCharset) {\n      this._charsetService.charset = this._activeBuffer.savedCharset;\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n\n  /**\n   * OSC 2; <data> ST (set window title)\n   *   Proxy to set window title.\n   *\n   * @vt: #P[Icon name is not exposed.]   OSC    0   \"Set Windows Title and Icon Name\"  \"OSC 0 ; Pt BEL\"  \"Set window title and icon name.\"\n   * Icon name is not supported. For Window Title see below.\n   *\n   * @vt: #Y     OSC    2   \"Set Windows Title\"  \"OSC 2 ; Pt BEL\"  \"Set window title.\"\n   * xterm.js does not manipulate the title directly, instead exposes changes via the event\n   * `Terminal.onTitleChange`.\n   */\n  public setTitle(data: string): boolean {\n    this._windowTitle = data;\n    this._onTitleChange.fire(data);\n    return true;\n  }\n\n  /**\n   * OSC 1; <data> ST\n   * Note: Icon name is not exposed.\n   */\n  public setIconName(data: string): boolean {\n    this._iconName = data;\n    return true;\n  }\n\n  /**\n   * OSC 4; <num> ; <text> ST (set ANSI color <num> to <text>)\n   *\n   * @vt: #Y    OSC    4    \"Set ANSI color\"   \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n   * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n   * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n   * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n   * currently set color.\n   */\n  public setOrReportIndexedColor(data: string): boolean {\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    while (slots.length > 1) {\n      const idx = slots.shift() as string;\n      const spec = slots.shift() as string;\n      if (/^\\d+$/.exec(idx)) {\n        const index = parseInt(idx);\n        if (isValidColorIndex(index)) {\n          if (spec === '?') {\n            event.push({ type: ColorRequestType.REPORT, index });\n          } else {\n            const color = parseColor(spec);\n            if (color) {\n              event.push({ type: ColorRequestType.SET, index, color });\n            }\n          }\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 8 ; <params> ; <uri> ST - create hyperlink\n   * OSC 8 ; ; ST - finish hyperlink\n   *\n   * Test case:\n   *\n   * ```sh\n   * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n   * ```\n   *\n   * @vt: #Y    OSC    8    \"Create hyperlink\"   \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n   * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n   * optional list of key=value assignments, separated by the : character.\n   * Example: `id=xyz123:foo=bar:baz=quux`.\n   * Currently only the id key is defined. Cells that share the same ID and URI share hover\n   * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n   */\n  public setHyperlink(data: string): boolean {\n    const args = data.split(';');\n    if (args.length < 2) {\n      return false;\n    }\n    if (args[1]) {\n      return this._createHyperlink(args[0], args[1]);\n    }\n    if (args[0]) {\n      return false;\n    }\n    return this._finishHyperlink();\n  }\n\n  private _createHyperlink(params: string, uri: string): boolean {\n    // It's legal to open a new hyperlink without explicitly finishing the previous one\n    if (this._getCurrentLinkId()) {\n      this._finishHyperlink();\n    }\n    const parsedParams = params.split(':');\n    let id: string | undefined;\n    const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n    if (idParamIndex !== -1) {\n      id = parsedParams[idParamIndex].slice(3) || undefined;\n    }\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  private _finishHyperlink(): boolean {\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = 0;\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  // special colors - OSC 10 | 11 | 12\n  private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n  /**\n   * Apply colors requests for special colors in OSC 10 | 11 | 12.\n   * Since these commands are stacking from multiple parameters,\n   * we handle them in a loop with an entry offset to `_specialColors`.\n   */\n  private _setOrReportSpecialColor(data: string, offset: number): boolean {\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i, ++offset) {\n      if (offset >= this._specialColors.length) break;\n      if (slots[i] === '?') {\n        this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n      } else {\n        const color = parseColor(slots[i]);\n        if (color) {\n          this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * OSC 10 ; <xcolor name>|<?> ST - set or query default foreground color\n   *\n   * @vt: #Y  OSC   10    \"Set or query default foreground color\"   \"OSC 10 ; Pt BEL\"  \"Set or query default foreground color.\"\n   * To set the color, the following color specification formats are supported:\n   * - `rgb:<red>/<green>/<blue>` for  `<red>, <green>, <blue>` in `h | hh | hhh | hhhh`, where\n   *   `h` is a single hexadecimal digit (case insignificant). The different widths scale\n   *   from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n   * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n   * - `#RRGGBB` - 8 bits per channel\n   * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n   * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n   *\n   * **Note:** X11 named colors are currently unsupported.\n   *\n   * If `Pt` contains `?` instead of a color specification, the terminal\n   * returns a sequence with the current default foreground color\n   * (use that sequence to restore the color after changes).\n   *\n   * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n   * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n   */\n  public setOrReportFgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 0);\n  }\n\n  /**\n   * OSC 11 ; <xcolor name>|<?> ST - set or query default background color\n   *\n   * @vt: #Y  OSC   11    \"Set or query default background color\"   \"OSC 11 ; Pt BEL\"  \"Same as OSC 10, but for default background.\"\n   */\n  public setOrReportBgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 1);\n  }\n\n  /**\n   * OSC 12 ; <xcolor name>|<?> ST - set or query default cursor color\n   *\n   * @vt: #Y  OSC   12    \"Set or query default cursor color\"   \"OSC 12 ; Pt BEL\"  \"Same as OSC 10, but for default cursor color.\"\n   */\n  public setOrReportCursorColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 2);\n  }\n\n  /**\n   * OSC 104 ; <num> ST - restore ANSI color <num>\n   *\n   * @vt: #Y  OSC   104    \"Reset ANSI color\"   \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n   * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n   * specified by the loaded theme. Any number of `c` parameters may be given.\n   * If no parameters are given, the entire indexed color table will be reset.\n   */\n  public restoreIndexedColor(data: string): boolean {\n    if (!data) {\n      this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n      return true;\n    }\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i) {\n      if (/^\\d+$/.exec(slots[i])) {\n        const index = parseInt(slots[i]);\n        if (isValidColorIndex(index)) {\n          event.push({ type: ColorRequestType.RESTORE, index });\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 110 ST - restore default foreground color\n   *\n   * @vt: #Y  OSC   110    \"Restore default foreground color\"   \"OSC 110 BEL\"  \"Restore default foreground to themed color.\"\n   */\n  public restoreFgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 111 ST - restore default background color\n   *\n   * @vt: #Y  OSC   111    \"Restore default background color\"   \"OSC 111 BEL\"  \"Restore default background to themed color.\"\n   */\n  public restoreBgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 112 ST - restore default cursor color\n   *\n   * @vt: #Y  OSC   112    \"Restore default cursor color\"   \"OSC 112 BEL\"  \"Restore default cursor to themed color.\"\n   */\n  public restoreCursorColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n    return true;\n  }\n\n  /**\n   * ESC E\n   * C1.NEL\n   *   DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n   *   Moves cursor to first position on next line.\n   *\n   * @vt: #Y   C1    NEL   \"Next Line\"   \"\\x85\"    \"Move the cursor to the beginning of the next row.\"\n   * @vt: #Y   ESC   NEL   \"Next Line\"   \"ESC E\"   \"Move the cursor to the beginning of the next row.\"\n   */\n  public nextLine(): boolean {\n    this._activeBuffer.x = 0;\n    this.index();\n    return true;\n  }\n\n  /**\n   * ESC =\n   *   DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n   *   Enables the numeric keypad to send application sequences to the host.\n   */\n  public keypadApplicationMode(): boolean {\n    this._logService.debug('Serial port requested application keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = true;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC >\n   *   DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n   *   Enables the keypad to send numeric characters to the host.\n   */\n  public keypadNumericMode(): boolean {\n    this._logService.debug('Switching back to normal keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = false;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC % @\n   * ESC % G\n   *   Select default character set. UTF-8 is not supported (string are unicode anyways)\n   *   therefore ESC % G does the same.\n   */\n  public selectDefaultCharset(): boolean {\n    this._charsetService.setgLevel(0);\n    this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n    return true;\n  }\n\n  /**\n   * ESC ( C\n   *   Designate G0 Character Set, VT100, ISO 2022.\n   * ESC ) C\n   *   Designate G1 Character Set (ISO 2022, VT100).\n   * ESC * C\n   *   Designate G2 Character Set (ISO 2022, VT220).\n   * ESC + C\n   *   Designate G3 Character Set (ISO 2022, VT220).\n   * ESC - C\n   *   Designate G1 Character Set (VT300).\n   * ESC . C\n   *   Designate G2 Character Set (VT300).\n   * ESC / C\n   *   Designate G3 Character Set (VT300). C = A  -> ISO Latin-1 Supplemental. - Supported?\n   */\n  public selectCharset(collectAndFlag: string): boolean {\n    if (collectAndFlag.length !== 2) {\n      this.selectDefaultCharset();\n      return true;\n    }\n    if (collectAndFlag[0] === '/') {\n      return true;  // TODO: Is this supported?\n    }\n    this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n    return true;\n  }\n\n  /**\n   * ESC D\n   * C1.IND\n   *   DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n   *   Moves the cursor down one line in the same column.\n   *\n   * @vt: #Y   C1    IND   \"Index\"   \"\\x84\"    \"Move the cursor one line down scrolling if needed.\"\n   * @vt: #Y   ESC   IND   \"Index\"   \"ESC D\"   \"Move the cursor one line down scrolling if needed.\"\n   */\n  public index(): boolean {\n    this._restrictCursor();\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * ESC H\n   * C1.HTS\n   *   DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n   *   Sets a horizontal tab stop at the column position indicated by\n   *   the value of the active column when the terminal receives an HTS.\n   *\n   * @vt: #Y   C1    HTS   \"Horizontal Tabulation Set\" \"\\x88\"    \"Places a tab stop at the current cursor position.\"\n   * @vt: #Y   ESC   HTS   \"Horizontal Tabulation Set\" \"ESC H\"   \"Places a tab stop at the current cursor position.\"\n   */\n  public tabSet(): boolean {\n    this._activeBuffer.tabs[this._activeBuffer.x] = true;\n    return true;\n  }\n\n  /**\n   * ESC M\n   * C1.RI\n   *   DEC mnemonic: HTS\n   *   Moves the cursor up one line in the same column. If the cursor is at the top margin,\n   *   the page scrolls down.\n   *\n   * @vt: #Y ESC  IR \"Reverse Index\" \"ESC M\"  \"Move the cursor one line up scrolling if needed.\"\n   */\n  public reverseIndex(): boolean {\n    this._restrictCursor();\n    if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n      // possibly move the code below to term.reverseScroll();\n      // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n      // blankLine(true) is xterm/linux behavior\n      const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n      this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n      this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n      this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    } else {\n      this._activeBuffer.y--;\n      this._restrictCursor(); // quickfix to not run out of bounds\n    }\n    return true;\n  }\n\n  /**\n   * ESC c\n   *   DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n   *   Reset to initial state.\n   */\n  public fullReset(): boolean {\n    this._parser.reset();\n    this._onRequestReset.fire();\n    return true;\n  }\n\n  public reset(): void {\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n  }\n\n  /**\n   * back_color_erase feature for xterm.\n   */\n  private _eraseAttrData(): IAttributeData {\n    this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n    this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n    return this._eraseAttrDataInternal;\n  }\n\n  /**\n   * ESC n\n   * ESC o\n   * ESC |\n   * ESC }\n   * ESC ~\n   *   DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n   *   When you use a locking shift, the character set remains in GL or GR until\n   *   you use another locking shift. (partly supported)\n   */\n  public setgLevel(level: number): boolean {\n    this._charsetService.setgLevel(level);\n    return true;\n  }\n\n  /**\n   * ESC # 8\n   *   DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n   *   This control function fills the complete screen area with\n   *   a test pattern (E) used for adjusting screen alignment.\n   *\n   * @vt: #Y   ESC   DECALN   \"Screen Alignment Pattern\"  \"ESC # 8\"  \"Fill viewport with a test pattern (E).\"\n   */\n  public screenAlignmentPattern(): boolean {\n    // prepare cell data\n    const cell = new CellData();\n    cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n    cell.fg = this._curAttrData.fg;\n    cell.bg = this._curAttrData.bg;\n\n\n    this._setCursor(0, 0);\n    for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n      const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n      const line = this._activeBuffer.lines.get(row);\n      if (line) {\n        line.fill(cell);\n        line.isWrapped = false;\n      }\n    }\n    this._dirtyRowTracker.markAllDirty();\n    this._setCursor(0, 0);\n    return true;\n  }\n\n\n  /**\n   * DCS $ q Pt ST\n   *   DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n   *   Request Status String (DECRQSS), VT420 and up.\n   *   Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n   *\n   * @vt: #P[Limited support, see below.]  DCS   DECRQSS   \"Request Selection or Setting\"  \"DCS $ q Pt ST\"   \"Request several terminal settings.\"\n   * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n   * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n   *\n   * Supported requests and responses:\n   *\n   * | Type                             | Request           | Response (`Pt`)                                       |\n   * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n   * | Graphic Rendition (SGR)          | `DCS $ q m ST`    | always reporting `0m` (currently broken)              |\n   * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST`    | `Ps ; Ps r`                                           |\n   * | Cursor Style (DECSCUSR)          | `DCS $ q SP q ST` | `Ps SP q`                                             |\n   * | Protection Attribute (DECSCA)    | `DCS $ q \" q ST`  | `Ps \" q` (DECSCA 2 is reported as Ps = 0)             |\n   * | Conformance Level (DECSCL)       | `DCS $ q \" p ST`  | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n   *\n   *\n   * TODO:\n   * - fix SGR report\n   * - either check which conformance is better suited or remove the report completely\n   *   --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n   */\n  public requestStatusString(data: string, params: IParams): boolean {\n    const f = (s: string): boolean => {\n      this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n      return true;\n    };\n\n    // access helpers\n    const b = this._bufferService.buffer;\n    const opts = this._optionsService.rawOptions;\n    const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n    if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n    if (data === '\"p') return f(`P1$r61;1\"p`);\n    if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n    // FIXME: report real SGR settings instead of 0m\n    if (data === 'm') return f(`P1$r0m`);\n    if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n    return f(`P0$r`);\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    this._dirtyRowTracker.markRangeDirty(y1, y2);\n  }\n}\n\nexport interface IDirtyRowTracker {\n  readonly start: number;\n  readonly end: number;\n\n  clearRange(): void;\n  markDirty(y: number): void;\n  markRangeDirty(y1: number, y2: number): void;\n  markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n  public start!: number;\n  public end!: number;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n    this.clearRange();\n  }\n\n  public clearRange(): void {\n    this.start = this._bufferService.buffer.y;\n    this.end = this._bufferService.buffer.y;\n  }\n\n  public markDirty(y: number): void {\n    if (y < this.start) {\n      this.start = y;\n    } else if (y > this.end) {\n      this.end = y;\n    }\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    if (y1 > y2) {\n      $temp = y1;\n      y1 = y2;\n      y2 = $temp;\n    }\n    if (y1 < this.start) {\n      this.start = y1;\n    }\n    if (y2 > this.end) {\n      this.end = y2;\n    }\n  }\n\n  public markAllDirty(): void {\n    this.markRangeDirty(0, this._bufferService.rows - 1);\n  }\n}\n\nfunction isValidColorIndex(value: number): value is ColorIndex {\n  return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n  protected _disposables: IDisposable[] = [];\n  protected _isDisposed: boolean = false;\n\n  /**\n   * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n   */\n  public dispose(): void {\n    this._isDisposed = true;\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.length = 0;\n  }\n\n  /**\n   * Registers a disposable object.\n   * @param d The disposable to register.\n   * @returns The disposable.\n   */\n  public register<T extends IDisposable>(d: T): T {\n    this._disposables.push(d);\n    return d;\n  }\n\n  /**\n   * Unregisters a disposable object if it has been registered, if not do\n   * nothing.\n   * @param d The disposable to unregister.\n   */\n  public unregister<T extends IDisposable>(d: T): void {\n    const index = this._disposables.indexOf(d);\n    if (index !== -1) {\n      this._disposables.splice(index, 1);\n    }\n  }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value?: T;\n  private _isDisposed = false;\n\n  /**\n   * Gets the value if it exists.\n   */\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  /**\n   * Sets the value, disposing of the old value if it exists.\n   */\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  /**\n   * Resets the stored value and disposes of the previously stored value.\n   */\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\n  }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n  return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n  for (const d of disposables) {\n    d.dispose();\n  }\n  disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n  return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n  private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n  public set(first: TFirst, second: TSecond, value: TValue): void {\n    if (!this._data[first]) {\n      this._data[first] = {};\n    }\n    this._data[first as string | number]![second] = value;\n  }\n\n  public get(first: TFirst, second: TSecond): TValue | undefined {\n    return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n  }\n\n  public clear(): void {\n    this._data = {};\n  }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n  private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n  public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n    if (!this._data.get(first, second)) {\n      this._data.set(first, second, new TwoKeyMap());\n    }\n    this._data.get(first, second)!.set(third, fourth, value);\n  }\n\n  public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n    return this._data.get(first, second)?.get(third, fourth);\n  }\n\n  public clear(): void {\n    this._data.clear();\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n  userAgent: string;\n  language: string;\n  platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nexport const isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. This\n * list is based on binary search and as such locating a key will take O(log n) amortized, this\n * includes the by key iterator.\n */\nexport class SortedList<T> {\n  private readonly _array: T[] = [];\n\n  constructor(\n    private readonly _getKey: (value: T) => number\n  ) {\n  }\n\n  public clear(): void {\n    this._array.length = 0;\n  }\n\n  public insert(value: T): void {\n    if (this._array.length === 0) {\n      this._array.push(value);\n      return;\n    }\n    i = this._search(this._getKey(value));\n    this._array.splice(i, 0, value);\n  }\n\n  public delete(value: T): boolean {\n    if (this._array.length === 0) {\n      return false;\n    }\n    const key = this._getKey(value);\n    if (key === undefined) {\n      return false;\n    }\n    i = this._search(key);\n    if (i === -1) {\n      return false;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return false;\n    }\n    do {\n      if (this._array[i] === value) {\n        this._array.splice(i, 1);\n        return true;\n      }\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n    return false;\n  }\n\n  public *getKeyIterator(key: number): IterableIterator<T> {\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      yield this._array[i];\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public forEachByKey(key: number, callback: (value: T) => void): void {\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      callback(this._array[i]);\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public values(): IterableIterator<T> {\n    // Duplicate the array to avoid issues when _array changes while iterating\n    return [...this._array].values();\n  }\n\n  private _search(key: number): number {\n    let min = 0;\n    let max = this._array.length - 1;\n    while (max >= min) {\n      let mid = (min + max) >> 1;\n      const midKey = this._getKey(this._array[mid]);\n      if (midKey > key) {\n        max = mid - 1;\n      } else if (midKey < key) {\n        min = mid + 1;\n      } else {\n        // key in list, walk to lowest duplicate\n        while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n          mid--;\n        }\n        return mid;\n      }\n    }\n    // key not in list\n    // still return closest min (also used as insert position)\n    return min;\n  }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = Date.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n      // this is not an issue here as a clock change during a short running task is very unlikely\n      // in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, Date.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = Date.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - Date.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor() {\n    this._queue = new IdleTaskQueue();\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n  // Winpty does not support wraparound mode which means that lines will never\n  // be marked as wrapped. This causes issues for things like copying a line\n  // retaining the wrapped new line characters or if consumers are listening\n  // in on the data stream.\n  //\n  // The workaround for this is to listen to every incoming line feed and mark\n  // the line as wrapped if the last character in the previous line is not a\n  // space. This is certainly not without its problems, but generally on\n  // Windows when text reaches the end of the terminal it's likely going to be\n  // wrapped.\n  const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n  const lastChar = line?.get(bufferService.cols - 1);\n\n  const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n  if (nextLine && lastChar) {\n    nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  public static toColorRGB(value: number): IColorRGB {\n    return [\n      value >>> Attributes.RED_SHIFT & 255,\n      value >>> Attributes.GREEN_SHIFT & 255,\n      value & 255\n    ];\n  }\n\n  public static fromColorRGB(value: IColorRGB): number {\n    return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n  }\n\n  public clone(): IAttributeData {\n    const newObj = new AttributeData();\n    newObj.fg = this.fg;\n    newObj.bg = this.bg;\n    newObj.extended = this.extended.clone();\n    return newObj;\n  }\n\n  // data\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n\n  // flags\n  public isInverse(): number       { return this.fg & FgFlags.INVERSE; }\n  public isBold(): number          { return this.fg & FgFlags.BOLD; }\n  public isUnderline(): number     {\n    if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n      return 1;\n    }\n    return this.fg & FgFlags.UNDERLINE;\n  }\n  public isBlink(): number         { return this.fg & FgFlags.BLINK; }\n  public isInvisible(): number     { return this.fg & FgFlags.INVISIBLE; }\n  public isItalic(): number        { return this.bg & BgFlags.ITALIC; }\n  public isDim(): number           { return this.bg & BgFlags.DIM; }\n  public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n  public isProtected(): number     { return this.bg & BgFlags.PROTECTED; }\n  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\n\n  // color modes\n  public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n  public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n  public isFgRGB(): boolean       { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isBgRGB(): boolean       { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isFgPalette(): boolean   { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isBgPalette(): boolean   { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isFgDefault(): boolean   { return (this.fg & Attributes.CM_MASK) === 0; }\n  public isBgDefault(): boolean   { return (this.bg & Attributes.CM_MASK) === 0; }\n  public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n  // colors\n  public getFgColor(): number {\n    switch (this.fg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.fg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.fg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n  public getBgColor(): number {\n    switch (this.bg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.bg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.bg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n\n  // extended attrs\n  public hasExtendedAttrs(): number {\n    return this.bg & BgFlags.HAS_EXTENDED;\n  }\n  public updateExtended(): void {\n    if (this.extended.isEmpty()) {\n      this.bg &= ~BgFlags.HAS_EXTENDED;\n    } else {\n      this.bg |= BgFlags.HAS_EXTENDED;\n    }\n  }\n  public getUnderlineColor(): number {\n    if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n      switch (this.extended.underlineColor & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:  return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n        case Attributes.CM_RGB:   return this.extended.underlineColor & Attributes.RGB_MASK;\n        default:                  return this.getFgColor();\n      }\n    }\n    return this.getFgColor();\n  }\n  public getUnderlineColorMode(): number {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? this.extended.underlineColor & Attributes.CM_MASK\n      : this.getFgColorMode();\n  }\n  public isUnderlineColorRGB(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n      : this.isFgRGB();\n  }\n  public isUnderlineColorPalette(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n          || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n      : this.isFgPalette();\n  }\n  public isUnderlineColorDefault(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n      : this.isFgDefault();\n  }\n  public getUnderlineStyle(): UnderlineStyle {\n    return this.fg & FgFlags.UNDERLINE\n      ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n      : UnderlineStyle.NONE;\n  }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n  private _ext: number = 0;\n  public get ext(): number {\n    if (this._urlId) {\n      return (\n        (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n        (this.underlineStyle << 26)\n      );\n    }\n    return this._ext;\n  }\n  public set ext(value: number) { this._ext = value; }\n\n  public get underlineStyle(): UnderlineStyle {\n    // Always return the URL style if it has one\n    if (this._urlId) {\n      return UnderlineStyle.DASHED;\n    }\n    return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n  }\n  public set underlineStyle(value: UnderlineStyle) {\n    this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n    this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n  }\n\n  public get underlineColor(): number {\n    return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n  public set underlineColor(value: number) {\n    this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n\n  private _urlId: number = 0;\n  public get urlId(): number {\n    return this._urlId;\n  }\n  public set urlId(value: number) {\n    this._urlId = value;\n  }\n\n  constructor(\n    ext: number = 0,\n    urlId: number = 0\n  ) {\n    this._ext = ext;\n    this._urlId = urlId;\n  }\n\n  public clone(): IExtendedAttrs {\n    return new ExtendedAttrs(this._ext, this._urlId);\n  }\n\n  /**\n   * Convenient method to indicate whether the object holds no additional information,\n   * that needs to be persistant in the buffer.\n   */\n  public isEmpty(): boolean {\n    return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IAttributeData, IBufferLine, ICellData, ICharset } from 'common/Types';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from 'common/buffer/BufferReflow';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from 'common/buffer/Constants';\nimport { Marker } from 'common/buffer/Marker';\nimport { IBuffer } from 'common/buffer/Types';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n *   - text content of this particular buffer\n *   - cursor position\n *   - scroll position\n */\nexport class Buffer implements IBuffer {\n  public lines: CircularList<IBufferLine>;\n  public ydisp: number = 0;\n  public ybase: number = 0;\n  public y: number = 0;\n  public x: number = 0;\n  public scrollBottom: number;\n  public scrollTop: number;\n  public tabs: { [column: number]: boolean | undefined } = {};\n  public savedY: number = 0;\n  public savedX: number = 0;\n  public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n  public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n  public markers: Marker[] = [];\n  private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n  private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n  private _cols: number;\n  private _rows: number;\n  private _isClearing: boolean = false;\n\n  constructor(\n    private _hasScrollback: boolean,\n    private _optionsService: IOptionsService,\n    private _bufferService: IBufferService\n  ) {\n    this._cols = this._bufferService.cols;\n    this._rows = this._bufferService.rows;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n  }\n\n  public getNullCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._nullCell.fg = attr.fg;\n      this._nullCell.bg = attr.bg;\n      this._nullCell.extended = attr.extended;\n    } else {\n      this._nullCell.fg = 0;\n      this._nullCell.bg = 0;\n      this._nullCell.extended = new ExtendedAttrs();\n    }\n    return this._nullCell;\n  }\n\n  public getWhitespaceCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._whitespaceCell.fg = attr.fg;\n      this._whitespaceCell.bg = attr.bg;\n      this._whitespaceCell.extended = attr.extended;\n    } else {\n      this._whitespaceCell.fg = 0;\n      this._whitespaceCell.bg = 0;\n      this._whitespaceCell.extended = new ExtendedAttrs();\n    }\n    return this._whitespaceCell;\n  }\n\n  public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n    return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n  }\n\n  public get hasScrollback(): boolean {\n    return this._hasScrollback && this.lines.maxLength > this._rows;\n  }\n\n  public get isCursorInViewport(): boolean {\n    const absoluteY = this.ybase + this.y;\n    const relativeY = absoluteY - this.ydisp;\n    return (relativeY >= 0 && relativeY < this._rows);\n  }\n\n  /**\n   * Gets the correct buffer length based on the rows provided, the terminal's\n   * scrollback and whether this buffer is flagged to have scrollback or not.\n   * @param rows The terminal rows to use in the calculation.\n   */\n  private _getCorrectBufferLength(rows: number): number {\n    if (!this._hasScrollback) {\n      return rows;\n    }\n\n    const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n    return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n  }\n\n  /**\n   * Fills the buffer's viewport with blank lines.\n   */\n  public fillViewportRows(fillAttr?: IAttributeData): void {\n    if (this.lines.length === 0) {\n      if (fillAttr === undefined) {\n        fillAttr = DEFAULT_ATTR_DATA;\n      }\n      let i = this._rows;\n      while (i--) {\n        this.lines.push(this.getBlankLine(fillAttr));\n      }\n    }\n  }\n\n  /**\n   * Clears the buffer to it's initial state, discarding all previous data.\n   */\n  public clear(): void {\n    this.ydisp = 0;\n    this.ybase = 0;\n    this.y = 0;\n    this.x = 0;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n  }\n\n  /**\n   * Resizes the buffer, adjusting its data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    // store reference to null cell with default attrs\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n    // count bufferlines with overly big memory to be cleaned afterwards\n    let dirtyMemoryLines = 0;\n\n    // Increase max length if needed before adjustments to allow space to fill\n    // as required.\n    const newMaxLength = this._getCorrectBufferLength(newRows);\n    if (newMaxLength > this.lines.maxLength) {\n      this.lines.maxLength = newMaxLength;\n    }\n\n    // The following adjustments should only happen if the buffer has been\n    // initialized/filled.\n    if (this.lines.length > 0) {\n      // Deal with columns increasing (reducing needs to happen after reflow)\n      if (this._cols < newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n\n      // Resize rows in both directions as needed\n      let addToY = 0;\n      if (this._rows < newRows) {\n        for (let y = this._rows; y < newRows; y++) {\n          if (this.lines.length < newRows + this.ybase) {\n            if (this._optionsService.rawOptions.windowsMode || this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n              // Just add the new missing rows on Windows as conpty reprints the screen with it's\n              // view of the world. Once a line enters scrollback for conpty it remains there\n              this.lines.push(new BufferLine(newCols, nullCell));\n            } else {\n              if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n                // There is room above the buffer and there are no empty elements below the line,\n                // scroll up\n                this.ybase--;\n                addToY++;\n                if (this.ydisp > 0) {\n                  // Viewport is at the top of the buffer, must increase downwards\n                  this.ydisp--;\n                }\n              } else {\n                // Add a blank line if there is no buffer left at the top to scroll to, or if there\n                // are blank lines after the cursor\n                this.lines.push(new BufferLine(newCols, nullCell));\n              }\n            }\n          }\n        }\n      } else { // (this._rows >= newRows)\n        for (let y = this._rows; y > newRows; y--) {\n          if (this.lines.length > newRows + this.ybase) {\n            if (this.lines.length > this.ybase + this.y + 1) {\n              // The line is a blank line below the cursor, remove it\n              this.lines.pop();\n            } else {\n              // The line is the cursor, scroll down\n              this.ybase++;\n              this.ydisp++;\n            }\n          }\n        }\n      }\n\n      // Reduce max length if needed after adjustments, this is done after as it\n      // would otherwise cut data from the bottom of the buffer.\n      if (newMaxLength < this.lines.maxLength) {\n        // Trim from the top of the buffer and adjust ybase and ydisp.\n        const amountToTrim = this.lines.length - newMaxLength;\n        if (amountToTrim > 0) {\n          this.lines.trimStart(amountToTrim);\n          this.ybase = Math.max(this.ybase - amountToTrim, 0);\n          this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n          this.savedY = Math.max(this.savedY - amountToTrim, 0);\n        }\n        this.lines.maxLength = newMaxLength;\n      }\n\n      // Make sure that the cursor stays on screen\n      this.x = Math.min(this.x, newCols - 1);\n      this.y = Math.min(this.y, newRows - 1);\n      if (addToY) {\n        this.y += addToY;\n      }\n      this.savedX = Math.min(this.savedX, newCols - 1);\n\n      this.scrollTop = 0;\n    }\n\n    this.scrollBottom = newRows - 1;\n\n    if (this._isReflowEnabled) {\n      this._reflow(newCols, newRows);\n\n      // Trim the end of the line off if cols shrunk\n      if (this._cols > newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n    }\n\n    this._cols = newCols;\n    this._rows = newRows;\n\n    this._memoryCleanupQueue.clear();\n    // schedule memory cleanup only, if more than 10% of the lines are affected\n    if (dirtyMemoryLines > 0.1 * this.lines.length) {\n      this._memoryCleanupPosition = 0;\n      this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n    }\n  }\n\n  private _memoryCleanupQueue = new IdleTaskQueue();\n  private _memoryCleanupPosition = 0;\n\n  private _batchedMemoryCleanup(): boolean {\n    let normalRun = true;\n    if (this._memoryCleanupPosition >= this.lines.length) {\n      // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n      // lines, which should finish rather quick if there are no more cleanups pending\n      this._memoryCleanupPosition = 0;\n      normalRun = false;\n    }\n    let counted = 0;\n    while (this._memoryCleanupPosition < this.lines.length) {\n      counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n      // cleanup max 100 lines per batch\n      if (counted > 100) {\n        return true;\n      }\n    }\n    // normal runs always need another rescan afterwards\n    // if we made it here with normalRun=false, we are in a final run\n    // and can end the cleanup task for sure\n    return normalRun;\n  }\n\n  private get _isReflowEnabled(): boolean {\n    const windowsPty = this._optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber) {\n      return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n    }\n    return this._hasScrollback && !this._optionsService.rawOptions.windowsMode;\n  }\n\n  private _reflow(newCols: number, newRows: number): void {\n    if (this._cols === newCols) {\n      return;\n    }\n\n    // Iterate through rows, ignore the last one as it cannot be wrapped\n    if (newCols > this._cols) {\n      this._reflowLarger(newCols, newRows);\n    } else {\n      this._reflowSmaller(newCols, newRows);\n    }\n  }\n\n  private _reflowLarger(newCols: number, newRows: number): void {\n    const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));\n    if (toRemove.length > 0) {\n      const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n      reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n      this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n    }\n  }\n\n  private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Adjust viewport based on number of items removed\n    let viewportAdjustments = countRemoved;\n    while (viewportAdjustments-- > 0) {\n      if (this.ybase === 0) {\n        if (this.y > 0) {\n          this.y--;\n        }\n        if (this.lines.length < newRows) {\n          // Add an extra row at the bottom of the viewport\n          this.lines.push(new BufferLine(newCols, nullCell));\n        }\n      } else {\n        if (this.ydisp === this.ybase) {\n          this.ydisp--;\n        }\n        this.ybase--;\n      }\n    }\n    this.savedY = Math.max(this.savedY - countRemoved, 0);\n  }\n\n  private _reflowSmaller(newCols: number, newRows: number): void {\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n    // batched up and only committed once\n    const toInsert = [];\n    let countToInsert = 0;\n    // Go backwards as many lines may be trimmed and this will avoid considering them\n    for (let y = this.lines.length - 1; y >= 0; y--) {\n      // Check whether this line is a problem\n      let nextLine = this.lines.get(y) as BufferLine;\n      if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n        continue;\n      }\n\n      // Gather wrapped lines and adjust y to be the starting line\n      const wrappedLines: BufferLine[] = [nextLine];\n      while (nextLine.isWrapped && y > 0) {\n        nextLine = this.lines.get(--y) as BufferLine;\n        wrappedLines.unshift(nextLine);\n      }\n\n      // If these lines contain the cursor don't touch them, the program will handle fixing up\n      // wrapped lines with the cursor\n      const absoluteY = this.ybase + this.y;\n      if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n        continue;\n      }\n\n      const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n      const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n      const linesToAdd = destLineLengths.length - wrappedLines.length;\n      let trimmedLines: number;\n      if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n        // If the top section of the buffer is not yet filled\n        trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n      } else {\n        trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n      }\n\n      // Add the new lines\n      const newLines: BufferLine[] = [];\n      for (let i = 0; i < linesToAdd; i++) {\n        const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n        newLines.push(newLine);\n      }\n      if (newLines.length > 0) {\n        toInsert.push({\n          // countToInsert here gets the actual index, taking into account other inserted items.\n          // using this we can iterate through the list forwards\n          start: y + wrappedLines.length + countToInsert,\n          newLines\n        });\n        countToInsert += newLines.length;\n      }\n      wrappedLines.push(...newLines);\n\n      // Copy buffer data to new locations, this needs to happen backwards to do in-place\n      let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n      let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n      if (destCol === 0) {\n        destLineIndex--;\n        destCol = destLineLengths[destLineIndex];\n      }\n      let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n      let srcCol = lastLineLength;\n      while (srcLineIndex >= 0) {\n        const cellsToCopy = Math.min(srcCol, destCol);\n        if (wrappedLines[destLineIndex] === undefined) {\n          // Sanity check that the line exists, this has been known to fail for an unknown reason\n          // which would stop the reflow from happening if an exception would throw.\n          break;\n        }\n        wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n        destCol -= cellsToCopy;\n        if (destCol === 0) {\n          destLineIndex--;\n          destCol = destLineLengths[destLineIndex];\n        }\n        srcCol -= cellsToCopy;\n        if (srcCol === 0) {\n          srcLineIndex--;\n          const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n          srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n        }\n      }\n\n      // Null out the end of the line ends if a wide character wrapped to the following line\n      for (let i = 0; i < wrappedLines.length; i++) {\n        if (destLineLengths[i] < newCols) {\n          wrappedLines[i].setCell(destLineLengths[i], nullCell);\n        }\n      }\n\n      // Adjust viewport as needed\n      let viewportAdjustments = linesToAdd - trimmedLines;\n      while (viewportAdjustments-- > 0) {\n        if (this.ybase === 0) {\n          if (this.y < newRows - 1) {\n            this.y++;\n            this.lines.pop();\n          } else {\n            this.ybase++;\n            this.ydisp++;\n          }\n        } else {\n          // Ensure ybase does not exceed its maximum value\n          if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n            if (this.ybase === this.ydisp) {\n              this.ydisp++;\n            }\n            this.ybase++;\n          }\n        }\n      }\n      this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n    }\n\n    // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n    // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n    // costly calls to CircularList.splice.\n    if (toInsert.length > 0) {\n      // Record buffer insert events and then play them back backwards so that the indexes are\n      // correct\n      const insertEvents: IInsertEvent[] = [];\n\n      // Record original lines so they don't get overridden when we rearrange the list\n      const originalLines: BufferLine[] = [];\n      for (let i = 0; i < this.lines.length; i++) {\n        originalLines.push(this.lines.get(i) as BufferLine);\n      }\n      const originalLinesLength = this.lines.length;\n\n      let originalLineIndex = originalLinesLength - 1;\n      let nextToInsertIndex = 0;\n      let nextToInsert = toInsert[nextToInsertIndex];\n      this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n      let countInsertedSoFar = 0;\n      for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n        if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n          // Insert extra lines here, adjusting i as needed\n          for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n            this.lines.set(i--, nextToInsert.newLines[nextI]);\n          }\n          i++;\n\n          // Create insert events for later\n          insertEvents.push({\n            index: originalLineIndex + 1,\n            amount: nextToInsert.newLines.length\n          });\n\n          countInsertedSoFar += nextToInsert.newLines.length;\n          nextToInsert = toInsert[++nextToInsertIndex];\n        } else {\n          this.lines.set(i, originalLines[originalLineIndex--]);\n        }\n      }\n\n      // Update markers\n      let insertCountEmitted = 0;\n      for (let i = insertEvents.length - 1; i >= 0; i--) {\n        insertEvents[i].index += insertCountEmitted;\n        this.lines.onInsertEmitter.fire(insertEvents[i]);\n        insertCountEmitted += insertEvents[i].amount;\n      }\n      const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n      if (amountToTrim > 0) {\n        this.lines.onTrimEmitter.fire(amountToTrim);\n      }\n    }\n  }\n\n  /**\n   * Translates a buffer line to a string, with optional start and end columns.\n   * Wide characters will count as two columns in the resulting string. This\n   * function is useful for getting the actual text underneath the raw selection\n   * position.\n   * @param lineIndex The absolute index of the line being translated.\n   * @param trimRight Whether to trim whitespace to the right.\n   * @param startCol The column to start at.\n   * @param endCol The column to end at.\n   */\n  public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n    const line = this.lines.get(lineIndex);\n    if (!line) {\n      return '';\n    }\n    return line.translateToString(trimRight, startCol, endCol);\n  }\n\n  public getWrappedRangeForLine(y: number): { first: number, last: number } {\n    let first = y;\n    let last = y;\n    // Scan upwards for wrapped lines\n    while (first > 0 && this.lines.get(first)!.isWrapped) {\n      first--;\n    }\n    // Scan downwards for wrapped lines\n    while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n      last++;\n    }\n    return { first, last };\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    if (i !== null && i !== undefined) {\n      if (!this.tabs[i]) {\n        i = this.prevStop(i);\n      }\n    } else {\n      this.tabs = {};\n      i = 0;\n    }\n\n    for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n      this.tabs[i] = true;\n    }\n  }\n\n  /**\n   * Move the cursor to the previous tab stop from the given position (default is current).\n   * @param x The position to move the cursor to the previous tab stop.\n   */\n  public prevStop(x?: number): number {\n    if (x === null || x === undefined) {\n      x = this.x;\n    }\n    while (!this.tabs[--x] && x > 0);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Move the cursor one tab stop forward from the given position (default is current).\n   * @param x The position to move the cursor one tab stop forward.\n   */\n  public nextStop(x?: number): number {\n    if (x === null || x === undefined) {\n      x = this.x;\n    }\n    while (!this.tabs[++x] && x < this._cols);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Clears markers on single line.\n   * @param y The line to clear.\n   */\n  public clearMarkers(y: number): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      if (this.markers[i].line === y) {\n        this.markers[i].dispose();\n        this.markers.splice(i--, 1);\n      }\n    }\n    this._isClearing = false;\n  }\n\n  /**\n   * Clears markers on all lines\n   */\n  public clearAllMarkers(): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      this.markers[i].dispose();\n      this.markers.splice(i--, 1);\n    }\n    this._isClearing = false;\n  }\n\n  public addMarker(y: number): Marker {\n    const marker = new Marker(y);\n    this.markers.push(marker);\n    marker.register(this.lines.onTrim(amount => {\n      marker.line -= amount;\n      // The marker should be disposed when the line is trimmed from the buffer\n      if (marker.line < 0) {\n        marker.dispose();\n      }\n    }));\n    marker.register(this.lines.onInsert(event => {\n      if (marker.line >= event.index) {\n        marker.line += event.amount;\n      }\n    }));\n    marker.register(this.lines.onDelete(event => {\n      // Delete the marker if it's within the range\n      if (marker.line >= event.index && marker.line < event.index + event.amount) {\n        marker.dispose();\n      }\n\n      // Shift the marker if it's after the deleted range\n      if (marker.line > event.index) {\n        marker.line -= event.amount;\n      }\n    }));\n    marker.register(marker.onDispose(() => this._removeMarker(marker)));\n    return marker;\n  }\n\n  private _removeMarker(marker: Marker): void {\n    if (!this._isClearing) {\n      this.markers.splice(this.markers.indexOf(marker), 1);\n    }\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from 'common/Types';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\n\n/**\n * buffer memory layout:\n *\n *   |             uint32_t             |        uint32_t         |        uint32_t         |\n *   |             `content`            |          `FG`           |          `BG`           |\n *   | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n *    `content = data[column * CELL_SIZE + Cell.CONTENT];`\n *    `fg = data[column * CELL_SIZE + Cell.FG];`\n *    `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n  CONTENT = 0,\n  FG = 1, // currently simply holds all known attrs\n  BG = 2  // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\n\n/** Factor when to cleanup underlying array buffer after shrinking. */\nconst CLEANUP_THRESHOLD = 2;\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n *   Use these for data that is already UTF32.\n *   Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n *   This method takes a CellData object and stores the data in the buffer.\n *   Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n  protected _data: Uint32Array;\n  protected _combined: {[index: number]: string} = {};\n  protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n  public length: number;\n\n  constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n    this._data = new Uint32Array(cols * CELL_SIZE);\n    const cell = fillCellData || CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n    for (let i = 0; i < cols; ++i) {\n      this.setCell(i, cell);\n    }\n    this.length = cols;\n  }\n\n  /**\n   * Get cell data CharData.\n   * @deprecated\n   */\n  public get(index: number): CharData {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    const cp = content & Content.CODEPOINT_MASK;\n    return [\n      this._data[index * CELL_SIZE + Cell.FG],\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index]\n        : (cp) ? stringFromCodePoint(cp) : '',\n      content >> Content.WIDTH_SHIFT,\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n        : cp\n    ];\n  }\n\n  /**\n   * Set cell data from CharData.\n   * @deprecated\n   */\n  public set(index: number, value: CharData): void {\n    this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n    if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n      this._combined[index] = value[1];\n      this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    } else {\n      this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n\n  /**\n   * primitive getters\n   * use these when only one value is needed, otherwise use `loadCell`\n   */\n  public getWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n  }\n\n  /** Test whether content has width. */\n  public hasWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n  }\n\n  /** Get FG cell component. */\n  public getFg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.FG];\n  }\n\n  /** Get BG cell component. */\n  public getBg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG];\n  }\n\n  /**\n   * Test whether contains any chars.\n   * Basically an empty has no content, but other cells might differ in FG/BG\n   * from real empty cells.\n   */\n  public hasContent(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n  }\n\n  /**\n   * Get codepoint of the cell.\n   * To be in line with `code` in CharData this either returns\n   * a single UTF32 codepoint or the last codepoint of a combined string.\n   */\n  public getCodePoint(index: number): number {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index].charCodeAt(this._combined[index].length - 1);\n    }\n    return content & Content.CODEPOINT_MASK;\n  }\n\n  /** Test whether the cell contains a combined string. */\n  public isCombined(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n  }\n\n  /** Returns the string content of the cell. */\n  public getString(index: number): string {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index];\n    }\n    if (content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n    }\n    // return empty string for empty cells\n    return '';\n  }\n\n  /** Get state of protected flag. */\n  public isProtected(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG] & BgFlags.PROTECTED;\n  }\n\n  /**\n   * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n   * to GC as it significantly reduced the amount of new objects/references needed.\n   */\n  public loadCell(index: number, cell: ICellData): ICellData {\n    $startIndex = index * CELL_SIZE;\n    cell.content = this._data[$startIndex + Cell.CONTENT];\n    cell.fg = this._data[$startIndex + Cell.FG];\n    cell.bg = this._data[$startIndex + Cell.BG];\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      cell.combinedData = this._combined[index];\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      cell.extended = this._extendedAttrs[index]!;\n    }\n    return cell;\n  }\n\n  /**\n   * Set data at `index` to `cell`.\n   */\n  public setCell(index: number, cell: ICellData): void {\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      this._combined[index] = cell.combinedData;\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = cell.extended;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n    this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n    this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n  }\n\n  /**\n   * Set cell data from input handler.\n   * Since the input handler see the incoming chars as UTF32 codepoints,\n   * it gets an optimized access method.\n   */\n  public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void {\n    if (bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = eAttrs;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n    this._data[index * CELL_SIZE + Cell.FG] = fg;\n    this._data[index * CELL_SIZE + Cell.BG] = bg;\n  }\n\n  /**\n   * Add a codepoint to a cell from input handler.\n   * During input stage combining chars with a width of 0 follow and stack\n   * onto a leading char. Since we already set the attrs\n   * by the previous `setDataFromCodePoint` call, we can omit it here.\n   */\n  public addCodepointToCell(index: number, codePoint: number): void {\n    let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      // we already have a combined string, simply add\n      this._combined[index] += stringFromCodePoint(codePoint);\n    } else {\n      if (content & Content.CODEPOINT_MASK) {\n        // normal case for combining chars:\n        //  - move current leading char + new one into combined string\n        //  - set combined flag\n        this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n        content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n        content |= Content.IS_COMBINED_MASK;\n      } else {\n        // should not happen - we actually have no data in the cell yet\n        // simply set the data in the cell buffer with a width of 1\n        content = codePoint | (1 << Content.WIDTH_SHIFT);\n      }\n      this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n    }\n  }\n\n  public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n    pos %= this.length;\n\n    // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n\n    if (n < this.length - pos) {\n      const cell = new CellData();\n      for (let i = this.length - pos - n - 1; i >= 0; --i) {\n        this.setCell(pos + n + i, this.loadCell(pos + i, cell));\n      }\n      for (let i = 0; i < n; ++i) {\n        this.setCell(pos + i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n    if (this.getWidth(this.length - 1) === 2) {\n      this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n  }\n\n  public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n    pos %= this.length;\n    if (n < this.length - pos) {\n      const cell = new CellData();\n      for (let i = 0; i < this.length - pos - n; ++i) {\n        this.setCell(pos + i, this.loadCell(pos + n + i, cell));\n      }\n      for (let i = this.length - n; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at pos:\n    // - reset pos-1 if wide char\n    // - reset pos if width==0 (previous second cell of a wide char)\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n    if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n      this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n  }\n\n  public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n        this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n      }\n      if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n        this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n      }\n      while (start < end  && start < this.length) {\n        if (!this.isProtected(start)) {\n          this.setCell(start, fillCellData);\n        }\n        start++;\n      }\n      return;\n    }\n\n    // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n    if (start && this.getWidth(start - 1) === 2) {\n      this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n    // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n    if (end < this.length && this.getWidth(end - 1) === 2) {\n      this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n\n    while (start < end  && start < this.length) {\n      this.setCell(start++, fillCellData);\n    }\n  }\n\n  /**\n   * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n   * The underlying array buffer will not change if there is still enough space\n   * to hold the new buffer line data.\n   * Returns a boolean indicating, whether a `cleanupMemory` call would free\n   * excess memory (true after shrinking > CLEANUP_THRESHOLD).\n   */\n  public resize(cols: number, fillCellData: ICellData): boolean {\n    if (cols === this.length) {\n      return this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n    }\n    const uint32Cells = cols * CELL_SIZE;\n    if (cols > this.length) {\n      if (this._data.buffer.byteLength >= uint32Cells * 4) {\n        // optimization: avoid alloc and data copy if buffer has enough room\n        this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n      } else {\n        // slow path: new alloc and full data copy\n        const data = new Uint32Array(uint32Cells);\n        data.set(this._data);\n        this._data = data;\n      }\n      for (let i = this.length; i < cols; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      // optimization: just shrink the view on existing buffer\n      this._data = this._data.subarray(0, uint32Cells);\n      // Remove any cut off combined data\n      const keys = Object.keys(this._combined);\n      for (let i = 0; i < keys.length; i++) {\n        const key = parseInt(keys[i], 10);\n        if (key >= cols) {\n          delete this._combined[key];\n        }\n      }\n      // remove any cut off extended attributes\n      const extKeys = Object.keys(this._extendedAttrs);\n      for (let i = 0; i < extKeys.length; i++) {\n        const key = parseInt(extKeys[i], 10);\n        if (key >= cols) {\n          delete this._extendedAttrs[key];\n        }\n      }\n    }\n    this.length = cols;\n    return uint32Cells * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n  }\n\n  /**\n   * Cleanup underlying array buffer.\n   * A cleanup will be triggered if the array buffer exceeds the actual used\n   * memory by a factor of CLEANUP_THRESHOLD.\n   * Returns 0 or 1 indicating whether a cleanup happened.\n   */\n  public cleanupMemory(): number {\n    if (this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n      const data = new Uint32Array(this._data.length);\n      data.set(this._data);\n      this._data = data;\n      return 1;\n    }\n    return 0;\n  }\n\n  /** fill a line with fillCharData */\n  public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      for (let i = 0; i < this.length; ++i) {\n        if (!this.isProtected(i)) {\n          this.setCell(i, fillCellData);\n        }\n      }\n      return;\n    }\n    this._combined = {};\n    this._extendedAttrs = {};\n    for (let i = 0; i < this.length; ++i) {\n      this.setCell(i, fillCellData);\n    }\n  }\n\n  /** alter to a full copy of line  */\n  public copyFrom(line: BufferLine): void {\n    if (this.length !== line.length) {\n      this._data = new Uint32Array(line._data);\n    } else {\n      // use high speed copy if lengths are equal\n      this._data.set(line._data);\n    }\n    this.length = line.length;\n    this._combined = {};\n    for (const el in line._combined) {\n      this._combined[el] = line._combined[el];\n    }\n    this._extendedAttrs = {};\n    for (const el in line._extendedAttrs) {\n      this._extendedAttrs[el] = line._extendedAttrs[el];\n    }\n    this.isWrapped = line.isWrapped;\n  }\n\n  /** create a new clone */\n  public clone(): IBufferLine {\n    const newLine = new BufferLine(0);\n    newLine._data = new Uint32Array(this._data);\n    newLine.length = this.length;\n    for (const el in this._combined) {\n      newLine._combined[el] = this._combined[el];\n    }\n    for (const el in this._extendedAttrs) {\n      newLine._extendedAttrs[el] = this._extendedAttrs[el];\n    }\n    newLine.isWrapped = this.isWrapped;\n    return newLine;\n  }\n\n  public getTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public getNoBgTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * CELL_SIZE + Cell.BG] & Attributes.CM_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n    const srcData = src._data;\n    if (applyInReverse) {\n      for (let cell = length - 1; cell >= 0; cell--) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    } else {\n      for (let cell = 0; cell < length; cell++) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    }\n\n    // Move any combined data over as needed, FIXME: repeat for extended attrs\n    const srcCombinedKeys = Object.keys(src._combined);\n    for (let i = 0; i < srcCombinedKeys.length; i++) {\n      const key = parseInt(srcCombinedKeys[i], 10);\n      if (key >= srcCol) {\n        this._combined[key - srcCol + destCol] = src._combined[key];\n      }\n    }\n  }\n\n  public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {\n    if (trimRight) {\n      endCol = Math.min(endCol, this.getTrimmedLength());\n    }\n    let result = '';\n    while (startCol < endCol) {\n      const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n      const cp = content & Content.CODEPOINT_MASK;\n      result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n      startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1\n    }\n    return result;\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from 'xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n  if (range.start.y > range.end.y) {\n    throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n  }\n  return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n  layout: number[];\n  countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {\n  // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n  // batched up and only committed once\n  const toRemove: number[] = [];\n\n  for (let y = 0; y < lines.length - 1; y++) {\n    // Check if this row is wrapped\n    let i = y;\n    let nextLine = lines.get(++i) as BufferLine;\n    if (!nextLine.isWrapped) {\n      continue;\n    }\n\n    // Check how many lines it's wrapped for\n    const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n    while (i < lines.length && nextLine.isWrapped) {\n      wrappedLines.push(nextLine);\n      nextLine = lines.get(++i) as BufferLine;\n    }\n\n    // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped\n    // lines with the cursor\n    if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n      y += wrappedLines.length - 1;\n      continue;\n    }\n\n    // Copy buffer data to new locations\n    let destLineIndex = 0;\n    let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n    let srcLineIndex = 1;\n    let srcCol = 0;\n    while (srcLineIndex < wrappedLines.length) {\n      const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n      const srcRemainingCells = srcTrimmedTineLength - srcCol;\n      const destRemainingCells = newCols - destCol;\n      const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n      wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n      destCol += cellsToCopy;\n      if (destCol === newCols) {\n        destLineIndex++;\n        destCol = 0;\n      }\n      srcCol += cellsToCopy;\n      if (srcCol === srcTrimmedTineLength) {\n        srcLineIndex++;\n        srcCol = 0;\n      }\n\n      // Make sure the last cell isn't wide, if it is copy it to the current dest\n      if (destCol === 0 && destLineIndex !== 0) {\n        if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n          wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n          // Null out the end of the last row\n          wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n        }\n      }\n    }\n\n    // Clear out remaining cells or fragments could remain;\n    wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n    // Work backwards and remove any rows at the end that only contain null cells\n    let countToRemove = 0;\n    for (let i = wrappedLines.length - 1; i > 0; i--) {\n      if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n        countToRemove++;\n      } else {\n        break;\n      }\n    }\n\n    if (countToRemove > 0) {\n      toRemove.push(y + wrappedLines.length - countToRemove); // index\n      toRemove.push(countToRemove);\n    }\n\n    y += wrappedLines.length - 1;\n  }\n  return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n  const layout: number[] = [];\n  // First iterate through the list and get the actual indexes to use for rows\n  let nextToRemoveIndex = 0;\n  let nextToRemoveStart = toRemove[nextToRemoveIndex];\n  let countRemovedSoFar = 0;\n  for (let i = 0; i < lines.length; i++) {\n    if (nextToRemoveStart === i) {\n      const countToRemove = toRemove[++nextToRemoveIndex];\n\n      // Tell markers that there was a deletion\n      lines.onDeleteEmitter.fire({\n        index: i - countRemovedSoFar,\n        amount: countToRemove\n      });\n\n      i += countToRemove - 1;\n      countRemovedSoFar += countToRemove;\n      nextToRemoveStart = toRemove[++nextToRemoveIndex];\n    } else {\n      layout.push(i);\n    }\n  }\n  return {\n    layout,\n    countRemoved: countRemovedSoFar\n  };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n  // Record original lines so they don't get overridden when we rearrange the list\n  const newLayoutLines: BufferLine[] = [];\n  for (let i = 0; i < newLayout.length; i++) {\n    newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n  }\n\n  // Rearrange the list\n  for (let i = 0; i < newLayoutLines.length; i++) {\n    lines.set(i, newLayoutLines[i]);\n  }\n  lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n  const newLineLengths: number[] = [];\n  const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n  // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n  // linesNeeded\n  let srcCol = 0;\n  let srcLine = 0;\n  let cellsAvailable = 0;\n  while (cellsAvailable < cellsNeeded) {\n    if (cellsNeeded - cellsAvailable < newCols) {\n      // Add the final line and exit the loop\n      newLineLengths.push(cellsNeeded - cellsAvailable);\n      break;\n    }\n    srcCol += newCols;\n    const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n    if (srcCol > oldTrimmedLength) {\n      srcCol -= oldTrimmedLength;\n      srcLine++;\n    }\n    const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n    if (endsWithWide) {\n      srcCol--;\n    }\n    const lineLength = endsWithWide ? newCols - 1 : newCols;\n    newLineLengths.push(lineLength);\n    cellsAvailable += lineLength;\n  }\n\n  return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n  // If this is the last row in the wrapped line, get the actual trimmed length\n  if (i === lines.length - 1) {\n    return lines[i].getTrimmedLength();\n  }\n  // Detect whether the following line starts with a wide character and the end of the current line\n  // is null, if so then we can be pretty sure the null character should be excluded from the line\n  // length]\n  const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n  const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n  if (endsInNull && followingLineStartsWithWide) {\n    return cols - 1;\n  }\n  return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n  private _normal!: Buffer;\n  private _alt!: Buffer;\n  private _activeBuffer!: Buffer;\n\n  private readonly _onBufferActivate = this.register(new EventEmitter<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}>());\n  public readonly onBufferActivate = this._onBufferActivate.event;\n\n  /**\n   * Create a new BufferSet for the given terminal.\n   */\n  constructor(\n    private readonly _optionsService: IOptionsService,\n    private readonly _bufferService: IBufferService\n  ) {\n    super();\n    this.reset();\n    this.register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n    this.register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n  }\n\n  public reset(): void {\n    this._normal = new Buffer(true, this._optionsService, this._bufferService);\n    this._normal.fillViewportRows();\n\n    // The alt buffer should never have scrollback.\n    // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n    this._alt = new Buffer(false, this._optionsService, this._bufferService);\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n\n    this.setupTabStops();\n  }\n\n  /**\n   * Returns the alt Buffer of the BufferSet\n   */\n  public get alt(): Buffer {\n    return this._alt;\n  }\n\n  /**\n   * Returns the currently active Buffer of the BufferSet\n   */\n  public get active(): Buffer {\n    return this._activeBuffer;\n  }\n\n  /**\n   * Returns the normal Buffer of the BufferSet\n   */\n  public get normal(): Buffer {\n    return this._normal;\n  }\n\n  /**\n   * Sets the normal Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateNormalBuffer(): void {\n    if (this._activeBuffer === this._normal) {\n      return;\n    }\n    this._normal.x = this._alt.x;\n    this._normal.y = this._alt.y;\n    // The alt buffer should always be cleared when we switch to the normal\n    // buffer. This frees up memory since the alt buffer should always be new\n    // when activated.\n    this._alt.clearAllMarkers();\n    this._alt.clear();\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n  }\n\n  /**\n   * Sets the alt Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateAltBuffer(fillAttr?: IAttributeData): void {\n    if (this._activeBuffer === this._alt) {\n      return;\n    }\n    // Since the alt buffer is always cleared when the normal buffer is\n    // activated, we want to fill it when switching to it.\n    this._alt.fillViewportRows(fillAttr);\n    this._alt.x = this._normal.x;\n    this._alt.y = this._normal.y;\n    this._activeBuffer = this._alt;\n    this._onBufferActivate.fire({\n      activeBuffer: this._alt,\n      inactiveBuffer: this._normal\n    });\n  }\n\n  /**\n   * Resizes both normal and alt buffers, adjusting their data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    this._normal.resize(newCols, newRows);\n    this._alt.resize(newCols, newRows);\n    this.setupTabStops(newCols);\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    this._normal.setupTabStops(i);\n    this._alt.setupTabStops(i);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n  /** Helper to create CellData from CharData. */\n  public static fromCharData(value: CharData): CellData {\n    const obj = new CellData();\n    obj.setFromCharData(value);\n    return obj;\n  }\n  /** Primitives from terminal buffer. */\n  public content = 0;\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n  public combinedData = '';\n  /** Whether cell contains a combined string. */\n  public isCombined(): number {\n    return this.content & Content.IS_COMBINED_MASK;\n  }\n  /** Width of the cell. */\n  public getWidth(): number {\n    return this.content >> Content.WIDTH_SHIFT;\n  }\n  /** JS string of the content. */\n  public getChars(): string {\n    if (this.content & Content.IS_COMBINED_MASK) {\n      return this.combinedData;\n    }\n    if (this.content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n    }\n    return '';\n  }\n  /**\n   * Codepoint of cell\n   * Note this returns the UTF32 codepoint of single chars,\n   * if content is a combined string it returns the codepoint\n   * of the last char in string to be in line with code in CharData.\n   */\n  public getCode(): number {\n    return (this.isCombined())\n      ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n      : this.content & Content.CODEPOINT_MASK;\n  }\n  /** Set data from CharData */\n  public setFromCharData(value: CharData): void {\n    this.fg = value[CHAR_DATA_ATTR_INDEX];\n    this.bg = 0;\n    let combined = false;\n    // surrogates and combined strings need special treatment\n    if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n      combined = true;\n    }\n    else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n      const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n      // if the 2-char string is a surrogate create single codepoint\n      // everything else is combined\n      if (0xD800 <= code && code <= 0xDBFF) {\n        const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n        }\n        else {\n          combined = true;\n        }\n      }\n      else {\n        combined = true;\n      }\n    }\n    else {\n      this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n    if (combined) {\n      this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n      this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n  /** Get data as CharData. */\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n  /**\n   * bit 1..21    codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n   *              read:   `codepoint = content & Content.codepointMask;`\n   *              write:  `content |= codepoint & Content.codepointMask;`\n   *                      shortcut if precondition `codepoint <= 0x10FFFF` is met:\n   *                      `content |= codepoint;`\n   */\n  CODEPOINT_MASK = 0x1FFFFF,\n\n  /**\n   * bit 22       flag indication whether a cell contains combined content\n   *              read:   `isCombined = content & Content.isCombined;`\n   *              set:    `content |= Content.isCombined;`\n   *              clear:  `content &= ~Content.isCombined;`\n   */\n  IS_COMBINED_MASK = 0x200000,  // 1 << 21\n\n  /**\n   * bit 1..22    mask to check whether a cell contains any string data\n   *              we need to check for codepoint and isCombined bits to see\n   *              whether a cell contains anything\n   *              read:   `isEmpty = !(content & Content.hasContent)`\n   */\n  HAS_CONTENT_MASK = 0x3FFFFF,\n\n  /**\n   * bit 23..24   wcwidth value of cell, takes 2 bits (ranges from 0..2)\n   *              read:   `width = (content & Content.widthMask) >> Content.widthShift;`\n   *                      `hasWidth = content & Content.widthMask;`\n   *                      as long as wcwidth is highest value in `content`:\n   *                      `width = content >> Content.widthShift;`\n   *              write:  `content |= (width << Content.widthShift) & Content.widthMask;`\n   *                      shortcut if precondition `0 <= width <= 3` is met:\n   *                      `content |= width << Content.widthShift;`\n   */\n  WIDTH_MASK = 0xC00000,   // 3 << 22\n  WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n  /**\n   * bit 1..8     blue in RGB, color in P256 and P16\n   */\n  BLUE_MASK = 0xFF,\n  BLUE_SHIFT = 0,\n  PCOLOR_MASK = 0xFF,\n  PCOLOR_SHIFT = 0,\n\n  /**\n   * bit 9..16    green in RGB\n   */\n  GREEN_MASK = 0xFF00,\n  GREEN_SHIFT = 8,\n\n  /**\n   * bit 17..24   red in RGB\n   */\n  RED_MASK = 0xFF0000,\n  RED_SHIFT = 16,\n\n  /**\n   * bit 25..26   color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n   */\n  CM_MASK = 0x3000000,\n  CM_DEFAULT = 0,\n  CM_P16 = 0x1000000,\n  CM_P256 = 0x2000000,\n  CM_RGB = 0x3000000,\n\n  /**\n   * bit 1..24  RGB room\n   */\n  RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n  /**\n   * bit 27..32\n   */\n  INVERSE = 0x4000000,\n  BOLD = 0x8000000,\n  UNDERLINE = 0x10000000,\n  BLINK = 0x20000000,\n  INVISIBLE = 0x40000000,\n  STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n  /**\n   * bit 27..32 (upper 2 unused)\n   */\n  ITALIC = 0x4000000,\n  DIM = 0x8000000,\n  HAS_EXTENDED = 0x10000000,\n  PROTECTED = 0x20000000,\n  OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n  /**\n   * bit 27..32 (upper 3 unused)\n   */\n  UNDERLINE_STYLE = 0x1C000000\n}\n\nexport const enum UnderlineStyle {\n  NONE = 0,\n  SINGLE = 1,\n  DOUBLE = 2,\n  CURLY = 3,\n  DOTTED = 4,\n  DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { disposeArray } from 'common/Lifecycle';\nimport { IDisposable, IMarker } from 'common/Types';\n\nexport class Marker implements IMarker {\n  private static _nextId = 1;\n\n  public isDisposed: boolean = false;\n  private readonly _disposables: IDisposable[] = [];\n\n  private readonly _id: number = Marker._nextId++;\n  public get id(): number { return this._id; }\n\n  private readonly _onDispose = this.register(new EventEmitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  constructor(\n    public line: number\n  ) {\n  }\n\n  public dispose(): void {\n    if (this.isDisposed) {\n      return;\n    }\n    this.isDisposed = true;\n    this.line = -1;\n    // Emit before super.dispose such that dispose listeners get a change to react\n    this._onDispose.fire();\n    disposeArray(this._disposables);\n    this._disposables.length = 0;\n  }\n\n  public register<T extends IDisposable>(disposable: T): T {\n    this._disposables.push(disposable);\n    return disposable;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n  '`': '\\u25c6', // '◆'\n  'a': '\\u2592', // '▒'\n  'b': '\\u2409', // '␉' (HT)\n  'c': '\\u240c', // '␌' (FF)\n  'd': '\\u240d', // '␍' (CR)\n  'e': '\\u240a', // '␊' (LF)\n  'f': '\\u00b0', // '°'\n  'g': '\\u00b1', // '±'\n  'h': '\\u2424', // '␤' (NL)\n  'i': '\\u240b', // '␋' (VT)\n  'j': '\\u2518', // '┘'\n  'k': '\\u2510', // '┐'\n  'l': '\\u250c', // '┌'\n  'm': '\\u2514', // '└'\n  'n': '\\u253c', // '┼'\n  'o': '\\u23ba', // '⎺'\n  'p': '\\u23bb', // '⎻'\n  'q': '\\u2500', // '─'\n  'r': '\\u23bc', // '⎼'\n  's': '\\u23bd', // '⎽'\n  't': '\\u251c', // '├'\n  'u': '\\u2524', // '┤'\n  'v': '\\u2534', // '┴'\n  'w': '\\u252c', // '┬'\n  'x': '\\u2502', // '│'\n  'y': '\\u2264', // '≤'\n  'z': '\\u2265', // '≥'\n  '{': '\\u03c0', // 'π'\n  '|': '\\u2260', // '≠'\n  '}': '\\u00a3', // '£'\n  '~': '\\u00b7'  // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n  '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n  '#': '£',\n  '@': '¾',\n  '[': 'ij',\n  '\\\\': '½',\n  ']': '|',\n  '{': '¨',\n  '|': 'f',\n  '}': '¼',\n  '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'é',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n  '#': '£',\n  '@': 'à',\n  '[': '°',\n  '\\\\': 'ç',\n  ']': '§',\n  '{': 'é',\n  '|': 'ù',\n  '}': 'è',\n  '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n  '@': 'à',\n  '[': 'â',\n  '\\\\': 'ç',\n  ']': 'ê',\n  '^': 'î',\n  '`': 'ô',\n  '{': 'é',\n  '|': 'ù',\n  '}': 'è',\n  '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n  '@': '§',\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Ü',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'ü',\n  '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n  '#': '£',\n  '@': '§',\n  '[': '°',\n  '\\\\': 'ç',\n  ']': 'é',\n  '`': 'ù',\n  '{': 'à',\n  '|': 'ò',\n  '}': 'è',\n  '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n  '@': 'Ä',\n  '[': 'Æ',\n  '\\\\': 'Ø',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'ä',\n  '{': 'æ',\n  '|': 'ø',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n  '#': '£',\n  '@': '§',\n  '[': '¡',\n  '\\\\': 'Ñ',\n  ']': '¿',\n  '{': '°',\n  '|': 'ñ',\n  '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n  '@': 'É',\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'é',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n  '#': 'ù',\n  '@': 'à',\n  '[': 'é',\n  '\\\\': 'ç',\n  ']': 'ê',\n  '^': 'î',\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  '_': 'è',\n  '`': 'ô',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'ü',\n  '~': 'û'\n};\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * C0 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C0 {\n  /** Null (Caret = ^@, C = \\0) */\n  export const NUL = '\\x00';\n  /** Start of Heading (Caret = ^A) */\n  export const SOH = '\\x01';\n  /** Start of Text (Caret = ^B) */\n  export const STX = '\\x02';\n  /** End of Text (Caret = ^C) */\n  export const ETX = '\\x03';\n  /** End of Transmission (Caret = ^D) */\n  export const EOT = '\\x04';\n  /** Enquiry (Caret = ^E) */\n  export const ENQ = '\\x05';\n  /** Acknowledge (Caret = ^F) */\n  export const ACK = '\\x06';\n  /** Bell (Caret = ^G, C = \\a) */\n  export const BEL = '\\x07';\n  /** Backspace (Caret = ^H, C = \\b) */\n  export const BS  = '\\x08';\n  /** Character Tabulation, Horizontal Tabulation (Caret = ^I, C = \\t) */\n  export const HT  = '\\x09';\n  /** Line Feed (Caret = ^J, C = \\n) */\n  export const LF  = '\\x0a';\n  /** Line Tabulation, Vertical Tabulation (Caret = ^K, C = \\v) */\n  export const VT  = '\\x0b';\n  /** Form Feed (Caret = ^L, C = \\f) */\n  export const FF  = '\\x0c';\n  /** Carriage Return (Caret = ^M, C = \\r) */\n  export const CR  = '\\x0d';\n  /** Shift Out (Caret = ^N) */\n  export const SO  = '\\x0e';\n  /** Shift In (Caret = ^O) */\n  export const SI  = '\\x0f';\n  /** Data Link Escape (Caret = ^P) */\n  export const DLE = '\\x10';\n  /** Device Control One (XON) (Caret = ^Q) */\n  export const DC1 = '\\x11';\n  /** Device Control Two (Caret = ^R) */\n  export const DC2 = '\\x12';\n  /** Device Control Three (XOFF) (Caret = ^S) */\n  export const DC3 = '\\x13';\n  /** Device Control Four (Caret = ^T) */\n  export const DC4 = '\\x14';\n  /** Negative Acknowledge (Caret = ^U) */\n  export const NAK = '\\x15';\n  /** Synchronous Idle (Caret = ^V) */\n  export const SYN = '\\x16';\n  /** End of Transmission Block (Caret = ^W) */\n  export const ETB = '\\x17';\n  /** Cancel (Caret = ^X) */\n  export const CAN = '\\x18';\n  /** End of Medium (Caret = ^Y) */\n  export const EM  = '\\x19';\n  /** Substitute (Caret = ^Z) */\n  export const SUB = '\\x1a';\n  /** Escape (Caret = ^[, C = \\e) */\n  export const ESC = '\\x1b';\n  /** File Separator (Caret = ^\\) */\n  export const FS  = '\\x1c';\n  /** Group Separator (Caret = ^]) */\n  export const GS  = '\\x1d';\n  /** Record Separator (Caret = ^^) */\n  export const RS  = '\\x1e';\n  /** Unit Separator (Caret = ^_) */\n  export const US  = '\\x1f';\n  /** Space */\n  export const SP  = '\\x20';\n  /** Delete (Caret = ^?) */\n  export const DEL = '\\x7f';\n}\n\n/**\n * C1 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C1 {\n  /** padding character */\n  export const PAD = '\\x80';\n  /** High Octet Preset */\n  export const HOP = '\\x81';\n  /** Break Permitted Here */\n  export const BPH = '\\x82';\n  /** No Break Here */\n  export const NBH = '\\x83';\n  /** Index */\n  export const IND = '\\x84';\n  /** Next Line */\n  export const NEL = '\\x85';\n  /** Start of Selected Area */\n  export const SSA = '\\x86';\n  /** End of Selected Area */\n  export const ESA = '\\x87';\n  /** Horizontal Tabulation Set */\n  export const HTS = '\\x88';\n  /** Horizontal Tabulation With Justification */\n  export const HTJ = '\\x89';\n  /** Vertical Tabulation Set */\n  export const VTS = '\\x8a';\n  /** Partial Line Down */\n  export const PLD = '\\x8b';\n  /** Partial Line Up */\n  export const PLU = '\\x8c';\n  /** Reverse Index */\n  export const RI = '\\x8d';\n  /** Single-Shift 2 */\n  export const SS2 = '\\x8e';\n  /** Single-Shift 3 */\n  export const SS3 = '\\x8f';\n  /** Device Control String */\n  export const DCS = '\\x90';\n  /** Private Use 1 */\n  export const PU1 = '\\x91';\n  /** Private Use 2 */\n  export const PU2 = '\\x92';\n  /** Set Transmit State */\n  export const STS = '\\x93';\n  /** Destructive backspace, intended to eliminate ambiguity about meaning of BS. */\n  export const CCH = '\\x94';\n  /** Message Waiting */\n  export const MW = '\\x95';\n  /** Start of Protected Area */\n  export const SPA = '\\x96';\n  /** End of Protected Area */\n  export const EPA = '\\x97';\n  /** Start of String */\n  export const SOS = '\\x98';\n  /** Single Graphic Character Introducer */\n  export const SGCI = '\\x99';\n  /** Single Character Introducer */\n  export const SCI = '\\x9a';\n  /** Control Sequence Introducer */\n  export const CSI = '\\x9b';\n  /** String Terminator */\n  export const ST = '\\x9c';\n  /** Operating System Command */\n  export const OSC = '\\x9d';\n  /** Privacy Message */\n  export const PM = '\\x9e';\n  /** Application Program Command */\n  export const APC = '\\x9f';\n}\nexport namespace C1_ESCAPED {\n  export const ST = `${C0.ESC}\\\\`;\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n  // digits 0-9\n  48: ['0', ')'],\n  49: ['1', '!'],\n  50: ['2', '@'],\n  51: ['3', '#'],\n  52: ['4', '$'],\n  53: ['5', '%'],\n  54: ['6', '^'],\n  55: ['7', '&'],\n  56: ['8', '*'],\n  57: ['9', '('],\n\n  // special chars\n  186: [';', ':'],\n  187: ['=', '+'],\n  188: [',', '<'],\n  189: ['-', '_'],\n  190: ['.', '>'],\n  191: ['/', '?'],\n  192: ['`', '~'],\n  219: ['[', '{'],\n  220: ['\\\\', '|'],\n  221: [']', '}'],\n  222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n  ev: IKeyboardEvent,\n  applicationCursorMode: boolean,\n  isMac: boolean,\n  macOptionIsMeta: boolean\n): IKeyboardResult {\n  const result: IKeyboardResult = {\n    type: KeyboardResultType.SEND_KEY,\n    // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n    // canceled at the end of keyDown\n    cancel: false,\n    // The new key even to emit\n    key: undefined\n  };\n  const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n  switch (ev.keyCode) {\n    case 0:\n      if (ev.key === 'UIKeyInputUpArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OA';\n        } else {\n          result.key = C0.ESC + '[A';\n        }\n      }\n      else if (ev.key === 'UIKeyInputLeftArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OD';\n        } else {\n          result.key = C0.ESC + '[D';\n        }\n      }\n      else if (ev.key === 'UIKeyInputRightArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OC';\n        } else {\n          result.key = C0.ESC + '[C';\n        }\n      }\n      else if (ev.key === 'UIKeyInputDownArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OB';\n        } else {\n          result.key = C0.ESC + '[B';\n        }\n      }\n      break;\n    case 8:\n      // backspace\n      if (ev.altKey) {\n        result.key = C0.ESC + C0.DEL; // \\e ^?\n        break;\n      }\n      result.key = C0.DEL; // ^?\n      break;\n    case 9:\n      // tab\n      if (ev.shiftKey) {\n        result.key = C0.ESC + '[Z';\n        break;\n      }\n      result.key = C0.HT;\n      result.cancel = true;\n      break;\n    case 13:\n      // return/enter\n      result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n      result.cancel = true;\n      break;\n    case 27:\n      // escape\n      result.key = C0.ESC;\n      if (ev.altKey) {\n        result.key = C0.ESC + C0.ESC;\n      }\n      result.cancel = true;\n      break;\n    case 37:\n      // left-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n        // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (result.key === C0.ESC + '[1;3D') {\n          result.key = C0.ESC + (isMac ? 'b' : '[1;5D');\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OD';\n      } else {\n        result.key = C0.ESC + '[D';\n      }\n      break;\n    case 39:\n      // right-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n        // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (result.key === C0.ESC + '[1;3C') {\n          result.key = C0.ESC + (isMac ? 'f' : '[1;5C');\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OC';\n      } else {\n        result.key = C0.ESC + '[C';\n      }\n      break;\n    case 38:\n      // up-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n        // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (!isMac && result.key === C0.ESC + '[1;3A') {\n          result.key = C0.ESC + '[1;5A';\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OA';\n      } else {\n        result.key = C0.ESC + '[A';\n      }\n      break;\n    case 40:\n      // down-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n        // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (!isMac && result.key === C0.ESC + '[1;3B') {\n          result.key = C0.ESC + '[1;5B';\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OB';\n      } else {\n        result.key = C0.ESC + '[B';\n      }\n      break;\n    case 45:\n      // insert\n      if (!ev.shiftKey && !ev.ctrlKey) {\n        // <Ctrl> or <Shift> + <Insert> are used to\n        // copy-paste on some systems.\n        result.key = C0.ESC + '[2~';\n      }\n      break;\n    case 46:\n      // delete\n      if (modifiers) {\n        result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[3~';\n      }\n      break;\n    case 36:\n      // home\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OH';\n      } else {\n        result.key = C0.ESC + '[H';\n      }\n      break;\n    case 35:\n      // end\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OF';\n      } else {\n        result.key = C0.ESC + '[F';\n      }\n      break;\n    case 33:\n      // page up\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_UP;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[5~';\n      }\n      break;\n    case 34:\n      // page down\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_DOWN;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[6~';\n      }\n      break;\n    case 112:\n      // F1-F12\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n      } else {\n        result.key = C0.ESC + 'OP';\n      }\n      break;\n    case 113:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n      } else {\n        result.key = C0.ESC + 'OQ';\n      }\n      break;\n    case 114:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n      } else {\n        result.key = C0.ESC + 'OR';\n      }\n      break;\n    case 115:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n      } else {\n        result.key = C0.ESC + 'OS';\n      }\n      break;\n    case 116:\n      if (modifiers) {\n        result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[15~';\n      }\n      break;\n    case 117:\n      if (modifiers) {\n        result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[17~';\n      }\n      break;\n    case 118:\n      if (modifiers) {\n        result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[18~';\n      }\n      break;\n    case 119:\n      if (modifiers) {\n        result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[19~';\n      }\n      break;\n    case 120:\n      if (modifiers) {\n        result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[20~';\n      }\n      break;\n    case 121:\n      if (modifiers) {\n        result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[21~';\n      }\n      break;\n    case 122:\n      if (modifiers) {\n        result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[23~';\n      }\n      break;\n    case 123:\n      if (modifiers) {\n        result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[24~';\n      }\n      break;\n    default:\n      // a-z and space\n      if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n        if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          result.key = String.fromCharCode(ev.keyCode - 64);\n        } else if (ev.keyCode === 32) {\n          result.key = C0.NUL;\n        } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n          // escape, file sep, group sep, record sep, unit sep\n          result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n        } else if (ev.keyCode === 56) {\n          result.key = C0.DEL;\n        } else if (ev.keyCode === 219) {\n          result.key = C0.ESC;\n        } else if (ev.keyCode === 220) {\n          result.key = C0.FS;\n        } else if (ev.keyCode === 221) {\n          result.key = C0.GS;\n        }\n      } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n        // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n        const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n        const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n        if (key) {\n          result.key = C0.ESC + key;\n        } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n          let keyString = String.fromCharCode(keyCode);\n          if (ev.shiftKey) {\n            keyString = keyString.toUpperCase();\n          }\n          result.key = C0.ESC + keyString;\n        } else if (ev.keyCode === 32) {\n          result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n        } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n          // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n          // Alt will produce a \"dead key\" (initate composition) with some\n          // of the letters in US layout (e.g. N/E/U).\n          // It's safe to match against Key* since no other `code` values begin with \"Key\".\n          // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n          let keyString = ev.code.slice(3, 4);\n          if (!ev.shiftKey) {\n            keyString = keyString.toLowerCase();\n          }\n          result.key = C0.ESC + keyString;\n          result.cancel = true;\n        }\n      } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n        if (ev.keyCode === 65) { // cmd + a\n          result.type = KeyboardResultType.SELECT_ALL;\n        }\n      } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n        // Include only keys that that result in a _single_ character; don't include num lock,\n        // volume up, etc.\n        result.key = ev.key;\n      } else if (ev.key && ev.ctrlKey) {\n        if (ev.key === '_') { // ^_\n          result.key = C0.US;\n        }\n        if (ev.key === '@') { // ^ + shift + 2 = ^ + @\n          result.key = C0.NUL;\n        }\n      }\n      break;\n  }\n\n  return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n *       due to additional sanity checks. We can avoid them since\n *       we always operate on legal UTF32 (granted by the input decoders)\n *       and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n  if (codePoint > 0xFFFF) {\n    codePoint -= 0x10000;\n    return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n  }\n  return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n  let result = '';\n  for (let i = start; i < end; ++i) {\n    let codepoint = data[i];\n    if (codepoint > 0xFFFF) {\n      // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n      // pair conversion rules:\n      //  - subtract 0x10000 from code point, leaving a 20 bit number\n      //  - add high 10 bits to 0xD800  --> first surrogate\n      //  - add low 10 bits to 0xDC00   --> second surrogate\n      codepoint -= 0x10000;\n      result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n    } else {\n      result += String.fromCharCode(codepoint);\n    }\n  }\n  return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n  private _interim: number = 0;\n\n  /**\n   * Clears interim and resets decoder to clean state.\n   */\n  public clear(): void {\n    this._interim = 0;\n  }\n\n  /**\n   * Decode JS string to UTF32 codepoints.\n   * The methods assumes stream input and will store partly transmitted\n   * surrogate pairs and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided input data does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: string, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let startPos = 0;\n\n    // handle leftover surrogate high\n    if (this._interim) {\n      const second = input.charCodeAt(startPos++);\n      if (0xDC00 <= second && second <= 0xDFFF) {\n        target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n      } else {\n        // illegal codepoint (USC2 handling)\n        target[size++] = this._interim;\n        target[size++] = second;\n      }\n      this._interim = 0;\n    }\n\n    for (let i = startPos; i < length; ++i) {\n      const code = input.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          this._interim = code;\n          return size;\n        }\n        const second = input.charCodeAt(i);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          // illegal codepoint (USC2 handling)\n          target[size++] = code;\n          target[size++] = second;\n        }\n        continue;\n      }\n      if (code === 0xFEFF) {\n        // BOM\n        continue;\n      }\n      target[size++] = code;\n    }\n    return size;\n  }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n  public interim: Uint8Array = new Uint8Array(3);\n\n  /**\n   * Clears interim bytes and resets decoder to clean state.\n   */\n  public clear(): void {\n    this.interim.fill(0);\n  }\n\n  /**\n   * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n   * The methods assumes stream input and will store partly transmitted bytes\n   * and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided data chunk does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: Uint8Array, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let byte1: number;\n    let byte2: number;\n    let byte3: number;\n    let byte4: number;\n    let codepoint = 0;\n    let startPos = 0;\n\n    // handle leftover bytes\n    if (this.interim[0]) {\n      let discardInterim = false;\n      let cp = this.interim[0];\n      cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n      let pos = 0;\n      let tmp: number;\n      while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n        cp <<= 6;\n        cp |= tmp;\n      }\n      // missing bytes - read ahead from input\n      const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n      const missing = type - pos;\n      while (startPos < missing) {\n        if (startPos >= length) {\n          return 0;\n        }\n        tmp = input[startPos++];\n        if ((tmp & 0xC0) !== 0x80) {\n          // wrong continuation, discard interim bytes completely\n          startPos--;\n          discardInterim = true;\n          break;\n        } else {\n          // need to save so we can continue short inputs in next call\n          this.interim[pos++] = tmp;\n          cp <<= 6;\n          cp |= tmp & 0x3F;\n        }\n      }\n      if (!discardInterim) {\n        // final test is type dependent\n        if (type === 2) {\n          if (cp < 0x80) {\n            // wrong starter byte\n            startPos--;\n          } else {\n            target[size++] = cp;\n          }\n        } else if (type === 3) {\n          if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n            // illegal codepoint or BOM\n          } else {\n            target[size++] = cp;\n          }\n        } else {\n          if (cp < 0x010000 || cp > 0x10FFFF) {\n            // illegal codepoint\n          } else {\n            target[size++] = cp;\n          }\n        }\n      }\n      this.interim.fill(0);\n    }\n\n    // loop through input\n    const fourStop = length - 4;\n    let i = startPos;\n    while (i < length) {\n      /**\n       * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n       * This is a compromise between speed gain for ASCII\n       * and penalty for non ASCII:\n       * For best ASCII performance the char should be stored directly into target,\n       * but even a single attempt to write to target and compare afterwards\n       * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n       * which reduces ASCII performance by ~15%.\n       * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n       * compared to the gains.\n       * Note that this optimization only takes place for 4 consecutive ASCII chars,\n       * for any shorter it bails out. Worst case - all 4 bytes being read but\n       * thrown away due to the last being a non ASCII char (-10% performance).\n       */\n      while (i < fourStop\n        && !((byte1 = input[i]) & 0x80)\n        && !((byte2 = input[i + 1]) & 0x80)\n        && !((byte3 = input[i + 2]) & 0x80)\n        && !((byte4 = input[i + 3]) & 0x80))\n      {\n        target[size++] = byte1;\n        target[size++] = byte2;\n        target[size++] = byte3;\n        target[size++] = byte4;\n        i += 4;\n      }\n\n      // reread byte1\n      byte1 = input[i++];\n\n      // 1 byte\n      if (byte1 < 0x80) {\n        target[size++] = byte1;\n\n        // 2 bytes\n      } else if ((byte1 & 0xE0) === 0xC0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n        if (codepoint < 0x80) {\n          // wrong starter byte\n          i--;\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 3 bytes\n      } else if ((byte1 & 0xF0) === 0xE0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n        if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n          // illegal codepoint or BOM, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 4 bytes\n      } else if ((byte1 & 0xF8) === 0xF0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          this.interim[2] = byte3;\n          return size;\n        }\n        byte4 = input[i++];\n        if ((byte4 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n        if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n          // illegal codepoint, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n      } else {\n        // illegal byte, just skip\n      }\n    }\n    return size;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider } from 'common/services/Services';\n\ntype CharWidth = 0 | 1 | 2;\n\nconst BMP_COMBINING = [\n  [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n  [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n  [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n  [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n  [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n  [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n  [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n  [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n  [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n  [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n  [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n  [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n  [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n  [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n  [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n  [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n  [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n  [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n  [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n  [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n  [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n  [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n  [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n  [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n  [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n  [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n  [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n  [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n  [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n  [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n  [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n  [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n  [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n  [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n  [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n  [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n  [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n  [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n  [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n  [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n  [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n  [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n  [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n  [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n  [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n  [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n  [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n  [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n  let min = 0;\n  let max = data.length - 1;\n  let mid;\n  if (ucs < data[0][0] || ucs > data[max][1]) {\n    return false;\n  }\n  while (max >= min) {\n    mid = (min + max) >> 1;\n    if (ucs > data[mid][1]) {\n      min = mid + 1;\n    } else if (ucs < data[mid][0]) {\n      max = mid - 1;\n    } else {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n  public readonly version = '6';\n\n  constructor() {\n    // init lookup table once\n    if (!table) {\n      table = new Uint8Array(65536);\n      table.fill(1);\n      table[0] = 0;\n      // control chars\n      table.fill(0, 1, 32);\n      table.fill(0, 0x7f, 0xa0);\n\n      // apply wide char rules first\n      // wide chars\n      table.fill(2, 0x1100, 0x1160);\n      table[0x2329] = 2;\n      table[0x232a] = 2;\n      table.fill(2, 0x2e80, 0xa4d0);\n      table[0x303f] = 1;  // wrongly in last line\n\n      table.fill(2, 0xac00, 0xd7a4);\n      table.fill(2, 0xf900, 0xfb00);\n      table.fill(2, 0xfe10, 0xfe1a);\n      table.fill(2, 0xfe30, 0xfe70);\n      table.fill(2, 0xff00, 0xff61);\n      table.fill(2, 0xffe0, 0xffe7);\n\n      // apply combining last to ensure we overwrite\n      // wrongly wide set chars:\n      //    the original algo evals combining first and falls\n      //    through to wide check so we simply do here the opposite\n      // combining 0\n      for (let r = 0; r < BMP_COMBINING.length; ++r) {\n        table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n      }\n    }\n  }\n\n  public wcwidth(num: number): CharWidth {\n    if (num < 32) return 0;\n    if (num < 127) return 1;\n    if (num < 65536) return table[num] as CharWidth;\n    if (bisearch(num, HIGH_COMBINING)) return 0;\n    if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n    return 1;\n  }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\nexport class WriteBuffer extends Disposable {\n  private _writeBuffer: (string | Uint8Array)[] = [];\n  private _callbacks: ((() => void) | undefined)[] = [];\n  private _pendingData = 0;\n  private _bufferOffset = 0;\n  private _isSyncWriting = false;\n  private _syncCalls = 0;\n  private _didUserInput = false;\n\n  private readonly _onWriteParsed = this.register(new EventEmitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise<boolean>) {\n    super();\n  }\n\n  public handleUserInput(): void {\n    this._didUserInput = true;\n  }\n\n  /**\n   * @deprecated Unreliable, to be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    // stop writeSync recursions with maxSubsequentCalls argument\n    // This is dangerous to use as it will lose the current data chunk\n    // and return immediately.\n    if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n      // comment next line if a whole loop block should only contain x `writeSync` calls\n      // (total flat vs. deep nested limit)\n      this._syncCalls = 0;\n      return;\n    }\n    // append chunk to buffer\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(undefined);\n\n    // increase recursion counter\n    this._syncCalls++;\n    // exit early if another writeSync loop is active\n    if (this._isSyncWriting) {\n      return;\n    }\n    this._isSyncWriting = true;\n\n    // force sync processing on pending data chunks to avoid in-band data scrambling\n    // does the same as innerWrite but without event loop\n    // we have to do it here as single loop steps to not corrupt loop subject\n    // by another writeSync call triggered from _action\n    let chunk: string | Uint8Array | undefined;\n    while (chunk = this._writeBuffer.shift()) {\n      this._action(chunk);\n      const cb = this._callbacks.shift();\n      if (cb) cb();\n    }\n    // reset to avoid reprocessing of chunks with scheduled innerWrite call\n    // stopping scheduled innerWrite by offset > length condition\n    this._pendingData = 0;\n    this._bufferOffset = 0x7FFFFFFF;\n\n    // allow another writeSync to loop\n    this._isSyncWriting = false;\n    this._syncCalls = 0;\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    if (this._pendingData > DISCARD_WATERMARK) {\n      throw new Error('write data discarded, use flow control to avoid losing data');\n    }\n\n    // schedule chunk processing for next event loop run\n    if (!this._writeBuffer.length) {\n      this._bufferOffset = 0;\n\n      // If this is the first write call after the user has done some input,\n      // parse it immediately to minimize input latency,\n      // otherwise schedule for the next event\n      if (this._didUserInput) {\n        this._didUserInput = false;\n        this._pendingData += data.length;\n        this._writeBuffer.push(data);\n        this._callbacks.push(callback);\n        this._innerWrite();\n        return;\n      }\n\n      setTimeout(() => this._innerWrite());\n    }\n\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(callback);\n  }\n\n  /**\n   * Inner write call, that enters the sliced chunk processing by timing.\n   *\n   * `lastTime` indicates, when the last _innerWrite call had started.\n   * It is used to aggregate async handler execution under a timeout constraint\n   * effectively lowering the redrawing needs, schematically:\n   *\n   *   macroTask _innerWrite:\n   *     if (Date.now() - (lastTime | 0) < WRITE_TIMEOUT_MS):\n   *        schedule microTask _innerWrite(lastTime)\n   *     else:\n   *        schedule macroTask _innerWrite(0)\n   *\n   *   overall execution order on task queues:\n   *\n   *   macrotasks:  [...]  -->  _innerWrite(0)  -->  [...]  -->  screenUpdate  -->  [...]\n   *         m  t:                    |\n   *         i  a:                  [...]\n   *         c  s:                    |\n   *         r  k:              while < timeout:\n   *         o  s:                _innerWrite(timeout)\n   *\n   * `promiseResult` depicts the promise resolve value of an async handler.\n   * This value gets carried forward through all saved stack states of the\n   * paused parser for proper continuation.\n   *\n   * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n   */\n  protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n    const startTime = lastTime || Date.now();\n    while (this._writeBuffer.length > this._bufferOffset) {\n      const data = this._writeBuffer[this._bufferOffset];\n      const result = this._action(data, promiseResult);\n      if (result) {\n        /**\n         * If we get a promise as return value, we re-schedule the continuation\n         * as thenable on the promise and exit right away.\n         *\n         * The exit here means, that we block input processing at the current active chunk,\n         * the exact execution position within the chunk is preserved by the saved\n         * stack content in InputHandler and EscapeSequenceParser.\n         *\n         * Resuming happens automatically from that saved stack state.\n         * Also the resolved promise value is passed along the callstack to\n         * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n         *\n         * Exceptions on async handlers will be logged to console async, but do not interrupt\n         * the input processing (continues with next handler at the current input position).\n         */\n\n        /**\n         * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n         * This might already be too late, if our .then enters really late (executor + prev thens\n         * took very long). This cannot be solved here for the handler itself (it is the handlers\n         * responsibility to slice hard work), but we can at least schedule a screen update as we\n         * gain control.\n         */\n        const continuation: (r: boolean) => void = (r: boolean) => Date.now() - startTime >= WRITE_TIMEOUT_MS\n          ? setTimeout(() => this._innerWrite(0, r))\n          : this._innerWrite(startTime, r);\n\n        /**\n         * Optimization considerations:\n         * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n         * This might schedule too many screen updates with bad throughput drops (in case a slow\n         * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n         * this condition here, also the renderer has no way to spot nonsense updates either.\n         * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n         *\n         * If favoring of FPS shows bad throughtput impact, use the following instead. It favors\n         * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n         * current microtask queue (executed before setTimeout).\n         */\n        // const continuation: (r: boolean) => void = Date.now() - startTime >= WRITE_TIMEOUT_MS\n        //   ? r => setTimeout(() => this._innerWrite(0, r))\n        //   : r => this._innerWrite(startTime, r);\n\n        // Handle exceptions synchronously to current band position, idea:\n        // 1. spawn a single microtask which we allow to throw hard\n        // 2. spawn a promise immediately resolving to `true`\n        // (executed on the same queue, thus properly aligned before continuation happens)\n        result.catch(err => {\n          queueMicrotask(() => {throw err;});\n          return Promise.resolve(false);\n        }).then(continuation);\n        return;\n      }\n\n      const cb = this._callbacks[this._bufferOffset];\n      if (cb) cb();\n      this._bufferOffset++;\n      this._pendingData -= data.length;\n\n      if (Date.now() - startTime >= WRITE_TIMEOUT_MS) {\n        break;\n      }\n    }\n    if (this._writeBuffer.length > this._bufferOffset) {\n      // Allow renderer to catch up before processing the next batch\n      // trim already processed chunks if we are above threshold\n      if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n        this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n        this._callbacks = this._callbacks.slice(this._bufferOffset);\n        this._bufferOffset = 0;\n      }\n      setTimeout(() => this._innerWrite());\n    } else {\n      this._writeBuffer.length = 0;\n      this._callbacks.length = 0;\n      this._pendingData = 0;\n      this._bufferOffset = 0;\n    }\n    this._onWriteParsed.fire();\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n  if (!data) return;\n  // also handle uppercases\n  let low = data.toLowerCase();\n  if (low.indexOf('rgb:') === 0) {\n    // 'rgb:' specifier\n    low = low.slice(4);\n    const m = RGB_REX.exec(low);\n    if (m) {\n      const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n      return [\n        Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n        Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n        Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n      ];\n    }\n  } else if (low.indexOf('#') === 0) {\n    // '#' specifier\n    low = low.slice(1);\n    if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n      const adv = low.length / 3;\n      const result: [number, number, number] = [0, 0, 0];\n      for (let i = 0; i < 3; ++i) {\n        const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n        result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n      }\n      return result;\n    }\n  }\n\n  // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n  // they would add. In order to support named colors, we would need some way of optionally loading\n  // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n  const s = n.toString(16);\n  const s2 = s.length < 2 ? '0' + s : s;\n  switch (bits) {\n    case 4:\n      return s[0];\n    case 8:\n      return s2;\n    case 12:\n      return (s2 + s2).slice(0, 3);\n    default:\n      return s2 + s2;\n  }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n  const [r, g, b] = color;\n  return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Internal states of EscapeSequenceParser.\n */\nexport const enum ParserState {\n  GROUND = 0,\n  ESCAPE = 1,\n  ESCAPE_INTERMEDIATE = 2,\n  CSI_ENTRY = 3,\n  CSI_PARAM = 4,\n  CSI_INTERMEDIATE = 5,\n  CSI_IGNORE = 6,\n  SOS_PM_APC_STRING = 7,\n  OSC_STRING = 8,\n  DCS_ENTRY = 9,\n  DCS_PARAM = 10,\n  DCS_IGNORE = 11,\n  DCS_INTERMEDIATE = 12,\n  DCS_PASSTHROUGH = 13\n}\n\n/**\n * Internal actions of EscapeSequenceParser.\n */\nexport const enum ParserAction {\n  IGNORE = 0,\n  ERROR = 1,\n  PRINT = 2,\n  EXECUTE = 3,\n  OSC_START = 4,\n  OSC_PUT = 5,\n  OSC_END = 6,\n  CSI_DISPATCH = 7,\n  PARAM = 8,\n  COLLECT = 9,\n  ESC_DISPATCH = 10,\n  CLEAR = 11,\n  DCS_HOOK = 12,\n  DCS_PUT = 13,\n  DCS_UNHOOK = 14\n}\n\n/**\n * Internal states of OscParser.\n */\nexport const enum OscState {\n  START = 0,\n  ID = 1,\n  PAYLOAD = 2,\n  ABORT = 3\n}\n\n// payload limit for OSC and DCS\nexport const PAYLOAD_LIMIT = 10000000;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { PAYLOAD_LIMIT } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n  private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n  private _active: IDcsHandler[] = EMPTY_HANDLERS;\n  private _ident: number = 0;\n  private _handlerFb: DcsFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n    if (this._handlers[ident] === undefined) {\n      this._handlers[ident] = [];\n    }\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n\n  public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public reset(): void {\n    // force cleanup leftover handlers\n    if (this._active.length) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].unhook(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n\n  public hook(ident: number, params: IParams): void {\n    // always reset leftover handlers\n    this.reset();\n    this._ident = ident;\n    this._active = this._handlers[ident] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'HOOK', params);\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].hook(params);\n      }\n    }\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'UNHOOK', success);\n    } else {\n      let handlerResult: boolean | Promise<boolean> = false;\n      let j = this._active.length - 1;\n      let fallThrough = false;\n      if (this._stack.paused) {\n        j = this._stack.loopPosition - 1;\n        handlerResult = promiseResult;\n        fallThrough = this._stack.fallThrough;\n        this._stack.paused = false;\n      }\n      if (!fallThrough && handlerResult === false) {\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].unhook(success);\n          if (handlerResult === true) {\n            break;\n          } else if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = false;\n            return handlerResult;\n          }\n        }\n        j--;\n      }\n      // cleanup left over handlers (fallThrough for async)\n      for (; j >= 0; j--) {\n        handlerResult = this._active[j].unhook(false);\n        if (handlerResult instanceof Promise) {\n          this._stack.paused = true;\n          this._stack.loopPosition = j;\n          this._stack.fallThrough = true;\n          return handlerResult;\n        }\n      }\n    }\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n  private _data = '';\n  private _params: IParams = EMPTY_PARAMS;\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }\n\n  public hook(params: IParams): void {\n    // since we need to preserve params until `unhook`, we have to clone it\n    // (only borrowed from parser and spans multiple parser states)\n    // perf optimization:\n    // clone only, if we have non empty params, otherwise stick with default\n    this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > PAYLOAD_LIMIT) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public unhook(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data, this._params);\n      if (ret instanceof Promise) {\n        // need to hold data and params until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._params = EMPTY_PARAMS;\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._params = EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\n\n/**\n * Table values are generated like this:\n *    index:  currentState << TableValue.INDEX_STATE_SHIFT | charCode\n *    value:  action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n  TRANSITION_ACTION_SHIFT = 4,\n  TRANSITION_STATE_MASK = 15,\n  INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n  public table: Uint8Array;\n\n  constructor(length: number) {\n    this.table = new Uint8Array(length);\n  }\n\n  /**\n   * Set default transition.\n   * @param action default action\n   * @param next default next state\n   */\n  public setDefault(action: ParserAction, next: ParserState): void {\n    this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n  }\n\n  /**\n   * Add a transition to the transition table.\n   * @param code input character code\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n    this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n  }\n\n  /**\n   * Add transitions for multiple input character codes.\n   * @param codes input character code array\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n    for (let i = 0; i < codes.length; i++) {\n      this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n    }\n  }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n  const table: TransitionTable = new TransitionTable(4095);\n\n  // range macro for byte\n  const BYTE_VALUES = 256;\n  const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n  const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n  // Default definitions.\n  const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n  const EXECUTABLES = r(0x00, 0x18);\n  EXECUTABLES.push(0x19);\n  EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n  const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);\n  let state: any;\n\n  // set default transition\n  table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n  // printables\n  table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  // global anywhere rules\n  for (state in states) {\n    table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n    table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE);  // ESC\n    table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING);  // OSC\n    table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n    table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY);  // CSI\n    table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY);  // DCS\n  }\n  // rules for executables and 7f\n  table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n  table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n  table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n  table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n  table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n  table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n  table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n  table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n  // osc\n  table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n  table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n  table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  // sos/pm/apc does nothing\n  table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);\n  table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  // csi entries\n  table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  // esc_intermediate\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  // dcs entry\n  table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n  table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n  table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n  // special handling of unicode chars\n  table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n  public initialState: number;\n  public currentState: number;\n  public precedingCodepoint: number;\n\n  // buffers over several parse calls\n  protected _params: Params;\n  protected _collect: number;\n\n  // handler lookup containers\n  protected _printHandler: PrintHandlerType;\n  protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n  protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n  protected _escHandlers: IHandlerCollection<EscHandlerType>;\n  protected readonly _oscParser: IOscParser;\n  protected readonly _dcsParser: IDcsParser;\n  protected _errorHandler: (state: IParsingState) => IParsingState;\n\n  // fallback handlers\n  protected _printHandlerFb: PrintFallbackHandlerType;\n  protected _executeHandlerFb: ExecuteFallbackHandlerType;\n  protected _csiHandlerFb: CsiFallbackHandlerType;\n  protected _escHandlerFb: EscFallbackHandlerType;\n  protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n  // parser stack save for async handler support\n  protected _parseStack: IParserStackState = {\n    state: ParserStackType.NONE,\n    handlers: [],\n    handlerPos: 0,\n    transition: 0,\n    chunkPos: 0\n  };\n\n  constructor(\n    protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n  ) {\n    super();\n\n    this.initialState = ParserState.GROUND;\n    this.currentState = this.initialState;\n    this._params = new Params(); // defaults to 32 storable params/subparams\n    this._params.addParam(0);    // ZDM\n    this._collect = 0;\n    this.precedingCodepoint = 0;\n\n    // set default fallback handlers and handler lookup containers\n    this._printHandlerFb = (data, start, end): void => { };\n    this._executeHandlerFb = (code: number): void => { };\n    this._csiHandlerFb = (ident: number, params: IParams): void => { };\n    this._escHandlerFb = (ident: number): void => { };\n    this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n    this._printHandler = this._printHandlerFb;\n    this._executeHandlers = Object.create(null);\n    this._csiHandlers = Object.create(null);\n    this._escHandlers = Object.create(null);\n    this.register(toDisposable(() => {\n      this._csiHandlers = Object.create(null);\n      this._executeHandlers = Object.create(null);\n      this._escHandlers = Object.create(null);\n    }));\n    this._oscParser = this.register(new OscParser());\n    this._dcsParser = this.register(new DcsParser());\n    this._errorHandler = this._errorHandlerFb;\n\n    // swallow 7bit ST (ESC+\\)\n    this.registerEscHandler({ final: '\\\\' }, () => true);\n  }\n\n  protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n    let res = 0;\n    if (id.prefix) {\n      if (id.prefix.length > 1) {\n        throw new Error('only one byte as prefix supported');\n      }\n      res = id.prefix.charCodeAt(0);\n      if (res && 0x3c > res || res > 0x3f) {\n        throw new Error('prefix must be in range 0x3c .. 0x3f');\n      }\n    }\n    if (id.intermediates) {\n      if (id.intermediates.length > 2) {\n        throw new Error('only two bytes as intermediates are supported');\n      }\n      for (let i = 0; i < id.intermediates.length; ++i) {\n        const intermediate = id.intermediates.charCodeAt(i);\n        if (0x20 > intermediate || intermediate > 0x2f) {\n          throw new Error('intermediate must be in range 0x20 .. 0x2f');\n        }\n        res <<= 8;\n        res |= intermediate;\n      }\n    }\n    if (id.final.length !== 1) {\n      throw new Error('final must be a single byte');\n    }\n    const finalCode = id.final.charCodeAt(0);\n    if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n      throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n    }\n    res <<= 8;\n    res |= finalCode;\n\n    return res;\n  }\n\n  public identToString(ident: number): string {\n    const res: string[] = [];\n    while (ident) {\n      res.push(String.fromCharCode(ident & 0xFF));\n      ident >>= 8;\n    }\n    return res.reverse().join('');\n  }\n\n  public setPrintHandler(handler: PrintHandlerType): void {\n    this._printHandler = handler;\n  }\n  public clearPrintHandler(): void {\n    this._printHandler = this._printHandlerFb;\n  }\n\n  public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n    const ident = this._identifier(id, [0x30, 0x7e]);\n    if (this._escHandlers[ident] === undefined) {\n      this._escHandlers[ident] = [];\n    }\n    const handlerList = this._escHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearEscHandler(id: IFunctionIdentifier): void {\n    if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n  }\n  public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n    this._escHandlerFb = handler;\n  }\n\n  public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n    this._executeHandlers[flag.charCodeAt(0)] = handler;\n  }\n  public clearExecuteHandler(flag: string): void {\n    if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n  }\n  public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n    this._executeHandlerFb = handler;\n  }\n\n  public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n    const ident = this._identifier(id);\n    if (this._csiHandlers[ident] === undefined) {\n      this._csiHandlers[ident] = [];\n    }\n    const handlerList = this._csiHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearCsiHandler(id: IFunctionIdentifier): void {\n    if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n  }\n  public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n    this._csiHandlerFb = callback;\n  }\n\n  public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n    return this._dcsParser.registerHandler(this._identifier(id), handler);\n  }\n  public clearDcsHandler(id: IFunctionIdentifier): void {\n    this._dcsParser.clearHandler(this._identifier(id));\n  }\n  public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._dcsParser.setHandlerFallback(handler);\n  }\n\n  public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n    return this._oscParser.registerHandler(ident, handler);\n  }\n  public clearOscHandler(ident: number): void {\n    this._oscParser.clearHandler(ident);\n  }\n  public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._oscParser.setHandlerFallback(handler);\n  }\n\n  public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n    this._errorHandler = callback;\n  }\n  public clearErrorHandler(): void {\n    this._errorHandler = this._errorHandlerFb;\n  }\n\n  /**\n   * Reset parser to initial values.\n   *\n   * This can also be used to lift the improper continuation error condition\n   * when dealing with async handlers. Use this only as a last resort to silence\n   * that error when the terminal has no pending data to be processed. Note that\n   * the interrupted async handler might continue its work in the future messing\n   * up the terminal state even further.\n   */\n  public reset(): void {\n    this.currentState = this.initialState;\n    this._oscParser.reset();\n    this._dcsParser.reset();\n    this._params.reset();\n    this._params.addParam(0); // ZDM\n    this._collect = 0;\n    this.precedingCodepoint = 0;\n    // abort pending continuation from async handler\n    // Here the RESET type indicates, that the next parse call will\n    // ignore any saved stack, instead continues sync with next codepoint from GROUND\n    if (this._parseStack.state !== ParserStackType.NONE) {\n      this._parseStack.state = ParserStackType.RESET;\n      this._parseStack.handlers = []; // also release handlers ref\n    }\n  }\n\n  /**\n   * Async parse support.\n   */\n  protected _preserveStack(\n    state: ParserStackType,\n    handlers: ResumableHandlersType,\n    handlerPos: number,\n    transition: number,\n    chunkPos: number\n  ): void {\n    this._parseStack.state = state;\n    this._parseStack.handlers = handlers;\n    this._parseStack.handlerPos = handlerPos;\n    this._parseStack.transition = transition;\n    this._parseStack.chunkPos = chunkPos;\n  }\n\n  /**\n   * Parse UTF32 codepoints in `data` up to `length`.\n   *\n   * Note: For several actions with high data load the parsing is optimized\n   * by using local read ahead loops with hardcoded conditions to\n   * avoid costly table lookups. Make sure that any change of table values\n   * will be reflected in the loop conditions as well and vice versa.\n   * Affected states/actions:\n   * - GROUND:PRINT\n   * - CSI_PARAM:PARAM\n   * - DCS_PARAM:PARAM\n   * - OSC_STRING:OSC_PUT\n   * - DCS_PASSTHROUGH:DCS_PUT\n   *\n   * Note on asynchronous handler support:\n   * Any handler returning a promise will be treated as asynchronous.\n   * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n   * creates a stack save and returns the promise to the caller.\n   * For proper continuation of the paused state it is important\n   * to await the promise resolving. On resolve the parse must be repeated\n   * with the same chunk of data and the resolved value in `promiseResult`\n   * until no promise is returned.\n   *\n   * Important: With only sync handlers defined, parsing is completely synchronous as well.\n   * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n   *\n   * Boilerplate for proper parsing of multiple chunks with async handlers:\n   *\n   * ```typescript\n   * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {\n   *   for (const chunk of chunks) {\n   *     let result: void | Promise<boolean>;\n   *     let prev: boolean | undefined;\n   *     while (result = parser.parse(chunk, chunk.length, prev)) {\n   *       prev = await result;\n   *     }\n   *   }\n   *   // finished parsing all chunks...\n   * }\n   * ```\n   */\n  public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {\n    let code = 0;\n    let transition = 0;\n    let start = 0;\n    let handlerResult: void | boolean | Promise<boolean>;\n\n    // resume from async handler\n    if (this._parseStack.state) {\n      // allow sync parser reset even in continuation mode\n      // Note: can be used to recover parser from improper continuation error below\n      if (this._parseStack.state === ParserStackType.RESET) {\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n      } else {\n        if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n          /**\n           * Reject further parsing on improper continuation after pausing. This is a really bad\n           * condition with screwed up execution order and prolly messed up terminal state,\n           * therefore we exit hard with an exception and reject any further parsing.\n           *\n           * Note: With `Terminal.write` usage this exception should never occur, as the top level\n           * calls are guaranteed to handle async conditions properly. If you ever encounter this\n           * exception in your terminal integration it indicates, that you injected data chunks to\n           * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n           * continuation of a running async handler.\n           *\n           * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n           * the pending async handler still might mess up the terminal later. Instead fix the\n           * faulty async handling, so this error will not be thrown anymore.\n           */\n          this._parseStack.state = ParserStackType.FAIL;\n          throw new Error('improper continuation due to previous async handler, giving up parsing');\n        }\n\n        // we have to resume the old handler loop if:\n        // - return value of the promise was `false`\n        // - handlers are not exhausted yet\n        const handlers = this._parseStack.handlers;\n        let handlerPos = this._parseStack.handlerPos - 1;\n        switch (this._parseStack.state) {\n          case ParserStackType.CSI:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.ESC:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.DCS:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n          case ParserStackType.OSC:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n        }\n        // cleanup before continuing with the main sync loop\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1;\n        this.precedingCodepoint = 0;\n        this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n      }\n    }\n\n    // continue with main sync loop\n\n    // process input string\n    for (let i = start; i < length; ++i) {\n      code = data[i];\n\n      // normal transition & action lookup\n      transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n      switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n        case ParserAction.PRINT:\n          // read ahead with loop unrolling\n          // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.EXECUTE:\n          if (this._executeHandlers[code]) this._executeHandlers[code]();\n          else this._executeHandlerFb(code);\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.IGNORE:\n          break;\n        case ParserAction.ERROR:\n          const inject: IParsingState = this._errorHandler(\n            {\n              position: i,\n              code,\n              currentState: this.currentState,\n              collect: this._collect,\n              params: this._params,\n              abort: false\n            });\n          if (inject.abort) return;\n          // inject values: currently not implemented\n          break;\n        case ParserAction.CSI_DISPATCH:\n          // Trigger CSI Handler\n          const handlers = this._csiHandlers[this._collect << 8 | code];\n          let j = handlers ? handlers.length - 1 : -1;\n          for (; j >= 0; j--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlers[j](this._params);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n              return handlerResult;\n            }\n          }\n          if (j < 0) {\n            this._csiHandlerFb(this._collect << 8 | code, this._params);\n          }\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.PARAM:\n          // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n          do {\n            switch (code) {\n              case 0x3b:\n                this._params.addParam(0);  // ZDM\n                break;\n              case 0x3a:\n                this._params.addSubParam(-1);\n                break;\n              default:  // 0x30 - 0x39\n                this._params.addDigit(code - 48);\n            }\n          } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n          i--;\n          break;\n        case ParserAction.COLLECT:\n          this._collect <<= 8;\n          this._collect |= code;\n          break;\n        case ParserAction.ESC_DISPATCH:\n          const handlersEsc = this._escHandlers[this._collect << 8 | code];\n          let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n          for (; jj >= 0; jj--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlersEsc[jj]();\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n              return handlerResult;\n            }\n          }\n          if (jj < 0) {\n            this._escHandlerFb(this._collect << 8 | code);\n          }\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.CLEAR:\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          break;\n        case ParserAction.DCS_HOOK:\n          this._dcsParser.hook(this._collect << 8 | code, this._params);\n          break;\n        case ParserAction.DCS_PUT:\n          // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n          // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._dcsParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.DCS_UNHOOK:\n          handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.OSC_START:\n          this._oscParser.start();\n          break;\n        case ParserAction.OSC_PUT:\n          // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n          for (let j = i + 1; ; j++) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._oscParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.OSC_END:\n          handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n      }\n      this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n  private _state = OscState.START;\n  private _active = EMPTY_HANDLERS;\n  private _id = -1;\n  private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n  private _handlerFb: OscFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n    if (this._handlers[ident] === undefined) {\n      this._handlers[ident] = [];\n    }\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n  public setHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public reset(): void {\n    // force cleanup handlers if payload was already sent\n    if (this._state === OscState.PAYLOAD) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].end(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n\n  private _start(): void {\n    this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'START');\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].start();\n      }\n    }\n  }\n\n  private _put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public start(): void {\n    // always reset leftover handlers\n    this.reset();\n    this._state = OscState.ID;\n  }\n\n  /**\n   * Put data to current OSC command.\n   * Expects the identifier of the OSC command in the form\n   * OSC id ; payload ST/BEL\n   * Payload chunks are not further processed and get\n   * directly passed to the handlers.\n   */\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._state === OscState.ABORT) {\n      return;\n    }\n    if (this._state === OscState.ID) {\n      while (start < end) {\n        const code = data[start++];\n        if (code === 0x3b) {\n          this._state = OscState.PAYLOAD;\n          this._start();\n          break;\n        }\n        if (code < 0x30 || 0x39 < code) {\n          this._state = OscState.ABORT;\n          return;\n        }\n        if (this._id === -1) {\n          this._id = 0;\n        }\n        this._id = this._id * 10 + code - 48;\n      }\n    }\n    if (this._state === OscState.PAYLOAD && end - start > 0) {\n      this._put(data, start, end);\n    }\n  }\n\n  /**\n   * Indicates end of an OSC command.\n   * Whether the OSC got aborted or finished normally\n   * is indicated by `success`.\n   */\n  public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (this._state === OscState.START) {\n      return;\n    }\n    // do nothing if command was faulty\n    if (this._state !== OscState.ABORT) {\n      // if we are still in ID state and get an early end\n      // means that the command has no payload thus we still have\n      // to announce START and send END right after\n      if (this._state === OscState.ID) {\n        this._start();\n      }\n\n      if (!this._active.length) {\n        this._handlerFb(this._id, 'END', success);\n      } else {\n        let handlerResult: boolean | Promise<boolean> = false;\n        let j = this._active.length - 1;\n        let fallThrough = false;\n        if (this._stack.paused) {\n          j = this._stack.loopPosition - 1;\n          handlerResult = promiseResult;\n          fallThrough = this._stack.fallThrough;\n          this._stack.paused = false;\n        }\n        if (!fallThrough && handlerResult === false) {\n          for (; j >= 0; j--) {\n            handlerResult = this._active[j].end(success);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._stack.paused = true;\n              this._stack.loopPosition = j;\n              this._stack.fallThrough = false;\n              return handlerResult;\n            }\n          }\n          j--;\n        }\n        // cleanup left over handlers\n        // we always have to call .end for proper cleanup,\n        // here we use `success` to indicate whether a handler should execute\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].end(false);\n          if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = true;\n            return handlerResult;\n          }\n        }\n      }\n\n    }\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n  private _data = '';\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n  public start(): void {\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > PAYLOAD_LIMIT) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public end(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data);\n      if (ret instanceof Promise) {\n        // need to hold data until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n *  - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n *  - never read beyond `params.length - 1` (likely to contain arbitrary data)\n *  - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n *  - hardcoded limitations:\n *    - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n *    - max. 256 sub params possible\n *    - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n  // params store and length\n  public params: Int32Array;\n  public length: number;\n\n  // sub params store and length\n  protected _subParams: Int32Array;\n  protected _subParamsLength: number;\n\n  // sub params offsets from param: param idx --> [start, end] offset\n  private _subParamsIdx: Uint16Array;\n  private _rejectDigits: boolean;\n  private _rejectSubDigits: boolean;\n  private _digitIsSub: boolean;\n\n  /**\n   * Create a `Params` type from JS array representation.\n   */\n  public static fromArray(values: ParamsArray): Params {\n    const params = new Params();\n    if (!values.length) {\n      return params;\n    }\n    // skip leading sub params\n    for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n      const value = values[i];\n      if (Array.isArray(value)) {\n        for (let k = 0; k < value.length; ++k) {\n          params.addSubParam(value[k]);\n        }\n      } else {\n        params.addParam(value);\n      }\n    }\n    return params;\n  }\n\n  /**\n   * @param maxLength max length of storable parameters\n   * @param maxSubParamsLength max length of storable sub parameters\n   */\n  constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n    if (maxSubParamsLength > MAX_SUBPARAMS) {\n      throw new Error('maxSubParamsLength must not be greater than 256');\n    }\n    this.params = new Int32Array(maxLength);\n    this.length = 0;\n    this._subParams = new Int32Array(maxSubParamsLength);\n    this._subParamsLength = 0;\n    this._subParamsIdx = new Uint16Array(maxLength);\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Clone object.\n   */\n  public clone(): Params {\n    const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n    newParams.params.set(this.params);\n    newParams.length = this.length;\n    newParams._subParams.set(this._subParams);\n    newParams._subParamsLength = this._subParamsLength;\n    newParams._subParamsIdx.set(this._subParamsIdx);\n    newParams._rejectDigits = this._rejectDigits;\n    newParams._rejectSubDigits = this._rejectSubDigits;\n    newParams._digitIsSub = this._digitIsSub;\n    return newParams;\n  }\n\n  /**\n   * Get a JS array representation of the current parameters and sub parameters.\n   * The array is structured as follows:\n   *    sequence: \"1;2:3:4;5::6\"\n   *    array   : [1, 2, [3, 4], 5, [-1, 6]]\n   */\n  public toArray(): ParamsArray {\n    const res: ParamsArray = [];\n    for (let i = 0; i < this.length; ++i) {\n      res.push(this.params[i]);\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        res.push(Array.prototype.slice.call(this._subParams, start, end));\n      }\n    }\n    return res;\n  }\n\n  /**\n   * Reset to initial empty state.\n   */\n  public reset(): void {\n    this.length = 0;\n    this._subParamsLength = 0;\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Add a parameter value.\n   * `Params` only stores up to `maxLength` parameters, any later\n   * parameter will be ignored.\n   * Note: VT devices only stored up to 16 values, xterm seems to\n   * store up to 30.\n   */\n  public addParam(value: number): void {\n    this._digitIsSub = false;\n    if (this.length >= this.maxLength) {\n      this._rejectDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n    this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n  }\n\n  /**\n   * Add a sub parameter value.\n   * The sub parameter is automatically associated with the last parameter value.\n   * Thus it is not possible to add a subparameter without any parameter added yet.\n   * `Params` only stores up to `subParamsLength` sub parameters, any later\n   * sub parameter will be ignored.\n   */\n  public addSubParam(value: number): void {\n    this._digitIsSub = true;\n    if (!this.length) {\n      return;\n    }\n    if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n      this._rejectSubDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n    this._subParamsIdx[this.length - 1]++;\n  }\n\n  /**\n   * Whether parameter at index `idx` has sub parameters.\n   */\n  public hasSubParams(idx: number): boolean {\n    return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n  }\n\n  /**\n   * Return sub parameters for parameter at index `idx`.\n   * Note: The values are borrowed, thus you need to copy\n   * the values if you need to hold them in nonlocal scope.\n   */\n  public getSubParams(idx: number): Int32Array | null {\n    const start = this._subParamsIdx[idx] >> 8;\n    const end = this._subParamsIdx[idx] & 0xFF;\n    if (end - start > 0) {\n      return this._subParams.subarray(start, end);\n    }\n    return null;\n  }\n\n  /**\n   * Return all sub parameters as {idx: subparams} mapping.\n   * Note: The values are not borrowed.\n   */\n  public getSubParamsAll(): {[idx: number]: Int32Array} {\n    const result: {[idx: number]: Int32Array} = {};\n    for (let i = 0; i < this.length; ++i) {\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        result[i] = this._subParams.slice(start, end);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Add a single digit value to current parameter.\n   * This is used by the parser to account digits on a char by char basis.\n   */\n  public addDigit(value: number): void {\n    let length;\n    if (this._rejectDigits\n      || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n      || (this._digitIsSub && this._rejectSubDigits)\n    ) {\n      return;\n    }\n\n    const store = this._digitIsSub ? this._subParams : this.params;\n    const cur = store[length - 1];\n    store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from 'xterm';\n\nexport interface ILoadedAddon {\n  instance: ITerminalAddon;\n  dispose: () => void;\n  isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n  protected _addons: ILoadedAddon[] = [];\n\n  public dispose(): void {\n    for (let i = this._addons.length - 1; i >= 0; i--) {\n      this._addons[i].instance.dispose();\n    }\n  }\n\n  public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n    const loadedAddon: ILoadedAddon = {\n      instance,\n      dispose: instance.dispose,\n      isDisposed: false\n    };\n    this._addons.push(loadedAddon);\n    instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n    instance.activate(terminal as any);\n  }\n\n  private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n    if (loadedAddon.isDisposed) {\n      // Do nothing if already disposed\n      return;\n    }\n    let index = -1;\n    for (let i = 0; i < this._addons.length; i++) {\n      if (this._addons[i] === loadedAddon) {\n        index = i;\n        break;\n      }\n    }\n    if (index === -1) {\n      throw new Error('Could not dispose an addon that has not been loaded');\n    }\n    loadedAddon.isDisposed = true;\n    loadedAddon.dispose.apply(loadedAddon.instance);\n    this._addons.splice(index, 1);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from 'xterm';\nimport { IBuffer } from 'common/buffer/Types';\nimport { BufferLineApiView } from 'common/public/BufferLineApiView';\nimport { CellData } from 'common/buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n  constructor(\n    private _buffer: IBuffer,\n    public readonly type: 'normal' | 'alternate'\n  ) { }\n\n  public init(buffer: IBuffer): BufferApiView {\n    this._buffer = buffer;\n    return this;\n  }\n\n  public get cursorY(): number { return this._buffer.y; }\n  public get cursorX(): number { return this._buffer.x; }\n  public get viewportY(): number { return this._buffer.ydisp; }\n  public get baseY(): number { return this._buffer.ybase; }\n  public get length(): number { return this._buffer.lines.length; }\n  public getLine(y: number): IBufferLineApi | undefined {\n    const line = this._buffer.lines.get(y);\n    if (!line) {\n      return undefined;\n    }\n    return new BufferLineApiView(line);\n  }\n  public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from 'xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n  constructor(private _line: IBufferLine) { }\n\n  public get isWrapped(): boolean { return this._line.isWrapped; }\n  public get length(): number { return this._line.length; }\n  public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n    if (x < 0 || x >= this._line.length) {\n      return undefined;\n    }\n\n    if (cell) {\n      this._line.loadCell(x, cell as ICellData);\n      return cell;\n    }\n    return this._line.loadCell(x, new CellData());\n  }\n  public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n    return this._line.translateToString(trimRight, startColumn, endColumn);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm';\nimport { BufferApiView } from 'common/public/BufferApiView';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICoreTerminal } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n  private _normal: BufferApiView;\n  private _alternate: BufferApiView;\n\n  private readonly _onBufferChange = this.register(new EventEmitter<IBufferApi>());\n  public readonly onBufferChange = this._onBufferChange.event;\n\n  constructor(private _core: ICoreTerminal) {\n    super();\n    this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n    this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n    this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n  }\n  public get active(): IBufferApi {\n    if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n    if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n    throw new Error('Active buffer is neither normal nor alternate');\n  }\n  public get normal(): IBufferApi {\n    return this._normal.init(this._core.buffers.normal);\n  }\n  public get alternate(): IBufferApi {\n    return this._alternate.init(this._core.buffers.alt);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from 'common/parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from 'xterm';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class ParserApi implements IParser {\n  constructor(private _core: ICoreTerminal) { }\n\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n  }\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerCsiHandler(id, callback);\n  }\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n  }\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerDcsHandler(id, callback);\n  }\n  public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerEscHandler(id, handler);\n  }\n  public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this.registerEscHandler(id, handler);\n  }\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerOscHandler(ident, callback);\n  }\n  public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this.registerOscHandler(ident, callback);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from 'common/Types';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from 'xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n  constructor(private _core: ICoreTerminal) { }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._core.unicodeService.register(provider);\n  }\n\n  public get versions(): string[] {\n    return this._core.unicodeService.versions;\n  }\n\n  public get activeVersion(): string {\n    return this._core.unicodeService.activeVersion;\n  }\n\n  public set activeVersion(version: string) {\n    this._core.unicodeService.activeVersion = version;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData, IBufferLine, ScrollSource } from 'common/Types';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n  public serviceBrand: any;\n\n  public cols: number;\n  public rows: number;\n  public buffers: IBufferSet;\n  /** Whether the user is scrolling (locks the scroll position) */\n  public isUserScrolling: boolean = false;\n\n  private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());\n  public readonly onResize = this._onResize.event;\n  private readonly _onScroll = this.register(new EventEmitter<number>());\n  public readonly onScroll = this._onScroll.event;\n\n  public get buffer(): IBuffer { return this.buffers.active; }\n\n  /** An IBufferline to clone/copy from for new blank lines */\n  private _cachedBlankLine: IBufferLine | undefined;\n\n  constructor(@IOptionsService optionsService: IOptionsService) {\n    super();\n    this.cols = Math.max(optionsService.rawOptions.cols || 0, MINIMUM_COLS);\n    this.rows = Math.max(optionsService.rawOptions.rows || 0, MINIMUM_ROWS);\n    this.buffers = this.register(new BufferSet(optionsService, this));\n  }\n\n  public resize(cols: number, rows: number): void {\n    this.cols = cols;\n    this.rows = rows;\n    this.buffers.resize(cols, rows);\n    // TODO: This doesn't fire when scrollback changes - add a resize event to BufferSet and forward\n    //       event\n    this._onResize.fire({ cols, rows });\n  }\n\n  public reset(): void {\n    this.buffers.reset();\n    this.isUserScrolling = false;\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    const buffer = this.buffer;\n\n    let newLine: IBufferLine | undefined;\n    newLine = this._cachedBlankLine;\n    if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n      newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n      this._cachedBlankLine = newLine;\n    }\n    newLine.isWrapped = isWrapped;\n\n    const topRow = buffer.ybase + buffer.scrollTop;\n    const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n    if (buffer.scrollTop === 0) {\n      // Determine whether the buffer is going to be trimmed after insertion.\n      const willBufferBeTrimmed = buffer.lines.isFull;\n\n      // Insert the line using the fastest method\n      if (bottomRow === buffer.lines.length - 1) {\n        if (willBufferBeTrimmed) {\n          buffer.lines.recycle().copyFrom(newLine);\n        } else {\n          buffer.lines.push(newLine.clone());\n        }\n      } else {\n        buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n      }\n\n      // Only adjust ybase and ydisp when the buffer is not trimmed\n      if (!willBufferBeTrimmed) {\n        buffer.ybase++;\n        // Only scroll the ydisp with ybase if the user has not scrolled up\n        if (!this.isUserScrolling) {\n          buffer.ydisp++;\n        }\n      } else {\n        // When the buffer is full and the user has scrolled up, keep the text\n        // stable unless ydisp is right at the top\n        if (this.isUserScrolling) {\n          buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n        }\n      }\n    } else {\n      // scrollTop is non-zero which means no line will be going to the\n      // scrollback, instead we can just shift them in-place.\n      const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n      buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n      buffer.lines.set(bottomRow, newLine.clone());\n    }\n\n    // Move the viewport to the bottom of the buffer unless the user is\n    // scrolling.\n    if (!this.isUserScrolling) {\n      buffer.ydisp = buffer.ybase;\n    }\n\n    this._onScroll.fire(buffer.ydisp);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n   * to avoid unwanted events being handled by the viewport when the event was triggered from the\n   * viewport originally.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n    const buffer = this.buffer;\n    if (disp < 0) {\n      if (buffer.ydisp === 0) {\n        return;\n      }\n      this.isUserScrolling = true;\n    } else if (disp + buffer.ydisp >= buffer.ybase) {\n      this.isUserScrolling = false;\n    }\n\n    const oldYdisp = buffer.ydisp;\n    buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n    // No change occurred, don't trigger scroll/refresh\n    if (oldYdisp === buffer.ydisp) {\n      return;\n    }\n\n    if (!suppressScrollEvent) {\n      this._onScroll.fire(buffer.ydisp);\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n  public serviceBrand: any;\n\n  public charset: ICharset | undefined;\n  public glevel: number = 0;\n\n  private _charsets: (ICharset | undefined)[] = [];\n\n  public reset(): void {\n    this.charset = undefined;\n    this._charsets = [];\n    this.glevel = 0;\n  }\n\n  public setgLevel(g: number): void {\n    this.glevel = g;\n    this.charset = this._charsets[g];\n  }\n\n  public setgCharset(g: number, charset: ICharset | undefined): void {\n    this._charsets[g] = charset;\n    if (this.glevel === g) {\n      this.charset = charset;\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n  /**\n   * NONE\n   * Events: none\n   * Modifiers: none\n   */\n  NONE: {\n    events: CoreMouseEventType.NONE,\n    restrict: () => false\n  },\n  /**\n   * X10\n   * Events: mousedown\n   * Modifiers: none\n   */\n  X10: {\n    events: CoreMouseEventType.DOWN,\n    restrict: (e: ICoreMouseEvent) => {\n      // no wheel, no move, no up\n      if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n        return false;\n      }\n      // no modifiers\n      e.ctrl = false;\n      e.alt = false;\n      e.shift = false;\n      return true;\n    }\n  },\n  /**\n   * VT200\n   * Events: mousedown / mouseup / wheel\n   * Modifiers: all\n   */\n  VT200: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move\n      if (e.action === CoreMouseAction.MOVE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * DRAG\n   * Events: mousedown / mouseup / wheel / mousedrag\n   * Modifiers: all\n   */\n  DRAG: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move without button\n      if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * ANY\n   * Events: all mouse related events\n   * Modifiers: all\n   */\n  ANY: {\n    events:\n      CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n      | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n    restrict: (e: ICoreMouseEvent) => true\n  }\n};\n\nconst enum Modifiers {\n  SHIFT = 4,\n  ALT = 8,\n  CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n  let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n  if (e.button === CoreMouseButton.WHEEL) {\n    code |= 64;\n    code |= e.action;\n  } else {\n    code |= e.button & 3;\n    if (e.button & 4) {\n      code |= 64;\n    }\n    if (e.button & 8) {\n      code |= 128;\n    }\n    if (e.action === CoreMouseAction.MOVE) {\n      code |= CoreMouseAction.MOVE;\n    } else if (e.action === CoreMouseAction.UP && !isSGR) {\n      // special case - only SGR can report button on release\n      // all others have to go with NONE\n      code |= CoreMouseButton.NONE;\n    }\n  }\n  return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n  /**\n   * DEFAULT - CSI M Pb Px Py\n   * Single byte encoding for coords and event code.\n   * Can encode values up to 223 (1-based).\n   */\n  DEFAULT: (e: ICoreMouseEvent) => {\n    const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n    // supress mouse report if we exceed addressible range\n    // Note this is handled differently by emulators\n    // - xterm:         sends 0;0 coords instead\n    // - vte, konsole:  no report\n    if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n      return '';\n    }\n    return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n  },\n  /**\n   * SGR - CSI < Pb ; Px ; Py M|m\n   * No encoding limitation.\n   * Can report button on release and works with a well formed sequence.\n   */\n  SGR: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n  },\n  SGR_PIXELS: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n  }\n};\n\n/**\n * CoreMouseService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n *  - protocols: NONE (default), X10, VT200, DRAG, ANY\n *  - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class CoreMouseService extends Disposable implements ICoreMouseService {\n  private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n  private _encodings: { [name: string]: CoreMouseEncoding } = {};\n  private _activeProtocol: string = '';\n  private _activeEncoding: string = '';\n  private _lastEvent: ICoreMouseEvent | null = null;\n\n  private readonly _onProtocolChange = this.register(new EventEmitter<CoreMouseEventType>());\n  public readonly onProtocolChange =  this._onProtocolChange.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService\n  ) {\n    super();\n    // register default protocols and encodings\n    for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n    for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n    // call reset to set defaults\n    this.reset();\n  }\n\n  public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n    this._protocols[name] = protocol;\n  }\n\n  public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n    this._encodings[name] = encoding;\n  }\n\n  public get activeProtocol(): string {\n    return this._activeProtocol;\n  }\n\n  public get areMouseEventsActive(): boolean {\n    return this._protocols[this._activeProtocol].events !== 0;\n  }\n\n  public set activeProtocol(name: string) {\n    if (!this._protocols[name]) {\n      throw new Error(`unknown protocol \"${name}\"`);\n    }\n    this._activeProtocol = name;\n    this._onProtocolChange.fire(this._protocols[name].events);\n  }\n\n  public get activeEncoding(): string {\n    return this._activeEncoding;\n  }\n\n  public set activeEncoding(name: string) {\n    if (!this._encodings[name]) {\n      throw new Error(`unknown encoding \"${name}\"`);\n    }\n    this._activeEncoding = name;\n  }\n\n  public reset(): void {\n    this.activeProtocol = 'NONE';\n    this.activeEncoding = 'DEFAULT';\n    this._lastEvent = null;\n  }\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  public triggerMouseEvent(e: ICoreMouseEvent): boolean {\n    // range check for col/row\n    if (e.col < 0 || e.col >= this._bufferService.cols\n      || e.row < 0 || e.row >= this._bufferService.rows) {\n      return false;\n    }\n\n    // filter nonsense combinations of button + action\n    if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n      return false;\n    }\n\n    // report 1-based coords\n    e.col++;\n    e.row++;\n\n    // debounce move events at grid or pixel level\n    if (e.action === CoreMouseAction.MOVE\n      && this._lastEvent\n      && this._equalEvents(this._lastEvent, e, this._activeEncoding === 'SGR_PIXELS')\n    ) {\n      return false;\n    }\n\n    // apply protocol restrictions\n    if (!this._protocols[this._activeProtocol].restrict(e)) {\n      return false;\n    }\n\n    // encode report and send\n    const report = this._encodings[this._activeEncoding](e);\n    if (report) {\n      // always send DEFAULT as binary data\n      if (this._activeEncoding === 'DEFAULT') {\n        this._coreService.triggerBinaryEvent(report);\n      } else {\n        this._coreService.triggerDataEvent(report, true);\n      }\n    }\n\n    this._lastEvent = e;\n\n    return true;\n  }\n\n  public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n    return {\n      down: !!(events & CoreMouseEventType.DOWN),\n      up: !!(events & CoreMouseEventType.UP),\n      drag: !!(events & CoreMouseEventType.DRAG),\n      move: !!(events & CoreMouseEventType.MOVE),\n      wheel: !!(events & CoreMouseEventType.WHEEL)\n    };\n  }\n\n  private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n    if (pixels) {\n      if (e1.x !== e2.x) return false;\n      if (e1.y !== e2.y) return false;\n    } else {\n      if (e1.col !== e2.col) return false;\n      if (e1.row !== e2.row) return false;\n    }\n    if (e1.button !== e2.button) return false;\n    if (e1.action !== e2.action) return false;\n    if (e1.ctrl !== e2.ctrl) return false;\n    if (e1.alt !== e2.alt) return false;\n    if (e1.shift !== e2.shift) return false;\n    return true;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { clone } from 'common/Clone';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDecPrivateModes, IModes } from 'common/Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n  insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n  applicationCursorKeys: false,\n  applicationKeypad: false,\n  bracketedPasteMode: false,\n  origin: false,\n  reverseWraparound: false,\n  sendFocus: false,\n  wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n  public serviceBrand: any;\n\n  public isCursorInitialized: boolean = false;\n  public isCursorHidden: boolean = false;\n  public modes: IModes;\n  public decPrivateModes: IDecPrivateModes;\n\n  private readonly _onData = this.register(new EventEmitter<string>());\n  public readonly onData = this._onData.event;\n  private readonly _onUserInput = this.register(new EventEmitter<void>());\n  public readonly onUserInput = this._onUserInput.event;\n  private readonly _onBinary = this.register(new EventEmitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onRequestScrollToBottom = this.register(new EventEmitter<void>());\n  public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ILogService private readonly _logService: ILogService,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n  }\n\n  public reset(): void {\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n  }\n\n  public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n    // Prevents all events to pty process if stdin is disabled\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n\n    // Input is being sent to the terminal, the terminal should focus the prompt.\n    const buffer = this._bufferService.buffer;\n    if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n      this._onRequestScrollToBottom.fire();\n    }\n\n    // Fire onUserInput so listeners can react as well (eg. clear selection)\n    if (wasUserInput) {\n      this._onUserInput.fire();\n    }\n\n    // Fire onData API\n    this._logService.debug(`sending data \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onData.fire(data);\n  }\n\n  public triggerBinaryEvent(data: string): void {\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n    this._logService.debug(`sending binary \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onBinary.fire(data);\n  }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { css } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDecorationService, IInternalDecoration } from 'common/services/Services';\nimport { SortedList } from 'common/SortedList';\nimport { IColor } from 'common/Types';\nimport { IDecoration, IDecorationOptions, IMarker } from 'xterm';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n  public serviceBrand: any;\n\n  /**\n   * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n   * while marker line values do change, they should all change by the same amount so this should\n   * never become out of order.\n   */\n  private readonly _decorations: SortedList<IInternalDecoration> = new SortedList(e => e?.marker.line);\n\n  private readonly _onDecorationRegistered = this.register(new EventEmitter<IInternalDecoration>());\n  public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n  private readonly _onDecorationRemoved = this.register(new EventEmitter<IInternalDecoration>());\n  public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n  public get decorations(): IterableIterator<IInternalDecoration> { return this._decorations.values(); }\n\n  constructor() {\n    super();\n\n    this.register(toDisposable(() => this.reset()));\n  }\n\n  public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n    if (options.marker.isDisposed) {\n      return undefined;\n    }\n    const decoration = new Decoration(options);\n    if (decoration) {\n      const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n      decoration.onDispose(() => {\n        if (decoration) {\n          if (this._decorations.delete(decoration)) {\n            this._onDecorationRemoved.fire(decoration);\n          }\n          markerDispose.dispose();\n        }\n      });\n      this._decorations.insert(decoration);\n      this._onDecorationRegistered.fire(decoration);\n    }\n    return decoration;\n  }\n\n  public reset(): void {\n    for (const d of this._decorations.values()) {\n      d.dispose();\n    }\n    this._decorations.clear();\n  }\n\n  public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration> {\n    let xmin = 0;\n    let xmax = 0;\n    for (const d of this._decorations.getKeyIterator(line)) {\n      xmin = d.options.x ?? 0;\n      xmax = xmin + (d.options.width ?? 1);\n      if (x >= xmin && x < xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        yield d;\n      }\n    }\n  }\n\n  public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n    this._decorations.forEachByKey(line, d => {\n      $xmin = d.options.x ?? 0;\n      $xmax = $xmin + (d.options.width ?? 1);\n      if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        callback(d);\n      }\n    });\n  }\n}\n\nclass Decoration extends Disposable implements IInternalDecoration {\n  public readonly marker: IMarker;\n  public element: HTMLElement | undefined;\n  public get isDisposed(): boolean { return this._isDisposed; }\n\n  public readonly onRenderEmitter = this.register(new EventEmitter<HTMLElement>());\n  public readonly onRender = this.onRenderEmitter.event;\n  private readonly _onDispose = this.register(new EventEmitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  private _cachedBg: IColor | undefined | null = null;\n  public get backgroundColorRGB(): IColor | undefined {\n    if (this._cachedBg === null) {\n      if (this.options.backgroundColor) {\n        this._cachedBg = css.toColor(this.options.backgroundColor);\n      } else {\n        this._cachedBg = undefined;\n      }\n    }\n    return this._cachedBg;\n  }\n\n  private _cachedFg: IColor | undefined | null = null;\n  public get foregroundColorRGB(): IColor | undefined {\n    if (this._cachedFg === null) {\n      if (this.options.foregroundColor) {\n        this._cachedFg = css.toColor(this.options.foregroundColor);\n      } else {\n        this._cachedFg = undefined;\n      }\n    }\n    return this._cachedFg;\n  }\n\n  constructor(\n    public readonly options: IDecorationOptions\n  ) {\n    super();\n    this.marker = options.marker;\n    if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n      this.options.overviewRulerOptions.position = 'full';\n    }\n  }\n\n  public override dispose(): void {\n    this._onDispose.fire();\n    super.dispose();\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n  private _entries = new Map<IServiceIdentifier<any>, any>();\n\n  constructor(...entries: [IServiceIdentifier<any>, any][]) {\n    for (const [id, service] of entries) {\n      this.set(id, service);\n    }\n  }\n\n  public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n    const result = this._entries.get(id);\n    this._entries.set(id, instance);\n    return result;\n  }\n\n  public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n    for (const [key, value] of this._entries.entries()) {\n      callback(key, value);\n    }\n  }\n\n  public has(id: IServiceIdentifier<any>): boolean {\n    return this._entries.has(id);\n  }\n\n  public get<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._entries.get(id);\n  }\n}\n\nexport class InstantiationService implements IInstantiationService {\n  public serviceBrand: undefined;\n\n  private readonly _services: ServiceCollection = new ServiceCollection();\n\n  constructor() {\n    this._services.set(IInstantiationService, this);\n  }\n\n  public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n    this._services.set(id, instance);\n  }\n\n  public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._services.get(id);\n  }\n\n  public createInstance<T>(ctor: any, ...args: any[]): T {\n    const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n    const serviceArgs: any[] = [];\n    for (const dependency of serviceDependencies) {\n      const service = this._services.get(dependency.id);\n      if (!service) {\n        throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`);\n      }\n      serviceArgs.push(service);\n    }\n\n    const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n    // check for argument mismatches, adjust static args if needed\n    if (args.length !== firstServiceArgPos) {\n      throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n    }\n\n    // now create the instance\n    return new ctor(...[...args, ...serviceArgs]);\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n  log: LogType;\n  error: LogType;\n  info: LogType;\n  trace: LogType;\n  warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n  trace: LogLevelEnum.TRACE,\n  debug: LogLevelEnum.DEBUG,\n  info: LogLevelEnum.INFO,\n  warn: LogLevelEnum.WARN,\n  error: LogLevelEnum.ERROR,\n  off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n    // For trace logging, assume the latest created log service is valid\n    traceLogger = this;\n  }\n\n  private _updateLogLevel(): void {\n    this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n  }\n\n  private _evalLazyOptionalParams(optionalParams: any[]): void {\n    for (let i = 0; i < optionalParams.length; i++) {\n      if (typeof optionalParams[i] === 'function') {\n        optionalParams[i] = optionalParams[i]();\n      }\n    }\n  }\n\n  private _log(type: LogType, message: string, optionalParams: any[]): void {\n    this._evalLazyOptionalParams(optionalParams);\n    type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n  traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n  if (typeof descriptor.value !== 'function') {\n    throw new Error('not supported');\n  }\n  const fnKey = 'value';\n  const fn = descriptor.value;\n  descriptor[fnKey] = function (...args: any[]) {\n    // Early exit\n    if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n      return fn.apply(this, args);\n    }\n\n    traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n    const result = fn.apply(this, args);\n    traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n    return result;\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { isMac } from 'common/Platform';\nimport { CursorStyle, IDisposable } from 'common/Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from 'common/services/Services';\n\nexport const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {\n  cols: 80,\n  rows: 24,\n  cursorBlink: false,\n  cursorStyle: 'block',\n  cursorWidth: 1,\n  cursorInactiveStyle: 'outline',\n  customGlyphs: true,\n  drawBoldTextInBrightColors: true,\n  fastScrollModifier: 'alt',\n  fastScrollSensitivity: 5,\n  fontFamily: 'courier-new, courier, monospace',\n  fontSize: 15,\n  fontWeight: 'normal',\n  fontWeightBold: 'bold',\n  ignoreBracketedPasteMode: false,\n  lineHeight: 1.0,\n  letterSpacing: 0,\n  linkHandler: null,\n  logLevel: 'info',\n  logger: null,\n  scrollback: 1000,\n  scrollOnUserInput: true,\n  scrollSensitivity: 1,\n  screenReaderMode: false,\n  smoothScrollDuration: 0,\n  macOptionIsMeta: false,\n  macOptionClickForcesSelection: false,\n  minimumContrastRatio: 1,\n  disableStdin: false,\n  allowProposedApi: false,\n  allowTransparency: false,\n  tabStopWidth: 8,\n  theme: {},\n  rightClickSelectsWord: isMac,\n  windowOptions: {},\n  windowsMode: false,\n  windowsPty: {},\n  wordSeparator: ' ()[]{}\\',\"`',\n  altClickMovesCursor: true,\n  convertEol: false,\n  termName: 'xterm',\n  cancelEvents: false,\n  overviewRulerWidth: 0\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n  public serviceBrand: any;\n\n  public readonly rawOptions: Required<ITerminalOptions>;\n  public options: Required<ITerminalOptions>;\n\n  private readonly _onOptionChange = this.register(new EventEmitter<keyof ITerminalOptions>());\n  public readonly onOptionChange = this._onOptionChange.event;\n\n  constructor(options: Partial<ITerminalOptions>) {\n    super();\n    // set the default value of each option\n    const defaultOptions = { ...DEFAULT_OPTIONS };\n    for (const key in options) {\n      if (key in defaultOptions) {\n        try {\n          const newValue = options[key];\n          defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n\n    // set up getters and setters for each option\n    this.rawOptions = defaultOptions;\n    this.options = { ... defaultOptions };\n    this._setupOptions();\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (eventKey === key) {\n        listener(this.rawOptions[key]);\n      }\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (keys.indexOf(eventKey) !== -1) {\n        listener();\n      }\n    });\n  }\n\n  private _setupOptions(): void {\n    const getter = (propName: string): any => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n      return this.rawOptions[propName];\n    };\n\n    const setter = (propName: string, value: any): void => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n\n      value = this._sanitizeAndValidateOption(propName, value);\n      // Don't fire an option change event if they didn't change\n      if (this.rawOptions[propName] !== value) {\n        this.rawOptions[propName] = value;\n        this._onOptionChange.fire(propName);\n      }\n    };\n\n    for (const propName in this.rawOptions) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this.options, propName, desc);\n    }\n  }\n\n  private _sanitizeAndValidateOption(key: string, value: any): any {\n    switch (key) {\n      case 'cursorStyle':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        if (!isCursorStyle(value)) {\n          throw new Error(`\"${value}\" is not a valid value for ${key}`);\n        }\n        break;\n      case 'wordSeparator':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        break;\n      case 'fontWeight':\n      case 'fontWeightBold':\n        if (typeof value === 'number' && 1 <= value && value <= 1000) {\n          // already valid numeric value\n          break;\n        }\n        value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n        break;\n      case 'cursorWidth':\n        value = Math.floor(value);\n        // Fall through for bounds check\n      case 'lineHeight':\n      case 'tabStopWidth':\n        if (value < 1) {\n          throw new Error(`${key} cannot be less than 1, value: ${value}`);\n        }\n        break;\n      case 'minimumContrastRatio':\n        value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n        break;\n      case 'scrollback':\n        value = Math.min(value, 4294967295);\n        if (value < 0) {\n          throw new Error(`${key} cannot be less than 0, value: ${value}`);\n        }\n        break;\n      case 'fastScrollSensitivity':\n      case 'scrollSensitivity':\n        if (value <= 0) {\n          throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n        }\n        break;\n      case 'rows':\n      case 'cols':\n        if (!value && value !== 0) {\n          throw new Error(`${key} must be numeric, value: ${value}`);\n        }\n        break;\n      case 'windowsPty':\n        value = value ?? {};\n        break;\n    }\n    return value;\n  }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n  return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from 'common/services/Services';\nimport { IMarker, IOscLinkData } from 'common/Types';\n\nexport class OscLinkService implements IOscLinkService {\n  public serviceBrand: any;\n\n  private _nextId = 1;\n\n  /**\n   * A map of the link key to link entry. This is used to add additional lines to links with ids.\n   */\n  private _entriesWithId: Map<string, IOscLinkEntryWithId> = new Map();\n\n  /**\n   * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n   * representation of a unique link should not be confused with \"id\" (string) which comes in with\n   * `id=` in the OSC link's properties.\n   */\n  private _dataByLinkId: Map<number, IOscLinkEntryNoId | IOscLinkEntryWithId> = new Map();\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n  }\n\n  public registerLink(data: IOscLinkData): number {\n    const buffer = this._bufferService.buffer;\n\n    // Links with no id will only ever be registered a single time\n    if (data.id === undefined) {\n      const marker = buffer.addMarker(buffer.ybase + buffer.y);\n      const entry: IOscLinkEntryNoId = {\n        data,\n        id: this._nextId++,\n        lines: [marker]\n      };\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n      this._dataByLinkId.set(entry.id, entry);\n      return entry.id;\n    }\n\n    // Add the line to the link if it already exists\n    const castData = data as Required<IOscLinkData>;\n    const key = this._getEntryIdKey(castData);\n    const match = this._entriesWithId.get(key);\n    if (match) {\n      this.addLineToLink(match.id, buffer.ybase + buffer.y);\n      return match.id;\n    }\n\n    // Create the link\n    const marker = buffer.addMarker(buffer.ybase + buffer.y);\n    const entry: IOscLinkEntryWithId = {\n      id: this._nextId++,\n      key: this._getEntryIdKey(castData),\n      data: castData,\n      lines: [marker]\n    };\n    marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    this._entriesWithId.set(entry.key, entry);\n    this._dataByLinkId.set(entry.id, entry);\n    return entry.id;\n  }\n\n  public addLineToLink(linkId: number, y: number): void {\n    const entry = this._dataByLinkId.get(linkId);\n    if (!entry) {\n      return;\n    }\n    if (entry.lines.every(e => e.line !== y)) {\n      const marker = this._bufferService.buffer.addMarker(y);\n      entry.lines.push(marker);\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    }\n  }\n\n  public getLinkData(linkId: number): IOscLinkData | undefined {\n    return this._dataByLinkId.get(linkId)?.data;\n  }\n\n  private _getEntryIdKey(linkData: Required<IOscLinkData>): string {\n    return `${linkData.id};;${linkData.uri}`;\n  }\n\n  private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n    const index = entry.lines.indexOf(marker);\n    if (index === -1) {\n      return;\n    }\n    entry.lines.splice(index, 1);\n    if (entry.lines.length === 0) {\n      if (entry.data.id !== undefined) {\n        this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n      }\n      this._dataByLinkId.delete(entry.id);\n    }\n  }\n}\n\ninterface IOscLinkEntry<T extends IOscLinkData> {\n  data: T;\n  id: number;\n  lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry<IOscLinkData> {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry<Required<IOscLinkData>> {\n  key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n  return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n  if (serviceRegistry.has(id)) {\n    return serviceRegistry.get(id)!;\n  }\n\n  const decorator: any = function (target: Function, key: string, index: number): any {\n    if (arguments.length !== 3) {\n      throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n    }\n\n    storeServiceDependency(decorator, target, index);\n  };\n\n  decorator.toString = () => id;\n\n  serviceRegistry.set(id, decorator);\n  return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n  if ((target as any)[DI_TARGET] === target) {\n    (target as any)[DI_DEPENDENCIES].push({ id, index });\n  } else {\n    (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n    (target as any)[DI_TARGET] = target;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: undefined;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n  isUserScrolling: boolean;\n  onResize: IEvent<{ cols: number, rows: number }>;\n  onScroll: IEvent<number>;\n  scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n  scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n  resize(cols: number, rows: number): void;\n  reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n  activeProtocol: string;\n  activeEncoding: string;\n  areMouseEventsActive: boolean;\n  addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n  addEncoding(name: string, encoding: CoreMouseEncoding): void;\n  reset(): void;\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n  /**\n   * Event to announce changes in mouse tracking.\n   */\n  onProtocolChange: IEvent<CoreMouseEventType>;\n\n  /**\n   * Human readable version of mouse events.\n   */\n  explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n  serviceBrand: undefined;\n\n  /**\n   * Initially the cursor will not be visible until the first time the terminal\n   * is focused.\n   */\n  isCursorInitialized: boolean;\n  isCursorHidden: boolean;\n\n  readonly modes: IModes;\n  readonly decPrivateModes: IDecPrivateModes;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\n  readonly onBinary: IEvent<string>;\n  readonly onRequestScrollToBottom: IEvent<void>;\n\n  reset(): void;\n\n  /**\n   * Triggers the onData event in the public API.\n   * @param data The data that is being emitted.\n   * @param wasUserInput Whether the data originated from the user (as opposed to\n   * resulting from parsing incoming data). When true this will also:\n   * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n   * - Fire the `onUserInput` event (so selection can be cleared).\n   */\n  triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n  /**\n   * Triggers the onBinary event in the public API.\n   * @param data The data that is being emitted.\n   */\n  triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n  serviceBrand: undefined;\n\n  charset: ICharset | undefined;\n  readonly glevel: number;\n\n  reset(): void;\n\n  /**\n   * Set the G level of the terminal.\n   * @param g\n   */\n  setgLevel(g: number): void;\n\n  /**\n   * Set the charset for the given G level of the terminal.\n   * @param g\n   * @param charset\n   */\n  setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n    : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  serviceBrand: undefined;\n\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n  getService<T>(id: IServiceIdentifier<T>): T | undefined;\n  createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\n  debug(message: any, ...optionalParams: any[]): void;\n  info(message: any, ...optionalParams: any[]): void;\n  warn(message: any, ...optionalParams: any[]): void;\n  error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n  serviceBrand: undefined;\n\n  /**\n   * Read only access to the raw options object, this is an internal-only fast path for accessing\n   * single options without any validation as we trust TypeScript to enforce correct usage\n   * internally.\n   */\n  readonly rawOptions: Required<ITerminalOptions>;\n\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n  allowProposedApi?: boolean;\n  allowTransparency?: boolean;\n  altClickMovesCursor?: boolean;\n  cols?: number;\n  convertEol?: boolean;\n  cursorBlink?: boolean;\n  cursorStyle?: CursorStyle;\n  cursorWidth?: number;\n  cursorInactiveStyle?: CursorInactiveStyle;\n  customGlyphs?: boolean;\n  disableStdin?: boolean;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsMode?: boolean;\n  windowsPty?: IWindowsPty;\n  windowOptions?: IWindowOptions;\n  wordSeparator?: string;\n  overviewRulerWidth?: number;\n\n  [key: string]: any;\n  cancelEvents: boolean;\n  termName: string;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selectionForeground?: string;\n  selectionBackground?: string;\n  selectionInactiveBackground?: string;\n  black?: string;\n  red?: string;\n  green?: string;\n  yellow?: string;\n  blue?: string;\n  magenta?: string;\n  cyan?: string;\n  white?: string;\n  brightBlack?: string;\n  brightRed?: string;\n  brightGreen?: string;\n  brightYellow?: string;\n  brightBlue?: string;\n  brightMagenta?: string;\n  brightCyan?: string;\n  brightWhite?: string;\n  extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n  serviceBrand: undefined;\n  /**\n   * Registers a link to the service, returning the link ID. The link data is managed by this\n   * service and will be freed when this current cursor position is trimmed off the buffer.\n   */\n  registerLink(linkData: IOscLinkData): number;\n  /**\n   * Adds a line to a link if needed.\n   */\n  addLineToLink(linkId: number, y: number): void;\n  /** Get the link data associated with a link ID. */\n  getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n  serviceBrand: undefined;\n  /** Register an Unicode version provider. */\n  register(provider: IUnicodeVersionProvider): void;\n  /** Registered Unicode versions. */\n  readonly versions: string[];\n  /** Currently active version. */\n  activeVersion: string;\n  /** Event triggered, when activate version changed. */\n  readonly onChange: IEvent<string>;\n\n  /**\n   * Unicode version dependent\n   */\n  wcwidth(codepoint: number): number;\n  getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n  readonly version: string;\n  wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n  serviceBrand: undefined;\n  readonly decorations: IterableIterator<IInternalDecoration>;\n  readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n  readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n  registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n  reset(): void;\n  /**\n   * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n   * instead of an iterator as it's typically used in hot code paths.\n   */\n  forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n  readonly options: IDecorationOptions;\n  readonly backgroundColorRGB: IColor | undefined;\n  readonly foregroundColorRGB: IColor | undefined;\n  readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { EventEmitter } from 'common/EventEmitter';\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\nimport { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services';\n\nexport class UnicodeService implements IUnicodeService {\n  public serviceBrand: any;\n\n  private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n  private _active: string = '';\n  private _activeProvider: IUnicodeVersionProvider;\n\n  private readonly _onChange = new EventEmitter<string>();\n  public readonly onChange = this._onChange.event;\n\n  constructor() {\n    const defaultProvider = new UnicodeV6();\n    this.register(defaultProvider);\n    this._active = defaultProvider.version;\n    this._activeProvider = defaultProvider;\n  }\n\n  public dispose(): void {\n    this._onChange.dispose();\n  }\n\n  public get versions(): string[] {\n    return Object.keys(this._providers);\n  }\n\n  public get activeVersion(): string {\n    return this._active;\n  }\n\n  public set activeVersion(version: string) {\n    if (!this._providers[version]) {\n      throw new Error(`unknown Unicode version \"${version}\"`);\n    }\n    this._active = version;\n    this._activeProvider = this._providers[version];\n    this._onChange.fire(version);\n  }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._providers[provider.version] = provider;\n  }\n\n  /**\n   * Unicode version dependent interface.\n   */\n  public wcwidth(num: number): number {\n    return this._activeProvider.wcwidth(num);\n  }\n\n  public getStringCellWidth(s: string): number {\n    let result = 0;\n    const length = s.length;\n    for (let i = 0; i < length; ++i) {\n      let code = s.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          // this should not happen with strings retrieved from\n          // Buffer.translateToString as it converts from UTF-32\n          // and therefore always should contain the second part\n          // for any other string we still have to handle it somehow:\n          // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n          return result + this.wcwidth(code);\n        }\n        const second = s.charCodeAt(i);\n        // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n        // otherwise treat them independently (UCS-2 behavior)\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          result += this.wcwidth(second);\n        }\n      }\n      result += this.wcwidth(code);\n    }\n    return result;\n  }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { Terminal as TerminalCore } from 'browser/Terminal';\nimport { IBufferRange, ITerminal } from 'browser/Types';\nimport { IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { ITerminalOptions } from 'common/Types';\nimport { AddonManager } from 'common/public/AddonManager';\nimport { BufferNamespaceApi } from 'common/public/BufferNamespaceApi';\nimport { ParserApi } from 'common/public/ParserApi';\nimport { UnicodeApi } from 'common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from 'xterm';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nexport class Terminal extends Disposable implements ITerminalApi {\n  private _core: ITerminal;\n  private _addonManager: AddonManager;\n  private _parser: IParser | undefined;\n  private _buffer: BufferNamespaceApi | undefined;\n  private _publicOptions: Required<ITerminalOptions>;\n\n  constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n    super();\n\n    this._core = this.register(new TerminalCore(options));\n    this._addonManager = this.register(new AddonManager());\n\n    this._publicOptions = { ... this._core.options };\n    const getter = (propName: string): any => {\n      return this._core.options[propName];\n    };\n    const setter = (propName: string, value: any): void => {\n      this._checkReadonlyOptions(propName);\n      this._core.options[propName] = value;\n    };\n\n    for (const propName in this._core.options) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this._publicOptions, propName, desc);\n    }\n  }\n\n  private _checkReadonlyOptions(propName: string): void {\n    // Throw an error if any constructor only option is modified\n    // from terminal.options\n    // Modifications from anywhere else are allowed\n    if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n      throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n    }\n  }\n\n  private _checkProposedApi(): void {\n    if (!this._core.optionsService.rawOptions.allowProposedApi) {\n      throw new Error('You must set the allowProposedApi option to true to use proposed API');\n    }\n  }\n\n  public get onBell(): IEvent<void> { return this._core.onBell; }\n  public get onBinary(): IEvent<string> { return this._core.onBinary; }\n  public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n  public get onData(): IEvent<string> { return this._core.onData; }\n  public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n  public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n  public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n  public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n  public get onScroll(): IEvent<number> { return this._core.onScroll; }\n  public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n  public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n  public get onWriteParsed(): IEvent<void> { return this._core.onWriteParsed; }\n\n  public get element(): HTMLElement | undefined { return this._core.element; }\n  public get parser(): IParser {\n    if (!this._parser) {\n      this._parser = new ParserApi(this._core);\n    }\n    return this._parser;\n  }\n  public get unicode(): IUnicodeHandling {\n    this._checkProposedApi();\n    return new UnicodeApi(this._core);\n  }\n  public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n  public get rows(): number { return this._core.rows; }\n  public get cols(): number { return this._core.cols; }\n  public get buffer(): IBufferNamespaceApi {\n    if (!this._buffer) {\n      this._buffer = this.register(new BufferNamespaceApi(this._core));\n    }\n    return this._buffer;\n  }\n  public get markers(): ReadonlyArray<IMarker> {\n    this._checkProposedApi();\n    return this._core.markers;\n  }\n  public get modes(): IModes {\n    const m = this._core.coreService.decPrivateModes;\n    let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n    switch (this._core.coreMouseService.activeProtocol) {\n      case 'X10': mouseTrackingMode = 'x10'; break;\n      case 'VT200': mouseTrackingMode = 'vt200'; break;\n      case 'DRAG': mouseTrackingMode = 'drag'; break;\n      case 'ANY': mouseTrackingMode = 'any'; break;\n    }\n    return {\n      applicationCursorKeysMode: m.applicationCursorKeys,\n      applicationKeypadMode: m.applicationKeypad,\n      bracketedPasteMode: m.bracketedPasteMode,\n      insertMode: this._core.coreService.modes.insertMode,\n      mouseTrackingMode: mouseTrackingMode,\n      originMode: m.origin,\n      reverseWraparoundMode: m.reverseWraparound,\n      sendFocusMode: m.sendFocus,\n      wraparoundMode: m.wraparound\n    };\n  }\n  public get options(): Required<ITerminalOptions> {\n    return this._publicOptions;\n  }\n  public set options(options: ITerminalOptions) {\n    for (const propName in options) {\n      this._publicOptions[propName] = options[propName];\n    }\n  }\n  public blur(): void {\n    this._core.blur();\n  }\n  public focus(): void {\n    this._core.focus();\n  }\n  public resize(columns: number, rows: number): void {\n    this._verifyIntegers(columns, rows);\n    this._core.resize(columns, rows);\n  }\n  public open(parent: HTMLElement): void {\n    this._core.open(parent);\n  }\n  public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n    this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n  }\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this._core.registerLinkProvider(linkProvider);\n  }\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    this._checkProposedApi();\n    return this._core.registerCharacterJoiner(handler);\n  }\n  public deregisterCharacterJoiner(joinerId: number): void {\n    this._checkProposedApi();\n    this._core.deregisterCharacterJoiner(joinerId);\n  }\n  public registerMarker(cursorYOffset: number = 0): IMarker {\n    this._verifyIntegers(cursorYOffset);\n    return this._core.registerMarker(cursorYOffset);\n  }\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    this._checkProposedApi();\n    this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n    return this._core.registerDecoration(decorationOptions);\n  }\n  public hasSelection(): boolean {\n    return this._core.hasSelection();\n  }\n  public select(column: number, row: number, length: number): void {\n    this._verifyIntegers(column, row, length);\n    this._core.select(column, row, length);\n  }\n  public getSelection(): string {\n    return this._core.getSelection();\n  }\n  public getSelectionPosition(): IBufferRange | undefined {\n    return this._core.getSelectionPosition();\n  }\n  public clearSelection(): void {\n    this._core.clearSelection();\n  }\n  public selectAll(): void {\n    this._core.selectAll();\n  }\n  public selectLines(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.selectLines(start, end);\n  }\n  public dispose(): void {\n    super.dispose();\n  }\n  public scrollLines(amount: number): void {\n    this._verifyIntegers(amount);\n    this._core.scrollLines(amount);\n  }\n  public scrollPages(pageCount: number): void {\n    this._verifyIntegers(pageCount);\n    this._core.scrollPages(pageCount);\n  }\n  public scrollToTop(): void {\n    this._core.scrollToTop();\n  }\n  public scrollToBottom(): void {\n    this._core.scrollToBottom();\n  }\n  public scrollToLine(line: number): void {\n    this._verifyIntegers(line);\n    this._core.scrollToLine(line);\n  }\n  public clear(): void {\n    this._core.clear();\n  }\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data, callback);\n  }\n  public writeln(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data);\n    this._core.write('\\r\\n', callback);\n  }\n  public paste(data: string): void {\n    this._core.paste(data);\n  }\n  public refresh(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.refresh(start, end);\n  }\n  public reset(): void {\n    this._core.reset();\n  }\n  public clearTextureAtlas(): void {\n    this._core.clearTextureAtlas();\n  }\n  public loadAddon(addon: ITerminalAddon): void {\n    this._addonManager.loadAddon(this, addon);\n  }\n  public static get strings(): ILocalizableStrings {\n    return Strings;\n  }\n\n  private _verifyIntegers(...values: number[]): void {\n    for (const value of values) {\n      if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n        throw new Error('This API only accepts integers');\n      }\n    }\n  }\n\n  private _verifyPositiveIntegers(...values: number[]): void {\n    for (const value of values) {\n      if (value && (value === Infinity || isNaN(value) || value % 1 !== 0 || value < 0)) {\n        throw new Error('This API only accepts positive integers');\n      }\n    }\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","self","AccessibilityManager","Disposable","constructor","_terminal","super","_renderService","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","this","_accessibilityContainer","document","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_refreshRowsDimensions","_liveRegion","_liveRegionDebouncer","register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_screenDprMonitor","ScreenDprMonitor","window","setListener","addDisposableDomListener","toDisposable","remove","MAX_ROWS_TO_READ","shift","textContent","Strings","tooMuchOutput","isMac","parentNode","setTimeout","keyChar","test","push","refresh","buffer","setSize","lines","toString","lineData","translateBufferLineToString","ydisp","posInSet","innerText","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","style","width","canvas","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","getBoundingClientRect","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","select","_color","TwoKeyMap","_css","setCss","bg","fg","set","getCss","get","setColor","getColor","clear","node","type","handler","options","disposed","dispose","Linkifier2","currentLink","_currentLink","_bufferService","_linkProviders","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","EventEmitter","onShowLinkUnderline","event","_onHideLinkUnderline","onHideLinkUnderline","getDisposeArrayDisposable","_lastMouseEvent","undefined","_clearCurrentLink","registerLinkProvider","linkProvider","providerIndex","indexOf","splice","attachToDom","mouseService","renderService","_element","_mouseService","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","contains","_lastBufferCell","x","y","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","_activeProviderReplies","forEach","reply","linkWithState","Map","linkProvided","entries","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","cols","has","index","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","disposeArray","state","decorations","underline","pointerCursor","isHovered","_linkHover","Object","defineProperties","v","toggle","_fireUnderlineEvent","onRenderedViewportChange","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","fire","leave","lower","upper","current","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabel","OscLinkProvider","_optionsService","_oscLinkService","callback","line","result","linkHandler","CellData","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","confirm","newWindow","open","opener","location","href","console","warn","IOptionsService","IOscLinkService","_parentWindow","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","requestAnimationFrame","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","Math","min","_rowEnd","max","_runRefreshCallbacks","_currentDevicePixelRatio","devicePixelRatio","clearListener","listener","_listener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Terminal","CoreTerminal","onFocus","_onFocus","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","browser","Browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","MutableDisposable","_onCursorMove","onCursorMove","_onKey","_onRender","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_setup","linkifier2","_instantiationService","createInstance","_decorationService","DecorationService","setService","IDecorationService","_inputHandler","onRequestBell","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","_reportWindowsOptions","onColor","_handleColorEvent","forwardEvent","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","channels","color","toColorRGB","colors","ansi","C0","ESC","toRgbString","C1_ESCAPED","ST","modifyColors","rgba","toColor","narrowedAcc","restoreColor","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","updateCursorStyle","_showCursor","blur","_handleTextAreaBlur","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","compositionupdate","compositionend","_inputEvent","updateCompositionElements","parent","isConnected","_logService","debug","_document","ownerDocument","dir","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","isChromeOS","_coreBrowserService","CoreBrowserService","defaultView","ICoreBrowserService","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","resize","_compositionView","CompositionHelper","hasRenderer","setRenderer","_createRenderer","MouseService","IMouseService","viewport","Viewport","onRequestScrollLines","amount","suppressScrollEvent","onRequestSyncScrollBar","syncScrollArea","handleCursorMove","handleResize","handleBlur","handleFocus","SelectionService","ISelectionService","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","_onScroll","BufferDecorationRenderer","handleMouseDown","coreMouseService","areMouseEventsActive","disable","enable","screenReaderMode","onSpecificOptionChange","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","measure","bindMouse","DomRenderer","el","sendEvent","getMouseReportCoords","but","action","overrideType","buttons","getLinesScrolled","deltaY","triggerMouseEvent","col","row","ctrl","ctrlKey","alt","altKey","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","onProtocolChange","events","logLevel","explainEvents","passive","activeProtocol","shouldForceSelection","hasScrollback","sequence","applicationCursorKeys","data","abs","handleWheel","handleTouchStart","handleTouchMove","refreshRows","shouldColumnSelect","isCursorInitialized","disp","source","attachCustomKeyEventHandler","customKeyEventHandler","registerCharacterJoiner","joinerId","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","column","setSelection","getSelection","getSelectionPosition","selectionStart","selectionEnd","clearSelection","selectAll","selectLines","shouldIgnoreComposition","macOptionIsMeta","keydown","scrollOnUserInput","scrollToBottom","evaluateKeyboardEvent","scrollCount","_isThirdLevelShift","metaKey","charCodeAt","ETX","CR","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","wasModifierKeyOnlyEvent","charCode","which","String","fromCharCode","inputType","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","force","cancelEvents","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","Date","now","elapsed","waitPeriodBeforeTrailingRefresh","_scrollArea","themeService","scrollBarWidth","_currentRowHeight","_currentDeviceCellHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","_smoothScrollState","startTime","origin","_onRequestScrollLines","offsetWidth","_handleScroll","_activeBuffer","onBufferActivate","activeBuffer","_renderDimensions","_handleThemeChange","onChangeColors","backgroundColor","background","_refresh","immediate","device","dpr","offsetHeight","newBufferHeight","round","scrollTop","offsetParent","diff","_smoothScroll","_isDisposed","percent","_smoothScrollPercent","_clearSmoothScrollState","smoothScrollDuration","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","scrollHeight","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","getBufferElements","startLine","endLine","cursorElement","currentLine","bufferElements","isWrapped","translateToString","div","DOM_DELTA_PIXEL","floor","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","pageY","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","drawHeight","drawWidth","drawX","_width","_coreBrowseService","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","_registerDecorationListeners","_registerBufferChangeListeners","_registerDimensionChangeListeners","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_containerHeight","clientHeight","_refreshDrawConstants","outerWidth","innerWidth","ceil","pixelsPerLine","nonFullHeight","_refreshDecorations","clearRect","lineWidth","_renderColorZone","fillStyle","fillRect","updateCanvasDimensions","updateAnchor","_isComposing","_textarea","_coreService","_isSendingComposition","_compositionPosition","_dataAlreadySent","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","currentCompositionPosition","input","substring","oldValue","newValue","DEL","dontRecurse","fontFamily","fontSize","compositionViewBounds","ICoreService","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","parseInt","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","startY","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","wrappedRows","direction","verticalDirection","wrappedRowsCount","repeat","currentRow","lineWraps","startCol","endCol","forward","currentCol","bufferStr","mod","count","str","rpt","targetX","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","TERMINAL_CLASS_PREFIX","ROW_CONTAINER_CLASS","FG_CLASS_PREFIX","BG_CLASS_PREFIX","FOCUS_CLASS","SELECTION_CLASS","nextTerminalId","_linkifier2","instantiationService","_terminalClass","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","overflow","styles","_terminalSelector","foreground","multiplyOpacity","cursor","cursorAccent","cursorWidth","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","c","INVERTED_DEFAULT_COLOR","opaque","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","renderRows","replaceChildren","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","colStart","colEnd","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowElement","createRow","_setCellUnderline","enabled","maxY","bufferline","IInstantiationService","_workCell","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","classes","hasHover","isJoined","lastCharX","JoinedCellData","isInSelection","_isCellInSelection","isCursorCell","isLinkHover","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isCursorHidden","isFocused","isDim","isInvisible","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","join","drawBoldTextInBrightColors","isStrikethrough","textDecoration","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","className","minimumContrastRatio","excludeFromContrastRatioDemands","getCode","cache","_getContrastCache","adjustedColor","ratio","ensureContrastRatio","halfContrastCache","contrastCache","padChar","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_measureElements","whiteSpace","fontKerning","regular","bold","italic","fontStyle","boldItalic","body","_holey","fill","font","weight","weightBold","cp","_measure","variant","DIM_OPACITY","TEXT_BASELINE","isLegacyEdge","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","DomMeasureStrategy","onMultipleOptionChange","_parentElement","_result","_measureElement","geometry","Number","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","id","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","error","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_isFocused","_cachedIsFocused","hasFocus","queueMicrotask","_renderer","decorationService","coreBrowserService","_pausedResizeTask","DebouncedIdleTask","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onDimensionsChange","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_renderDebouncer","RenderDebouncer","_fullRefresh","observer","IntersectionObserver","_handleIntersectionChange","threshold","observe","disconnect","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","_fireOnCanvasResize","renderer","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_linkifier","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","_trimListener","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","lineText","startRowEndCol","isLinuxMouseSelection","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","offset","terminalHeight","macOptionClickForcesSelection","timeStamp","_handleIncrementalClick","detail","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","setInterval","_dragScroll","clearInterval","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","_fireOnSelectionChange","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","slice","trim","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","createDecorator","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_ANSI_COLORS","freeze","r","g","b","toCss","toRgba","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","opacity","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","clone","val","depth","clonedObject","isArray","$r","$g","$b","$a","rgb","toPaddedHex","s","contrastRatio","l1","l2","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","$ctx","$litmusColor","isNode","willReadFrequently","globalCompositeOperation","createLinearGradient","match","rgbaMatch","parseFloat","getImageData","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","onBinary","_onData","onData","_onLineFeed","_onResize","_onWriteParsed","onWriteParsed","InstantiationService","OptionsService","BufferService","LogService","ILogService","CoreService","CoreMouseService","ICoreMouseService","unicodeService","UnicodeService","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","write","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","isNaN","MINIMUM_COLS","MINIMUM_ROWS","scroll","eraseAttr","scrollPages","pageCount","scrollToTop","scrollToLine","scrollAmount","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","windowsPty","buildNumber","backend","windowsMode","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_listeners","_disposed","_event","arg1","arg2","queue","call","clearListeners","from","to","GLEVEL","MAX_PARSEBUFFER_LENGTH","paramToWindowOption","n","opts","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_coreMouseService","_unicodeService","_parser","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","setCsiHandlerFallback","params","identifier","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","code","setOscHandlerFallback","setDcsHandlerFallback","payload","setPrintHandler","print","insertChars","intermediates","scrollLeft","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","setExecuteHandler","BEL","bell","LF","lineFeed","VT","FF","carriageReturn","BS","backspace","HT","tab","SO","shiftOut","SI","shiftIn","C1","IND","NEL","nextLine","HTS","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","Promise","race","res","rej","catch","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","split","clearRange","len","decode","subarray","chWidth","charset","wraparoundMode","wraparound","insertMode","modes","curAttr","bufferRow","markDirty","setCellFromCodePoint","wcwidth","ch","stringFromCodePoint","addLineToLink","_eraseAttrData","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","addCodepointToCell","precedingCodepoint","convertEol","reverseWraparound","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","_is","term","termName","setgCharset","DEFAULT_CHARSET","applicationKeypad","activeEncoding","activateAltBuffer","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","b2v","m","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","bottom","second","_savedCharset","slots","idx","spec","exec","isValidColorIndex","args","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","startsWith","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","f","isProtected","_disposables","unregister","_value","array","_data","third","fourth","navigator","userAgent","platform","isSafari","majorVersion","isIpad","isIphone","_getKey","insert","_search","getKeyIterator","forEachByKey","values","mid","midKey","TaskQueue","_tasks","_i","enqueue","task","_start","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","longestTask","lastDeadlineRemaining","timeRemaining","deadlineRemaining","PriorityTaskQueue","_createDeadline","duration","IdleTaskQueue","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isBlink","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","_urlId","_ext","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupQueue","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","getWhitespaceCell","BufferLine","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","copyCellsFrom","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","$startIndex","fillCellData","_combined","_extendedAttrs","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","eAttrs","byteLength","uint32Cells","keys","extKeys","copyFrom","src","applyInReverse","srcData","srcCombinedKeys","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","BufferSet","_onBufferActivate","_normal","Buffer","_alt","inactiveBuffer","obj","combined","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","isDisposed","_nextId","_onDispose","disposable","C","NUL","SOH","STX","EOT","ENQ","ACK","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","FS","GS","RS","US","SP","PAD","HOP","BPH","NBH","SSA","ESA","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","OSC","PM","APC","KEYCODE_KEY_MAPPINGS","applicationCursorMode","modifiers","keyMapping","keyString","toUpperCase","toLowerCase","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","num","ucs","bisearch","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","chunk","cb","_innerWrite","lastTime","continuation","resolve","then","RGB_REX","HASH_REX","pad","bits","s2","low","base","adv","PAYLOAD_LIMIT","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","unhook","hook","put","utf32ToString","success","handlerResult","EMPTY_PARAMS","Params","addParam","_handler","_params","_hitLimit","ret","TransitionTable","setDefault","next","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","apply","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","collect","abort","addSubParam","addDigit","handlersEsc","jj","_state","_put","MAX_VALUE","fromArray","k","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","store","cur","_addons","instance","loadAddon","terminal","loadedAddon","_wrappedAddonDispose","_buffer","init","viewportY","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferNamespaceApi","_core","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","isUserScrolling","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","glevel","_charsets","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_lastEvent","_onProtocolChange","name","addProtocol","addEncoding","encoding","_equalEvents","report","triggerBinaryEvent","down","up","drag","move","e1","e2","pixels","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","wasUserInput","disableStdin","$xmin","$xmax","_decorations","SortedList","_onDecorationRegistered","_onDecorationRemoved","Decoration","markerDispose","getDecorationsAtCell","xmin","xmax","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","trace","TRACE","info","INFO","ERROR","off","OFF","traceLogger","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","_target","descriptor","fn","JSON","stringify","DEFAULT_OPTIONS","customGlyphs","allowProposedApi","allowTransparency","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","getter","propName","setter","desc","defineProperty","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","linkId","every","linkData","DI_TARGET","DI_DEPENDENCIES","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","defaultProvider","UnicodeV6","_activeProvider","getStringCellWidth","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","CONSTRUCTOR_ONLY_OPTIONS","_addonManager","AddonManager","_publicOptions","_checkReadonlyOptions","_checkProposedApi","parser","ParserApi","unicode","UnicodeApi","mouseTrackingMode","applicationCursorKeysMode","applicationKeypadMode","originMode","reverseWraparoundMode","sendFocusMode","columns","_verifyIntegers","_verifyPositiveIntegers","writeln","addon","strings","Infinity"],"sourceRoot":""}
\ No newline at end of file
diff --git a/termproxy/Cargo.toml b/termproxy/Cargo.toml
new file mode 100644 (file)
index 0000000..ee17382
--- /dev/null
@@ -0,0 +1,21 @@
+[package]
+name = "proxmox-termproxy"
+description = "Execute a terminal command and proxy I/O via network"
+version = "1.0.0"
+authors = [
+    "Proxmox Support Team <support@proxmox.com>",
+    "for xterm.js parts: The xterm.js authors <https://github.com/xtermjs/xterm.js>",
+]
+edition = "2021"
+license = "AGPL-3"
+
+exclude = [ "build", "debian" ]
+
+[dependencies]
+anyhow = "1"
+mio = { version = "0.8", features = [ "net", "os-ext" ] }
+ureq = { version = "2.4", default-features = false, features = [ "gzip" ] }
+clap = "4"
+proxmox-io = "1"
+proxmox-lang = "1.1"
+proxmox-sys = "0.5"
diff --git a/termproxy/Makefile b/termproxy/Makefile
new file mode 100644 (file)
index 0000000..dbc7b85
--- /dev/null
@@ -0,0 +1,86 @@
+include /usr/share/dpkg/default.mk
+
+PACKAGE=proxmox-termproxy
+CRATENAME=proxmox-termproxy
+
+BUILDDIR ?= $(PACKAGE)-$(DEB_VERSION_UPSTREAM)
+ORIG_SRC_TAR=$(PACKAGE)_$(DEB_VERSION_UPSTREAM).orig.tar.gz
+
+DEB=$(PACKAGE)_$(DEB_VERSION)_$(DEB_HOST_ARCH).deb
+DBG_DEB=$(PACKAGE)-dbgsym_$(DEB_VERSION)_$(DEB_HOST_ARCH).deb
+DSC=$(PACKAGE)_$(DEB_VERSION).dsc
+
+CARGO ?= cargo
+ifeq ($(BUILD_MODE), release)
+CARGO_BUILD_ARGS += --release
+COMPILEDIR := target/release
+else
+COMPILEDIR := target/debug
+endif
+
+PREFIX = /usr
+BINDIR = $(PREFIX)/bin
+TERMPROXY_BIN := $(addprefix $(COMPILEDIR)/,proxmox-termproxy)
+
+all:
+
+install: $(TERMPROXY_BIN)
+       install -dm755 $(DESTDIR)$(BINDIR)
+       install -m755 $(TERMPROXY_BIN) $(DESTDIR)$(BINDIR)/
+
+$(TERMPROXY_BIN): .do-cargo-build
+.do-cargo-build:
+       $(CARGO) build $(CARGO_BUILD_ARGS)
+       touch .do-cargo-build
+
+
+.PHONY: cargo-build
+cargo-build: .do-cargo-build
+
+$(BUILDDIR):
+       rm -rf $@ $@.tmp
+       mkdir $@.tmp
+       cp -a debian/ src/ Makefile Cargo.toml $@.tmp
+       echo "git clone git://git.proxmox.com/git/pve-xtermjs.git\\ngit checkout $$(git rev-parse HEAD)" \
+           > $@.tmp/debian/SOURCE
+       mv $@.tmp $@
+
+
+$(ORIG_SRC_TAR): $(BUILDDIR)
+       tar czf $(ORIG_SRC_TAR) --exclude="$(BUILDDIR)/debian" $(BUILDDIR)
+
+.PHONY: deb
+deb: $(DEB)
+$(DBG_DEB): $(DEB)
+$(DEB): $(BUILDDIR)
+       cd $(BUILDDIR); dpkg-buildpackage -b -uc -us
+       lintian $(DEB)
+       @echo $(DEB)
+
+.PHONY: dsc
+dsc:
+       rm -rf $(DSC) $(BUILDDIR)
+       $(MAKE) $(DSC)
+       lintian $(DSC)
+
+$(DSC): $(BUILDDIR) $(ORIG_SRC_TAR)
+       cd $(BUILDDIR); dpkg-buildpackage -S -us -uc -d
+
+sbuild: $(DSC)
+       sbuild $(DSC)
+
+.PHONY: upload
+upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
+upload: $(DEB) $(DBG_DEB)
+       tar cf - $(DEB) $(DBG_DEB) |ssh -X repoman@repo.proxmox.com -- upload --product pmg,pve,pbs --dist $(UPLOAD_DIST) --arch $(DEB_HOST_ARCH)
+
+.PHONY: clean distclean
+distclean: clean
+clean:
+       $(CARGO) clean
+       rm -rf $(PACKAGE)-[0-9]*/ build/
+       rm -f *.deb *.changes *.dsc *.tar.* *.buildinfo *.build .do-cargo-build
+
+.PHONY: dinstall
+dinstall: deb
+       dpkg -i $(DEB)
diff --git a/termproxy/debian/changelog b/termproxy/debian/changelog
new file mode 100644 (file)
index 0000000..da8db2c
--- /dev/null
@@ -0,0 +1,149 @@
+proxmox-termproxy (1.0.0) bookworm; urgency=medium
+
+  * split out the system console wrapper termproxy into own package
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 13 Oct 2023 11:07:08 +0200
+
+proxmox-term-proxy (4.16.0-3) bookworm; urgency=medium
+
+  * re-build for Debian 12 Bookworm based releases
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 23 May 2023 13:48:44 +0200
+
+rust-termproxy (4.16.0-2) bullseye; urgency=medium
+
+  * switch from curl to ureq
+
+  * detect not running guests and add start button
+
+  * various smaller build system updates and improvements
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 22 May 2023 15:35:35 +0200
+
+rust-termproxy (4.16.0-1) bullseye; urgency=medium
+
+  * upgrade xterm.js from 4.12.0 to 4.16.0
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 25 Jan 2022 15:32:15 +0100
+
+rust-termproxy (4.12.0-1) bullseye; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.12.0
+
+  * re-build for Debian 11 Bullseye based releases
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 14 May 2021 08:26:36 +0200
+
+rust-termproxy (4.7.0-3) pve pmg; urgency=medium
+
+  * fix console window title for rust template
+
+  * fix #2980: do not prompt for leaving on reconnect/disconnect
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 24 Nov 2020 14:53:10 +0100
+
+rust-termproxy (4.7.0-2) pve pmg; urgency=medium
+
+  * fix corner case handling of pre-defined command options
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 28 Aug 2020 13:51:42 +0200
+
+rust-termproxy (4.7.0-1) pve pmg; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.3.0
+
+  * rewrite system console wrapper in rust
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 23 Jul 2020 12:20:16 +0200
+
+pve-xtermjs (4.3.0-1) pve pmg; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.3.0
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 22 Jan 2020 12:17:59 +0100
+
+pve-xtermjs (3.13.2-1) pve pmg; urgency=medium
+
+  * update sources to 3.13.2
+
+  * build for Debian Buster
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 22 May 2019 20:04:12 +0200
+
+pve-xtermjs (3.12.0-1) unstable; urgency=medium
+
+  * allow xtermjs on ipv6 only host
+
+  * update to upstream 3.12.0 release
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 26 Mar 2019 07:44:39 +0100
+
+pve-xtermjs (3.10.1-2) unstable; urgency=medium
+
+  * support new 'cmd' parameter
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 28 Feb 2019 11:13:08 +0100
+
+pve-xtermjs (3.10.1-1) unstable; urgency=medium
+
+  * update to xterm.js 3.10.1
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 17 Jan 2019 16:38:51 +0100
+
+pve-xtermjs (1.0-5) unstable; urgency=medium
+
+  * change localhost to 127.0.0.1
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 08 May 2018 11:20:25 +0200
+
+pve-xtermjs (1.0-4) unstable; urgency=medium
+
+  * reload on container reboot
+
+  * do not try to reconnect the host shell
+
+  * focus terminal when starting
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 07 May 2018 15:16:07 +0200
+
+pve-xtermjs (1.0-3) unstable; urgency=medium
+
+  * update to xterm.js 3.2.0
+
+  * implement reconnect logic
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 11 Apr 2018 14:32:28 +0200
+
+pve-xtermjs (1.0-2) unstable; urgency=medium
+
+  * make perm an optional parameter
+
+  * remove dependcy to libpve-access-control
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 11 Dec 2017 14:39:10 +0100
+
+pve-xtermjs (1.0-1) unstable; urgency=medium
+
+  * bump to 1.0-1
+
+  * update dependencies
+
+  * check ticket via api instead of verify_vnc_ticket
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 07 Dec 2017 13:24:37 +0100
+
+pve-xtermjs (0.1-1) unstable; urgency=medium
+
+  * bump to 0.1-1
+
+  * update dependencies
+
+  * give pty object to process_queue on first call
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 04 Dec 2017 10:29:52 +0100
+
+pve-xtermjs (0.1-1~rc1) unstable; urgency=medium
+
+  * initial package
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 20 Nov 2017 08:25:32 +0100
diff --git a/termproxy/debian/control b/termproxy/debian/control
new file mode 100644 (file)
index 0000000..383bdbe
--- /dev/null
@@ -0,0 +1,36 @@
+Source: proxmox-termproxy
+Section: admin
+Priority: optional
+Build-Depends: cargo:native,
+               debhelper-compat (= 13),
+               dh-cargo (>= 25),
+               librust-anyhow-1+default-dev,
+               librust-clap-4+default-dev,
+               librust-mio-0.8+default-dev,
+               librust-mio-0.8+net-dev,
+               librust-mio-0.8+os-ext-dev,
+               librust-proxmox-io-1+default-dev,
+               librust-proxmox-lang-1+default-dev (>= 1.1-~~),
+               librust-proxmox-sys-0.5+default-dev,
+               librust-ureq-2+gzip-dev (>= 2.4-~~),
+               libstd-rust-dev,
+               rustc:native,
+Maintainer: Proxmox Support Team <support@proxmox.com>
+Standards-Version: 4.6.1
+Vcs-Git: git://git.proxmox.com/git/pve-xtermjs.git
+Vcs-Browser: https://git.proxmox.com/?p=pve-xtermjs.git;a=summary
+Homepage: https://www.proxmox.com
+Rules-Requires-Root: no
+
+Package: proxmox-termproxy
+Architecture: any
+Multi-Arch: allowed
+Depends: ${misc:Depends}, ${shlibs:Depends},
+Recommends: pve-xtermjs
+Breaks: pve-xtermjs (<< 5.3.0~)
+Replaces: pve-xtermjs (<< 5.3.0~)
+Description: Wrapper proxy for executing programs in the system terminal
+ This package provides an wrapper for running commands in a system terminal,
+ redirecting input via a special protocol and returning the PTY output 1:1.
+ It's used for the backend of the xterm.js based host and virtual guest
+ consoles in Proxmox projects like Proxmox VE or Proxmox Backup Server.
diff --git a/termproxy/debian/copyright b/termproxy/debian/copyright
new file mode 100644 (file)
index 0000000..8249a3a
--- /dev/null
@@ -0,0 +1,19 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Source: https://git.proxmox.com/?p=pve-xtermjs.git;a=summary
+
+Files:
+ *
+Copyright: 2017 - 2023 Proxmox Server Solutions GmbH <support@proxmox.com>
+License: AGPL-3.0-or-later
+ This program is free software: you can redistribute it and/or modify it under
+ the terms of the GNU Affero General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option) any
+ later version.
+ .
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
+ details.
+ .
+ You should have received a copy of the GNU Affero General Public License along
+ with this program. If not, see <https://www.gnu.org/licenses/>.
diff --git a/termproxy/debian/docs b/termproxy/debian/docs
new file mode 100644 (file)
index 0000000..8696672
--- /dev/null
@@ -0,0 +1 @@
+debian/SOURCE
diff --git a/termproxy/debian/links b/termproxy/debian/links
new file mode 100644 (file)
index 0000000..d89c53b
--- /dev/null
@@ -0,0 +1 @@
+usr/bin/proxmox-termproxy usr/bin/termproxy
diff --git a/termproxy/debian/rules b/termproxy/debian/rules
new file mode 100755 (executable)
index 0000000..d2407de
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/make -f
+# See debhelper(7) (uncomment to enable)
+# output every command that modifies files on the build system.
+DH_VERBOSE = 1
+
+include /usr/share/dpkg/pkg-info.mk
+include /usr/share/rustc/architecture.mk
+
+export BUILD_MODE=release
+
+CARGO=/usr/share/cargo/bin/cargo
+
+export CFLAGS CXXFLAGS CPPFLAGS LDFLAGS
+export DEB_HOST_RUST_TYPE DEB_HOST_GNU_TYPE
+export CARGO_HOME = $(CURDIR)/debian/cargo_home
+
+export DEB_CARGO_CRATE=proxmox-termproxy_$(DEB_VERSION_UPSTREAM)
+export DEB_CARGO_PACKAGE=proxmox-termproxy
+
+%:
+       dh $@
+
+override_dh_auto_configure:
+       @perl -ne 'if (/^version\s*=\s*"(\d+(?:\.\d+)+)"/) { my $$v_cargo = $$1; my $$v_deb = "$(DEB_VERSION_UPSTREAM)"; \
+           die "ERROR: d/changelog <-> Cargo.toml version mismatch: $$v_cargo != $$v_deb\n" if $$v_cargo ne $$v_deb; exit(0); }' Cargo.toml
+       $(CARGO) prepare-debian $(CURDIR)/debian/cargo_registry --link-from-system
+       dh_auto_configure
+
+override_dh_missing:
+       dh_missing --fail-missing
+
+override_dh_auto_build:
+       dh_auto_build -- \
+           LIBEXECDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
+
+override_dh_auto_install:
+       dh_auto_install -- \
+           LIBEXECDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
diff --git a/termproxy/debian/source/format b/termproxy/debian/source/format
new file mode 100644 (file)
index 0000000..89ae9db
--- /dev/null
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/termproxy/src/main.rs b/termproxy/src/main.rs
new file mode 100644 (file)
index 0000000..5eb14ee
--- /dev/null
@@ -0,0 +1,451 @@
+use std::cmp::min;
+use std::collections::HashMap;
+use std::ffi::OsString;
+use std::io::{ErrorKind, Write};
+use std::os::unix::io::{AsRawFd, FromRawFd};
+use std::os::unix::process::CommandExt;
+use std::process::Command;
+use std::time::{Duration, Instant};
+
+use anyhow::{bail, format_err, Result};
+use clap::Arg;
+use mio::net::{TcpListener, TcpStream};
+use mio::unix::SourceFd;
+use mio::{Events, Interest, Poll, Token};
+
+use proxmox_io::ByteBuffer;
+use proxmox_lang::error::io_err_other;
+use proxmox_sys::linux::pty::{make_controlling_terminal, PTY};
+
+const MSG_TYPE_DATA: u8 = 0;
+const MSG_TYPE_RESIZE: u8 = 1;
+//const MSG_TYPE_PING: u8 = 2;
+
+fn remove_number(buf: &mut ByteBuffer) -> Option<usize> {
+    loop {
+        if let Some(pos) = &buf.iter().position(|&x| x == b':') {
+            let data = buf.remove_data(*pos);
+            buf.consume(1); // the ':'
+            let len = match std::str::from_utf8(&data) {
+                Ok(lenstring) => match lenstring.parse() {
+                    Ok(len) => len,
+                    Err(err) => {
+                        eprintln!("error parsing number: '{}'", err);
+                        break;
+                    }
+                },
+                Err(err) => {
+                    eprintln!("error parsing number: '{}'", err);
+                    break;
+                }
+            };
+            return Some(len);
+        } else if buf.len() > 20 {
+            buf.consume(20);
+        } else {
+            break;
+        }
+    }
+    None
+}
+
+fn process_queue(buf: &mut ByteBuffer, pty: &mut PTY) -> Option<usize> {
+    if buf.is_empty() {
+        return None;
+    }
+
+    loop {
+        if buf.len() < 2 {
+            break;
+        }
+
+        let msgtype = buf[0] - b'0';
+
+        if msgtype == MSG_TYPE_DATA {
+            buf.consume(2);
+            if let Some(len) = remove_number(buf) {
+                return Some(len);
+            }
+        } else if msgtype == MSG_TYPE_RESIZE {
+            buf.consume(2);
+            if let Some(cols) = remove_number(buf) {
+                if let Some(rows) = remove_number(buf) {
+                    pty.set_size(cols as u16, rows as u16).ok()?;
+                }
+            }
+        // ignore incomplete messages
+        } else {
+            buf.consume(1);
+            // ignore invalid or ping (msgtype 2)
+        }
+    }
+
+    None
+}
+
+type TicketResult = Result<(Box<[u8]>, Box<[u8]>)>;
+
+/// Reads from the stream and returns the first line and the rest
+fn read_ticket_line(
+    stream: &mut TcpStream,
+    buf: &mut ByteBuffer,
+    timeout: Duration,
+) -> TicketResult {
+    let mut poll = Poll::new()?;
+    poll.registry()
+        .register(stream, Token(0), Interest::READABLE)?;
+    let mut events = Events::with_capacity(1);
+
+    let now = Instant::now();
+    let mut elapsed = Duration::new(0, 0);
+
+    loop {
+        poll.poll(&mut events, Some(timeout - elapsed))?;
+        if !events.is_empty() {
+            match buf.read_from(stream) {
+                Ok(n) => {
+                    if n == 0 {
+                        bail!("connection closed before authentication");
+                    }
+                }
+                Err(err) if err.kind() == ErrorKind::WouldBlock => {}
+                Err(err) => return Err(err.into()),
+            }
+
+            if buf[..].contains(&b'\n') {
+                break;
+            }
+
+            if buf.is_full() {
+                bail!("authentication data is incomplete: {:?}", &buf[..]);
+            }
+        }
+
+        elapsed = now.elapsed();
+        if elapsed > timeout {
+            bail!("timed out");
+        }
+    }
+
+    let newline_idx = &buf[..].iter().position(|&x| x == b'\n').unwrap();
+
+    let line = buf.remove_data(*newline_idx);
+    buf.consume(1); // discard newline
+
+    match line.iter().position(|&b| b == b':') {
+        Some(pos) => {
+            let (username, ticket) = line.split_at(pos);
+            Ok((username.into(), ticket[1..].into()))
+        }
+        None => bail!("authentication data is invalid"),
+    }
+}
+
+fn authenticate(
+    username: &[u8],
+    ticket: &[u8],
+    path: &str,
+    perm: Option<&str>,
+    authport: u16,
+    port: Option<u16>,
+) -> Result<()> {
+    let mut post_fields: Vec<(&str, &str)> = Vec::with_capacity(5);
+    post_fields.push(("username", std::str::from_utf8(username)?));
+    post_fields.push(("password", std::str::from_utf8(ticket)?));
+    post_fields.push(("path", path));
+    if let Some(perm) = perm {
+        post_fields.push(("privs", perm));
+    }
+    let port_str;
+    if let Some(port) = port {
+        port_str = port.to_string();
+        post_fields.push(("port", &port_str));
+    }
+
+    let url = format!("http://localhost:{}/api2/json/access/ticket", authport);
+
+    match ureq::post(&url).send_form(&post_fields[..]) {
+        Ok(res) if res.status() == 200 => Ok(()),
+        Ok(res) | Err(ureq::Error::Status(_, res)) => {
+            let code = res.status();
+            bail!("invalid authentication - {} {}", code, res.status_text())
+        }
+        Err(err) => bail!("authentication request failed - {}", err),
+    }
+}
+
+fn listen_and_accept(
+    hostname: &str,
+    port: u64,
+    port_as_fd: bool,
+    timeout: Duration,
+) -> Result<(TcpStream, u16)> {
+    let listener = if port_as_fd {
+        unsafe { std::net::TcpListener::from_raw_fd(port as i32) }
+    } else {
+        std::net::TcpListener::bind((hostname, port as u16))?
+    };
+    let port = listener.local_addr()?.port();
+    let mut listener = TcpListener::from_std(listener);
+    let mut poll = Poll::new()?;
+
+    poll.registry()
+        .register(&mut listener, Token(0), Interest::READABLE)?;
+
+    let mut events = Events::with_capacity(1);
+
+    let now = Instant::now();
+    let mut elapsed = Duration::new(0, 0);
+
+    loop {
+        poll.poll(&mut events, Some(timeout - elapsed))?;
+        if !events.is_empty() {
+            let (stream, client) = listener.accept()?;
+            println!("client connection: {:?}", client);
+            return Ok((stream, port));
+        }
+
+        elapsed = now.elapsed();
+        if elapsed > timeout {
+            bail!("timed out");
+        }
+    }
+}
+
+fn run_pty<'a>(mut full_cmd: impl Iterator<Item = &'a OsString>) -> Result<PTY> {
+    let cmd_exe = full_cmd.next().unwrap();
+    let params = full_cmd; // rest
+
+    let (mut pty, secondary_name) = PTY::new().map_err(io_err_other)?;
+
+    let mut filtered_env: HashMap<OsString, OsString> = std::env::vars_os()
+        .filter(|&(ref k, _)| {
+            k == "PATH"
+                || k == "USER"
+                || k == "HOME"
+                || k == "LANG"
+                || k == "LANGUAGE"
+                || k.to_string_lossy().starts_with("LC_")
+        })
+        .collect();
+    filtered_env.insert("TERM".into(), "xterm-256color".into());
+
+    let mut command = Command::new(cmd_exe);
+
+    command.args(params).env_clear().envs(&filtered_env);
+
+    unsafe {
+        command.pre_exec(move || {
+            make_controlling_terminal(&secondary_name).map_err(io_err_other)?;
+            Ok(())
+        });
+    }
+
+    command.spawn()?;
+
+    pty.set_size(80, 20)?;
+    Ok(pty)
+}
+
+const TCP: Token = Token(0);
+const PTY: Token = Token(1);
+
+fn do_main() -> Result<()> {
+    let matches = clap::builder::Command::new("termproxy")
+        .trailing_var_arg(true)
+        .arg(
+            Arg::new("port")
+                .num_args(1)
+                .required(true)
+                .value_parser(clap::value_parser!(u64)),
+        )
+        .arg(Arg::new("authport").num_args(1).long("authport"))
+        .arg(Arg::new("use-port-as-fd").long("port-as-fd"))
+        .arg(Arg::new("path").num_args(1).long("path").required(true))
+        .arg(Arg::new("perm").num_args(1).long("perm"))
+        .arg(
+            Arg::new("cmd")
+                .value_parser(clap::value_parser!(OsString))
+                .num_args(1..)
+                .required(true),
+        )
+        .get_matches();
+
+    let port: u64 = *matches.get_one("port").unwrap();
+    let path = matches.get_one::<String>("path").unwrap();
+    let perm = matches.get_one::<String>("perm").map(|x| x.as_str());
+    let full_cmd: clap::parser::ValuesRef<OsString> = matches.get_many("cmd").unwrap();
+    let authport: u16 = *matches.get_one("authport").unwrap_or(&85);
+    let use_port_as_fd = matches.contains_id("use-port-as-fd");
+
+    if use_port_as_fd && port > u16::MAX as u64 {
+        return Err(format_err!("port too big"));
+    } else if port > i32::MAX as u64 {
+        return Err(format_err!("Invalid FD number"));
+    }
+
+    let (mut tcp_handle, port) =
+        listen_and_accept("localhost", port, use_port_as_fd, Duration::new(10, 0))
+            .map_err(|err| format_err!("failed waiting for client: {}", err))?;
+
+    let mut pty_buf = ByteBuffer::new();
+    let mut tcp_buf = ByteBuffer::new();
+
+    let (username, ticket) = read_ticket_line(&mut tcp_handle, &mut pty_buf, Duration::new(10, 0))
+        .map_err(|err| format_err!("failed reading ticket: {}", err))?;
+    let port = if use_port_as_fd { Some(port) } else { None };
+    authenticate(&username, &ticket, &path, perm.as_deref(), authport, port)?;
+    tcp_handle.write_all(b"OK").expect("error writing response");
+
+    let mut poll = Poll::new()?;
+    let mut events = Events::with_capacity(128);
+
+    let mut pty = run_pty(full_cmd)?;
+
+    poll.registry().register(
+        &mut tcp_handle,
+        TCP,
+        Interest::READABLE | Interest::WRITABLE,
+    )?;
+    poll.registry().register(
+        &mut SourceFd(&pty.as_raw_fd()),
+        PTY,
+        Interest::READABLE | Interest::WRITABLE,
+    )?;
+
+    let mut tcp_writable = true;
+    let mut pty_writable = true;
+    let mut tcp_readable = true;
+    let mut pty_readable = true;
+    let mut remaining = 0;
+    let mut finished = false;
+
+    while !finished {
+        if tcp_readable && !pty_buf.is_full() || pty_readable && !tcp_buf.is_full() {
+            poll.poll(&mut events, Some(Duration::new(0, 0)))?;
+        } else {
+            poll.poll(&mut events, None)?;
+        }
+
+        for event in &events {
+            let writable = event.is_writable();
+            let readable = event.is_readable();
+            if event.is_read_closed() {
+                finished = true;
+            }
+            match event.token() {
+                TCP => {
+                    if readable {
+                        tcp_readable = true;
+                    }
+                    if writable {
+                        tcp_writable = true;
+                    }
+                }
+                PTY => {
+                    if readable {
+                        pty_readable = true;
+                    }
+                    if writable {
+                        pty_writable = true;
+                    }
+                }
+                _ => unreachable!(),
+            }
+        }
+
+        while tcp_readable && !pty_buf.is_full() {
+            let bytes = match pty_buf.read_from(&mut tcp_handle) {
+                Ok(bytes) => bytes,
+                Err(err) if err.kind() == ErrorKind::WouldBlock => {
+                    tcp_readable = false;
+                    break;
+                }
+                Err(err) => {
+                    if !finished {
+                        return Err(format_err!("error reading from tcp: {}", err));
+                    }
+                    break;
+                }
+            };
+            if bytes == 0 {
+                finished = true;
+                break;
+            }
+        }
+
+        while pty_readable && !tcp_buf.is_full() {
+            let bytes = match tcp_buf.read_from(&mut pty) {
+                Ok(bytes) => bytes,
+                Err(err) if err.kind() == ErrorKind::WouldBlock => {
+                    pty_readable = false;
+                    break;
+                }
+                Err(err) => {
+                    if !finished {
+                        return Err(format_err!("error reading from pty: {}", err));
+                    }
+                    break;
+                }
+            };
+            if bytes == 0 {
+                finished = true;
+                break;
+            }
+        }
+
+        while !tcp_buf.is_empty() && tcp_writable {
+            let bytes = match tcp_handle.write(&tcp_buf[..]) {
+                Ok(bytes) => bytes,
+                Err(err) if err.kind() == ErrorKind::WouldBlock => {
+                    tcp_writable = false;
+                    break;
+                }
+                Err(err) => {
+                    if !finished {
+                        return Err(format_err!("error writing to tcp : {}", err));
+                    }
+                    break;
+                }
+            };
+            tcp_buf.consume(bytes);
+        }
+
+        while !pty_buf.is_empty() && pty_writable {
+            if remaining == 0 {
+                remaining = match process_queue(&mut pty_buf, &mut pty) {
+                    Some(val) => val,
+                    None => break,
+                };
+            }
+            let len = min(remaining, pty_buf.len());
+            let bytes = match pty.write(&pty_buf[..len]) {
+                Ok(bytes) => bytes,
+                Err(err) if err.kind() == ErrorKind::WouldBlock => {
+                    pty_writable = false;
+                    break;
+                }
+                Err(err) => {
+                    if !finished {
+                        return Err(format_err!("error writing to pty : {}", err));
+                    }
+                    break;
+                }
+            };
+            remaining -= bytes;
+            pty_buf.consume(bytes);
+        }
+    }
+
+    Ok(())
+}
+
+fn main() {
+    std::process::exit(match do_main() {
+        Ok(_) => 0,
+        Err(err) => {
+            eprintln!("{}", err);
+            1
+        }
+    });
+}
diff --git a/xterm.js/Makefile b/xterm.js/Makefile
new file mode 100644 (file)
index 0000000..563a594
--- /dev/null
@@ -0,0 +1,81 @@
+include /usr/share/dpkg/default.mk
+
+PACKAGE=pve-xtermjs
+
+BUILDDIR ?= $(PACKAGE)-$(DEB_VERSION_UPSTREAM)
+ORIG_SRC_TAR=$(PACKAGE)_$(DEB_VERSION_UPSTREAM).orig.tar.gz
+
+DEB=$(PACKAGE)_$(DEB_VERSION)_all.deb
+DSC=$(PACKAGE)_$(DEB_VERSION).dsc
+
+# for downloading new version use `make XTERMJS_VERSION=X.Y.Z download`
+XTERMJS_VERSION ?= $(DEB_VERSION_UPSTREAM)
+FIT_ADDON_VERSION = 0.8.0
+WEBGL_ADDON_VERSION = 0.16.0
+
+all:
+
+$(BUILDDIR):
+       rm -rf $@ $@.tmp
+       mkdir $@.tmp
+       cp -a debian/ src/ Makefile $@.tmp
+       echo "git clone git://git.proxmox.com/git/pve-xtermjs.git\\ngit checkout $$(git rev-parse HEAD)" \
+           > $@.tmp/debian/SOURCE
+       mv $@.tmp $@
+
+
+$(ORIG_SRC_TAR): $(BUILDDIR)
+       tar czf $(ORIG_SRC_TAR) --exclude="$(BUILDDIR)/debian" $(BUILDDIR)
+
+.PHONY: deb
+deb: $(DEB)
+$(DEB): $(BUILDDIR)
+       cd $(BUILDDIR); dpkg-buildpackage -b -uc -us
+       lintian $(DEB)
+       @echo $(DEB)
+
+.PHONY: dsc
+dsc:
+       rm -rf $(DSC) $(BUILDDIR)
+       $(MAKE) $(DSC)
+       lintian $(DSC)
+
+$(DSC): $(BUILDDIR) $(ORIG_SRC_TAR)
+       cd $(BUILDDIR); dpkg-buildpackage -S -us -uc -d
+
+sbuild: $(DSC)
+       sbuild $(DSC)
+
+EXCLUDED_ADDONS=attach fullscreen search terminado webLinks zmodem
+X_EXCLUSIONS=$(foreach ADDON,$(EXCLUDED_ADDONS),--exclude=addons/$(ADDON))
+
+.PHONY: download
+download: XTERMJS_TGZ = xterm-$(XTERMJS_VERSION).tgz
+download: FIT_ADDON_TGZ = xterm-addon-fit-$(FIT_ADDON_VERSION).tgz
+download: WEBGL_ADDON_TGZ = xterm-addon-webgl-$(WEBGL_ADDON_VERSION).tgz
+download:
+       wget https://registry.npmjs.org/xterm/-/$(XTERMJS_TGZ) -O $(XTERMJS_TGZ).tmp
+       wget https://registry.npmjs.org/xterm-addon-fit/-/$(FIT_ADDON_TGZ) -O $(FIT_ADDON_TGZ).tmp
+       wget https://registry.npmjs.org/xterm-addon-webgl/-/$(WEBGL_ADDON_TGZ) -O $(WEBGL_ADDON_TGZ).tmp
+       mv $(XTERMJS_TGZ).tmp $(XTERMJS_TGZ)
+       mv $(FIT_ADDON_TGZ).tmp $(FIT_ADDON_TGZ)
+       mv $(WEBGL_ADDON_TGZ).tmp $(WEBGL_ADDON_TGZ)
+       tar -C src -xf $(XTERMJS_TGZ) package/lib package/css --strip-components=2 $(X_EXCLUSIONS)
+       tar -C src -xf $(FIT_ADDON_TGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
+       tar -C src -xf $(WEBGL_ADDON_TGZ) package/lib --strip-components=2 $(X_EXCLUSIONS)
+       rm $(XTERMJS_TGZ) $(FIT_ADDON_TGZ) $(WEBGL_ADDON_TGZ)
+
+.PHONY: upload
+upload: UPLOAD_DIST ?= $(DEB_DISTRIBUTION)
+upload: $(DEB)
+       tar cf - $(DEB) |ssh -X repoman@repo.proxmox.com -- upload --product pmg,pve,pbs --dist $(UPLOAD_DIST)
+
+.PHONY: clean distclean
+distclean: clean
+clean:
+       rm -rf $(PACKAGE)-[0-9]*/ build/
+       rm -f *.deb *.changes *.dsc *.tar.* *.buildinfo *.build .do-cargo-build
+
+.PHONY: dinstall
+dinstall: deb
+       dpkg -i $(DEB)
diff --git a/xterm.js/debian/changelog b/xterm.js/debian/changelog
new file mode 100644 (file)
index 0000000..2e89229
--- /dev/null
@@ -0,0 +1,154 @@
+pve-xtermjs (5.3.0-1) bookworm; urgency=medium
+
+  * update to upstream stable release 5.3.0
+
+  * ship WebGL addon
+
+  * split out our native tooling from repackaged upstream for cleaner
+    packaging and to reduce maintenance burden
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 23 May 2023 13:48:44 +0200
+
+rust-termproxy (4.16.0-3) bookworm; urgency=medium
+
+  * re-build for Debian 12 Bookworm based releases
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 23 May 2023 13:48:44 +0200
+
+rust-termproxy (4.16.0-2) bullseye; urgency=medium
+
+  * switch from curl to ureq
+
+  * detect not running guests and add start button
+
+  * various smaller build system updates and improvements
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 22 May 2023 15:35:35 +0200
+
+rust-termproxy (4.16.0-1) bullseye; urgency=medium
+
+  * upgrade xterm.js from 4.12.0 to 4.16.0
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 25 Jan 2022 15:32:15 +0100
+
+rust-termproxy (4.12.0-1) bullseye; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.12.0
+
+  * re-build for Debian 11 Bullseye based releases
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 14 May 2021 08:26:36 +0200
+
+rust-termproxy (4.7.0-3) pve pmg; urgency=medium
+
+  * fix console window title for rust template
+
+  * fix #2980: do not prompt for leaving on reconnect/disconnect
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 24 Nov 2020 14:53:10 +0100
+
+rust-termproxy (4.7.0-2) pve pmg; urgency=medium
+
+  * fix corner case handling of pre-defined command options
+
+ -- Proxmox Support Team <support@proxmox.com>  Fri, 28 Aug 2020 13:51:42 +0200
+
+rust-termproxy (4.7.0-1) pve pmg; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.3.0
+
+  * rewrite system console wrapper in rust
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 23 Jul 2020 12:20:16 +0200
+
+pve-xtermjs (4.3.0-1) pve pmg; urgency=medium
+
+  * upgrade xterm.js to new upstream release 4.3.0
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 22 Jan 2020 12:17:59 +0100
+
+pve-xtermjs (3.13.2-1) pve pmg; urgency=medium
+
+  * update sources to 3.13.2
+
+  * build for Debian Buster
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 22 May 2019 20:04:12 +0200
+
+pve-xtermjs (3.12.0-1) unstable; urgency=medium
+
+  * allow xtermjs on ipv6 only host
+
+  * update to upstream 3.12.0 release
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 26 Mar 2019 07:44:39 +0100
+
+pve-xtermjs (3.10.1-2) unstable; urgency=medium
+
+  * support new 'cmd' parameter
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 28 Feb 2019 11:13:08 +0100
+
+pve-xtermjs (3.10.1-1) unstable; urgency=medium
+
+  * update to xterm.js 3.10.1
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 17 Jan 2019 16:38:51 +0100
+
+pve-xtermjs (1.0-5) unstable; urgency=medium
+
+  * change localhost to 127.0.0.1
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 08 May 2018 11:20:25 +0200
+
+pve-xtermjs (1.0-4) unstable; urgency=medium
+
+  * reload on container reboot
+
+  * do not try to reconnect the host shell
+
+  * focus terminal when starting
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 07 May 2018 15:16:07 +0200
+
+pve-xtermjs (1.0-3) unstable; urgency=medium
+
+  * update to xterm.js 3.2.0
+
+  * implement reconnect logic
+
+ -- Proxmox Support Team <support@proxmox.com>  Wed, 11 Apr 2018 14:32:28 +0200
+
+pve-xtermjs (1.0-2) unstable; urgency=medium
+
+  * make perm an optional parameter
+
+  * remove dependcy to libpve-access-control
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 11 Dec 2017 14:39:10 +0100
+
+pve-xtermjs (1.0-1) unstable; urgency=medium
+
+  * bump to 1.0-1
+
+  * update dependencies
+
+  * check ticket via api instead of verify_vnc_ticket
+
+ -- Proxmox Support Team <support@proxmox.com>  Thu, 07 Dec 2017 13:24:37 +0100
+
+pve-xtermjs (0.1-1) unstable; urgency=medium
+
+  * bump to 0.1-1
+
+  * update dependencies
+
+  * give pty object to process_queue on first call
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 04 Dec 2017 10:29:52 +0100
+
+pve-xtermjs (0.1-1~rc1) unstable; urgency=medium
+
+  * initial package
+
+ -- Proxmox Support Team <support@proxmox.com>  Mon, 20 Nov 2017 08:25:32 +0100
diff --git a/xterm.js/debian/control b/xterm.js/debian/control
new file mode 100644 (file)
index 0000000..5069d1b
--- /dev/null
@@ -0,0 +1,18 @@
+Source: pve-xtermjs
+Section: admin
+Priority: optional
+Build-Depends: debhelper-compat (= 13),
+Maintainer: Proxmox Support Team <support@proxmox.com>
+Standards-Version: 4.6.1
+Vcs-Git: git://git.proxmox.com/git/pve-xtermjs.git
+Vcs-Browser: https://git.proxmox.com/?p=pve-xtermjs.git;a=summary
+Homepage: https://www.proxmox.com
+Rules-Requires-Root: no
+
+Package: pve-xtermjs
+Architecture: all
+Depends: ${misc:Depends},
+Recommends: proxmox-termproxy
+Description: HTML/TypeScript based fully-featured terminal for Proxmox projects
+ Provides the xterm.js frontend for the terminal feature in Proxmox projects'
+ web UI's, like for host administration or Proxmox VE containers shells.
diff --git a/xterm.js/debian/copyright b/xterm.js/debian/copyright
new file mode 100644 (file)
index 0000000..669f2eb
--- /dev/null
@@ -0,0 +1,46 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: xterm.js
+Source: https://github.com/xtermjs/xterm.js
+
+Files:
+ *
+Comment: Based on the sources LICENSE file
+Copyright: 2017-2019 The xterm.js authors (https://github.com/xtermjs/xterm.js)
+           2014-2016 SourceLair Private Company (https://www.sourcelair.com)
+           2012-2013 Christopher Jeffrey (https://github.com/chjj/)
+License: Expat
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ .
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+
+
+Files:
+ debian/*
+Copyright: 2017-2023 Proxmox Server Solutions GmbH
+License: AGPL-3.0-or-later
+ This program is free software: you can redistribute it and/or modify it under
+ the terms of the GNU Affero General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or (at your option) any
+ later version.
+ .
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
+ details.
+ .
+ You should have received a copy of the GNU Affero General Public License along
+ with this program. If not, see <https://www.gnu.org/licenses/>.
diff --git a/xterm.js/debian/docs b/xterm.js/debian/docs
new file mode 100644 (file)
index 0000000..8696672
--- /dev/null
@@ -0,0 +1 @@
+debian/SOURCE
diff --git a/xterm.js/debian/install b/xterm.js/debian/install
new file mode 100644 (file)
index 0000000..0291a3d
--- /dev/null
@@ -0,0 +1 @@
+src/*          /usr/share/pve-xtermjs/
diff --git a/xterm.js/debian/rules b/xterm.js/debian/rules
new file mode 100755 (executable)
index 0000000..55b24ac
--- /dev/null
@@ -0,0 +1,12 @@
+#!/usr/bin/make -f
+
+include /usr/share/dpkg/pkg-info.mk
+
+%:
+       dh $@
+
+override_dh_auto_build:
+       dh_auto_build
+       sed -e 's/@VERSION@/$(DEB_VERSION)/' src/index.html.tpl.in > src/index.html.tpl
+       sed -e 's/@VERSION@/$(DEB_VERSION)/' src/index.html.hbs.in > src/index.html.hbs
+       rm src/index.html.tpl.in src/index.html.hbs.in
diff --git a/xterm.js/debian/source/format b/xterm.js/debian/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/xterm.js/debian/source/lintian-overrides b/xterm.js/debian/source/lintian-overrides
new file mode 100644 (file)
index 0000000..6e1429a
--- /dev/null
@@ -0,0 +1,2 @@
+rust-termproxy source: source-is-missing [src/www/xterm-addon-fit.js]
+rust-termproxy source: source-is-missing [src/www/xterm.js]
diff --git a/xterm.js/src/index.html.hbs.in b/xterm.js/src/index.html.hbs.in
new file mode 100644 (file)
index 0000000..6216e67
--- /dev/null
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+    <head>
+       <title>{{ NodeName }} - Proxmox Console</title>
+       <link rel="stylesheet" href="/xtermjs/xterm.css?version=@VERSION@" />
+       <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
+       <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/util.js?version=@VERSION@" ></script>
+    </head>
+    <body>
+       <div id="status_bar"></div>
+       <div id="wrap">
+       <div class="center">
+           <div id="connect_dlg">
+               <div id="pve_start_info">Guest not running</div>
+               <div id="connect_btn"><div> Start Now </div></div>
+           </div>
+       </div>
+       <div id="terminal-container"></div>
+       </div>
+       <script type="text/javascript">
+           if (typeof(PVE) === 'undefined') PVE = {};
+           PVE.UserName = '{{ UserName }}';
+           PVE.CSRFPreventionToken = '{{ CSRFPreventionToken }}';
+       </script>
+       <script src="/xtermjs/main.js?version=@VERSION@" defer ></script>
+    </body>
+</html>
diff --git a/xterm.js/src/index.html.tpl.in b/xterm.js/src/index.html.tpl.in
new file mode 100644 (file)
index 0000000..fd7ba77
--- /dev/null
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+    <head>
+       <title>[% nodename %] - Proxmox Console</title>
+       <link rel="stylesheet" href="/xtermjs/xterm.css?version=@VERSION@" />
+       <link rel="stylesheet" href="/xtermjs/style.css?version=@VERSION@" />
+       <script src="/xtermjs/xterm.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-fit.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/xterm-addon-webgl.js?version=@VERSION@" ></script>
+       <script src="/xtermjs/util.js?version=@VERSION@" ></script>
+    </head>
+    <body>
+       <div id="status_bar"></div>
+       <div id="wrap">
+       <div class="center">
+           <div id="connect_dlg">
+               <div id="pve_start_info">Guest not running</div>
+               <div id="connect_btn"><div> Start Now </div></div>
+           </div>
+       </div>
+       <div id="terminal-container"></div>
+       </div>
+       <script type="text/javascript">
+           if (typeof(PVE) === 'undefined') PVE = {};
+           PVE.UserName = '[% username %]';
+           PVE.CSRFPreventionToken = '[% token %]';
+       </script>
+       <script src="/xtermjs/main.js?version=@VERSION@" defer ></script>
+    </body>
+</html>
diff --git a/xterm.js/src/main.js b/xterm.js/src/main.js
new file mode 100644 (file)
index 0000000..85cc399
--- /dev/null
@@ -0,0 +1,386 @@
+console.log('xtermjs: starting');
+
+var states = {
+    start:         1,
+    connecting:    2,
+    connected:     3,
+    disconnecting: 4,
+    disconnected:  5,
+    reconnecting:  6,
+};
+
+var term,
+    protocol,
+    socketURL,
+    socket,
+    ticket,
+    resize,
+    ping,
+    state = states.start,
+    starttime = new Date();
+
+var type = getQueryParameter('console');
+var vmid = getQueryParameter('vmid');
+var vmname = getQueryParameter('vmname');
+var nodename = getQueryParameter('node');
+var cmd = getQueryParameter('cmd');
+var cmdOpts = getQueryParameter('cmd-opts');
+
+function updateState(newState, msg, code) {
+    var timeout, severity, message;
+    switch (newState) {
+       case states.connecting:
+           message = "Connecting...";
+           timeout = 0;
+           severity = severities.warning;
+           break;
+       case states.connected:
+           window.onbeforeunload = windowUnload;
+           message = "Connected";
+           break;
+       case states.disconnecting:
+           window.onbeforeunload = undefined;
+           message = "Disconnecting...";
+           timeout = 0;
+           severity = severities.warning;
+           break;
+       case states.reconnecting:
+           window.onbeforeunload = undefined;
+           message = "Reconnecting...";
+           timeout = 0;
+           severity = severities.warning;
+           break;
+       case states.disconnected:
+           window.onbeforeunload = undefined;
+           switch (state) {
+               case states.start:
+               case states.connecting:
+               case states.reconnecting:
+                   message = "Connection failed";
+                   timeout = 0;
+                   severity = severities.error;
+                   break;
+               case states.connected:
+               case states.disconnecting:
+                   var time_since_started = new Date() - starttime;
+                   timeout = 5000;
+                   if (time_since_started > 5*1000 || type === 'shell') {
+                       message = "Connection closed";
+                   } else {
+                       message = "Connection failed";
+                       severity = severities.error;
+                   }
+                   break;
+               case states.disconnected:
+                   // no state change
+                   break;
+               default:
+                   throw "unknown state";
+           }
+           break;
+       default:
+           throw "unknown state";
+    }
+    let msgArr = [];
+    if (msg) {
+       msgArr.push(msg);
+    }
+    if (code !== undefined) {
+       msgArr.push(`Code: ${code}`);
+    }
+    if (msgArr.length > 0) {
+       message += ` (${msgArr.join(', ')})`;
+    }
+    state = newState;
+    showMsg(message, timeout, severity);
+}
+
+var terminalContainer = document.getElementById('terminal-container');
+document.getElementById('status_bar').addEventListener('click', hideMsg);
+document.getElementById('connect_btn').addEventListener('click', startGuest);
+const fitAddon = new FitAddon.FitAddon();
+const webglAddon = new WebglAddon.WebglAddon();
+
+createTerminal();
+
+function startConnection(url, params, term) {
+    API2Request({
+       method: 'POST',
+       params: params,
+       url: url + '/termproxy',
+       success: function(result) {
+           var port = encodeURIComponent(result.data.port);
+           ticket = result.data.ticket;
+           socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + url + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket);
+
+           socket = new WebSocket(socketURL, 'binary');
+           socket.binaryType = 'arraybuffer';
+           socket.onopen = runTerminal;
+           socket.onclose = tryReconnect;
+           socket.onerror = tryReconnect;
+           updateState(states.connecting);
+       },
+       failure: function(msg) {
+           updateState(states.disconnected,msg);
+       }
+    });
+}
+
+function startGuest() {
+    let api_type = type === 'kvm' ? 'qemu' : 'lxc';
+    API2Request({
+       method: 'POST',
+       url: `/nodes/${nodename}/${api_type}/${vmid}/status/start`,
+       success: function(result) {
+           showMsg('Guest started successfully', 0);
+           setTimeout(function() {
+               location.reload();
+           }, 1000);
+       },
+       failure: function(msg) {
+           if (msg.match(/already running/)) {
+               showMsg('Guest started successfully', 0);
+               setTimeout(function() {
+                   location.reload();
+               }, 1000);
+           } else {
+               updateState(states.disconnected,msg);
+           }
+       }
+    });
+}
+
+function createTerminal() {
+    term = new Terminal(getTerminalSettings());
+    term.open(terminalContainer);
+    term.loadAddon(fitAddon);
+    try {
+       term.loadAddon(webglAddon);
+    } catch (_e) {
+       console.warn("webgl-addon loading failed, falling back to regular dom renderer");
+    }
+
+    term.onResize(function (size) {
+       if (state === states.connected) {
+           socket.send("1:" + size.cols + ":" + size.rows + ":");
+       }
+    });
+
+    protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://';
+
+    var params = {};
+    var url = '/nodes/' + nodename;
+    switch (type) {
+       case 'kvm':
+           url += '/qemu/' + vmid;
+           break;
+       case 'lxc':
+           url += '/lxc/' + vmid;
+           break;
+       case 'upgrade':
+           params.cmd = 'upgrade';
+           break;
+       case 'cmd':
+           params.cmd = decodeURI(cmd);
+           if (cmdOpts !== undefined && cmdOpts !== null && cmdOpts !== "") {
+               params['cmd-opts'] = decodeURI(cmdOpts);
+           }
+           break;
+    }
+    if (type === 'kvm' || type === 'lxc') {
+       API2Request({
+           method: 'GET',
+           url: `${url}/status/current`,
+           success: function(result) {
+               if (result.data.status === 'running') {
+                   startConnection(url, params, term);
+               } else {
+                   document.getElementById('connect_dlg').classList.add('pve_open');
+               }
+           },
+           failure: function(msg) {
+               updateState(states.disconnected, msg);
+           },
+       });
+    } else {
+       startConnection(url, params, term);
+    }
+}
+
+function runTerminal() {
+    socket.onmessage = function(event) {
+       var answer = new Uint8Array(event.data);
+       if (state === states.connected) {
+           term.write(answer);
+       } else if(state === states.connecting) {
+           if (answer[0] === 79 && answer[1] === 75) { // "OK"
+               updateState(states.connected);
+               term.write(answer.slice(2));
+           } else {
+               socket.close();
+           }
+       }
+    };
+
+    term.onData(function(data) {
+       if (state === states.connected) {
+           socket.send("0:" + unescape(encodeURIComponent(data)).length.toString() + ":" +  data);
+       }
+    });
+
+    ping = setInterval(function() {
+       socket.send("2");
+    }, 30*1000);
+
+    window.addEventListener('resize', function() {
+       clearTimeout(resize);
+       resize = setTimeout(function() {
+           // done resizing
+           fitAddon.fit();
+       }, 250);
+    });
+
+    socket.send(PVE.UserName + ':' + ticket + "\n");
+
+    // initial focus and resize
+    setTimeout(function() {
+       term.focus();
+       fitAddon.fit();
+    }, 250);
+}
+
+function getLxcStatus(callback) {
+    API2Request({
+       method: 'GET',
+       url: '/nodes/' + nodename + '/lxc/' + vmid + '/status/current',
+       success: function(result) {
+           if (typeof callback === 'function') {
+               callback(true, result);
+           }
+       },
+       failure: function(msg) {
+           if (typeof callback === 'function') {
+               callback(false, msg);
+           }
+       }
+    });
+}
+
+function checkMigration() {
+    var apitype = type;
+    if (apitype === 'kvm') {
+       apitype = 'qemu';
+    }
+    API2Request({
+       method: 'GET',
+       params: {
+           type: 'vm'
+       },
+       url: '/cluster/resources',
+       success: function(result) {
+           // if not yet migrated , wait and try again
+           // if not migrating and stopped, cancel
+           // if started, connect
+           result.data.forEach(function(entity) {
+               if (entity.id === (apitype + '/' + vmid)) {
+                   var started = entity.status === 'running';
+                   var migrated = entity.node !== nodename;
+                   if (migrated) {
+                       if (started) {
+                           // goto different node
+                           location.href = '?console=' + type +
+                               '&xtermjs=1&vmid=' + vmid + '&vmname=' +
+                               vmname + '&node=' + entity.node;
+                       } else {
+                           // wait again
+                           updateState(states.reconnecting, 'waiting for migration to finish...');
+                           setTimeout(checkMigration, 5000);
+                       }
+                   } else {
+                       if (type === 'lxc') {
+                           // we have to check the status of the
+                           // container to know if it has the
+                           // migration lock
+                           getLxcStatus(function(success, result) {
+                               if (success) {
+                                   if (result.data.lock === 'migrate') {
+                                       // still waiting
+                                       updateState(states.reconnecting, 'waiting for migration to finish...');
+                                       setTimeout(checkMigration, 5000);
+                                   } else if (started) {
+                                       // container was rebooted
+                                       location.reload();
+                                   } else {
+                                       stopTerminal();
+                                   }
+                               } else {
+                                   // probably the status call failed because
+                                   // the ct is already somewhere else, so retry
+                                   setTimeout(checkMigration, 1000);
+                               }
+                           });
+                       } else if (started) {
+                           // this happens if we have old data in
+                           // /cluster/resources, or the connection
+                           // disconnected, so simply try to reload here
+                           location.reload();
+                       } else if (type === 'kvm') {
+                           // it seems the guest simply stopped
+                           stopTerminal();
+                       }
+                   }
+
+                   return;
+               }
+           });
+       },
+       failure: function(msg) {
+           errorTerminal({msg: msg});
+       }
+    });
+}
+
+function tryReconnect(event) {
+    var time_since_started = new Date() - starttime;
+    var type = getQueryParameter('console');
+    if (time_since_started < 5*1000 || type === 'shell' || type === 'cmd') { // 5 seconds
+       stopTerminal(event);
+       return;
+    }
+
+    updateState(states.disconnecting, 'Detecting migration...');
+    setTimeout(checkMigration, 5000);
+}
+
+function clearEvents() {
+    term.onResize(() => {});
+    term.onData(() => {});
+}
+
+function windowUnload(e) {
+    let message = "Are you sure you want to leave this page?";
+
+    e = e || window.event;
+    if (e) {
+       e.returnValue = message;
+    }
+
+    return message;
+}
+
+function stopTerminal(event) {
+    event = event || {};
+    clearEvents();
+    clearInterval(ping);
+    socket.close();
+    updateState(states.disconnected, event.reason, event.code);
+}
+
+function errorTerminal(event) {
+    event = event || {};
+    clearEvents();
+    clearInterval(ping);
+    socket.close();
+    term.dispose();
+    updateState(states.disconnected, event.msg, event.code);
+}
diff --git a/xterm.js/src/style.css b/xterm.js/src/style.css
new file mode 100644 (file)
index 0000000..04db7d5
--- /dev/null
@@ -0,0 +1,144 @@
+html,body {
+    height: 100%;
+    min-height: 100%;
+    margin: 0;
+    padding: 0;
+    overflow: hidden;
+    font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace;
+    background-color: #101010;
+}
+
+.terminal {
+    background-color: #101010;
+    color: #f0f0f0;
+    font-size: 10pt;
+    font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace;
+    font-variant-ligatures: none;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+}
+
+.terminal .xterm-viewport {
+    background-color: rgba(121, 121, 121, 0);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    transition: background-color 800ms linear;
+}
+
+/* fix line height on firefox */
+.xterm-rows > div > span {
+    display: inline-block;
+}
+
+#terminal-container {
+    height: 100%;
+    width: auto;
+}
+
+#wrap {
+    height: 100%;
+    width: auto;
+    box-sizing: border-box;
+    padding: 5px;
+}
+
+#status_bar {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 500;
+  transform: translateY(-100%);
+
+  transition: 0.25s ease-in-out;
+
+  visibility: hidden;
+  opacity: 0;
+
+  padding: 5px;
+
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-content: center;
+
+  line-height: 25px;
+  color: #fff;
+
+  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
+}
+
+#status_bar.open {
+  transform: translateY(0);
+  visibility: visible;
+  opacity: 1;
+}
+
+#status_bar.normal {
+  background: rgba(128,128,128,0.9);
+}
+#status_bar.error {
+  background: rgba(200,55,55,0.9);
+}
+#status_bar.warning {
+  background: rgba(180,180,30,0.9);
+}
+
+#pve_start_info {
+    color: white;
+    text-align: center;
+    font-size: 20px;
+    padding: 6px;
+}
+
+#connect_dlg {
+  transition: 0.2s ease-in-out;
+
+  transform: scale(0, 0);
+  visibility: hidden;
+  opacity: 0;
+  font-family: Helvetica;
+}
+
+#connect_dlg.pve_open {
+  transform: scale(1, 1);
+  visibility: visible;
+  opacity: 1;
+}
+
+#connect_btn {
+  cursor: pointer;
+  padding: 6px;
+  color: white;
+  background:#4c4c4c;;
+  border-radius: 8px;
+  text-align: center;
+  font-size: 20px;
+  box-shadow: 4px 4px 0px rgba(0, 0, 0, 0.5);
+}
+#connect_btn div {
+  margin: 2px;
+  padding: 5px 30px;
+  border: 1px solid #2f2f2f;
+  border-bottom-width: 2px;
+  border-radius: 5px;
+  background:#4c4c4c;;
+
+  /* This avoids it jumping around when :active */
+  vertical-align: middle;
+}
+#connect_btn div:active {
+  border-bottom-width: 1px;
+  margin-top: 3px;
+}
+
+div.center {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
diff --git a/xterm.js/src/util.js b/xterm.js/src/util.js
new file mode 100644 (file)
index 0000000..52cad21
--- /dev/null
@@ -0,0 +1,144 @@
+function urlEncode(object) {
+    var i,value, params = [];
+
+    for (i in object) {
+       if (object.hasOwnProperty(i)) {
+           value = object[i];
+           if (value === undefined) value = '';
+           params.push(encodeURIComponent(i) + '=' + encodeURIComponent(String(value)));
+       }
+    }
+
+    return params.join('&');
+}
+
+var msgtimeout;
+var severities = {
+    normal:  1,
+    warning: 2,
+    error:   3,
+};
+
+function showMsg(message, timeout, severity) {
+    var status_bar = document.getElementById('status_bar');
+    clearTimeout(msgtimeout);
+
+    status_bar.classList.remove('normal');
+    status_bar.classList.remove('warning');
+    status_bar.classList.remove('error');
+
+    status_bar.textContent = message;
+
+    severity = severity || severities.normal;
+
+    switch (severity) {
+       case severities.normal: 
+           status_bar.classList.add('normal');
+           break;
+       case severities.warning: 
+           status_bar.classList.add('warning');
+           break;
+       case severities.error: 
+           status_bar.classList.add('error');
+           break;
+       default:
+           throw "unknown severity";
+    }
+
+    status_bar.classList.add('open');
+
+    if (timeout !== 0) {
+       msgtimeout = setTimeout(hideMsg, timeout || 1500);
+    }
+}
+
+function hideMsg() {
+    clearTimeout(msgtimeout);
+    status_bar.classList.remove('open');
+}
+
+function getQueryParameter(name) {
+    var params = location.search.slice(1).split('&');
+    var result = "";
+    params.forEach(function(param) {
+       var components = param.split('=');
+       if (components[0] === name) {
+           result = components.slice(1).join('=');
+       }
+    });
+    return result;
+}
+
+function API2Request(reqOpts) {
+    var me = this;
+
+    reqOpts.method = reqOpts.method || 'GET';
+
+    var xhr = new XMLHttpRequest();
+
+    xhr.onload = function() {
+       var scope = reqOpts.scope || this;
+       var result;
+       var errmsg;
+
+       if (xhr.readyState === 4) {
+           var ctype = xhr.getResponseHeader('Content-Type');
+           if (xhr.status === 200) {
+               if (ctype.match(/application\/json;/)) {
+                   result = JSON.parse(xhr.responseText);
+               } else {
+                   errmsg = 'got unexpected content type ' + ctype;
+               }
+           } else {
+               errmsg = 'Error ' + xhr.status + ': ' + xhr.statusText;
+           }
+       } else {
+           errmsg = 'Connection error - server offline?';
+       }
+
+       if (errmsg !== undefined) {
+           if (reqOpts.failure) {
+               reqOpts.failure.call(scope, errmsg);
+           }
+       } else {
+           if (reqOpts.success) {
+               reqOpts.success.call(scope, result);
+           }
+       }
+       if (reqOpts.callback) {
+           reqOpts.callback.call(scope, errmsg === undefined);
+       }
+    }
+
+    var data = urlEncode(reqOpts.params || {});
+
+    if (reqOpts.method === 'GET') {
+       xhr.open(reqOpts.method, "/api2/json" + reqOpts.url + '?' + data);
+    } else {
+       xhr.open(reqOpts.method, "/api2/json" + reqOpts.url);
+    }
+    xhr.setRequestHeader('Cache-Control', 'no-cache');
+    if (reqOpts.method === 'POST' || reqOpts.method === 'PUT') {
+       xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+       xhr.setRequestHeader('CSRFPreventionToken', PVE.CSRFPreventionToken);
+       xhr.send(data);
+    } else if (reqOpts.method === 'GET') {
+       xhr.send();
+    } else {
+       throw "unknown method";
+    }
+}
+
+function getTerminalSettings() {
+    var res = {};
+    var settings = ['fontSize', 'fontFamily', 'letterSpacing', 'lineHeight'];
+    if(localStorage) {
+       settings.forEach(function(setting) {
+           var val = localStorage.getItem('pve-xterm-' + setting);
+           if (val !== undefined && val !== null) {
+               res[setting] = val;
+           }
+       });
+    }
+    return res;
+}
diff --git a/xterm.js/src/xterm-addon-fit.js b/xterm.js/src/xterm-addon-fit.js
new file mode 100644 (file)
index 0000000..7cfd9de
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})()));
+//# sourceMappingURL=xterm-addon-fit.js.map
\ No newline at end of file
diff --git a/xterm.js/src/xterm-addon-fit.js.map b/xterm.js/src/xterm-addon-fit.js.map
new file mode 100644 (file)
index 0000000..33a9297
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"xterm-addon-fit.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAkB,SAAID,IAEtBD,EAAe,SAAIC,GACpB,CATD,CASGK,MAAM,I,mHCcT,iBAGS,QAAAC,CAASC,GACdC,KAAKC,UAAYF,CACnB,CAEO,OAAAG,GAAiB,CAEjB,GAAAC,GACL,MAAMC,EAAOJ,KAAKK,oBAClB,IAAKD,IAASJ,KAAKC,WAAaK,MAAMF,EAAKG,OAASD,MAAMF,EAAKI,MAC7D,OAIF,MAAMC,EAAQT,KAAKC,UAAkBS,MAGjCV,KAAKC,UAAUO,OAASJ,EAAKI,MAAQR,KAAKC,UAAUM,OAASH,EAAKG,OACpEE,EAAKE,eAAeC,QACpBZ,KAAKC,UAAUY,OAAOT,EAAKG,KAAMH,EAAKI,MAE1C,CAEO,iBAAAH,GACL,IAAKL,KAAKC,UACR,OAGF,IAAKD,KAAKC,UAAUa,UAAYd,KAAKC,UAAUa,QAAQC,cACrD,OAIF,MAAMN,EAAQT,KAAKC,UAAkBS,MAC/BN,EAA0BK,EAAKE,eAAeK,WAEpD,GAA4B,IAAxBZ,EAAKa,IAAIC,KAAKC,OAAwC,IAAzBf,EAAKa,IAAIC,KAAKE,OAC7C,OAGF,MAAMC,EAAuD,IAAtCrB,KAAKC,UAAUqB,QAAQC,WAC5C,EAAId,EAAKe,SAASC,eAEdC,EAAqBC,OAAOC,iBAAiB5B,KAAKC,UAAUa,QAAQC,eACpEc,EAAsBC,SAASJ,EAAmBK,iBAAiB,WACnEC,EAAqBC,KAAKC,IAAI,EAAGJ,SAASJ,EAAmBK,iBAAiB,WAC9EI,EAAeR,OAAOC,iBAAiB5B,KAAKC,UAAUa,SAStDsB,EAAkBP,GAPjBC,SAASK,EAAaJ,iBAAiB,gBACpCD,SAASK,EAAaJ,iBAAiB,oBAO3CM,EAAiBL,GANdF,SAASK,EAAaJ,iBAAiB,kBACxCD,SAASK,EAAaJ,iBAAiB,kBAKiBV,EAKhE,MAJiB,CACfd,KAAM0B,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMD,EAAiBjC,EAAKa,IAAIC,KAAKC,QACvEX,KAAMyB,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMF,EAAkBhC,EAAKa,IAAIC,KAAKE,SAG5E,E","sources":["webpack://FitAddon/webpack/universalModuleDefinition","webpack://FitAddon/./src/FitAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FitAddon\"] = factory();\n\telse\n\t\troot[\"FitAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal, ITerminalAddon } from 'xterm';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\n\ninterface ITerminalDimensions {\n  /**\n   * The number of rows in the terminal.\n   */\n  rows: number;\n\n  /**\n   * The number of columns in the terminal.\n   */\n  cols: number;\n}\n\nconst MINIMUM_COLS = 2;\nconst MINIMUM_ROWS = 1;\n\nexport class FitAddon implements ITerminalAddon {\n  private _terminal: Terminal | undefined;\n\n  public activate(terminal: Terminal): void {\n    this._terminal = terminal;\n  }\n\n  public dispose(): void {}\n\n  public fit(): void {\n    const dims = this.proposeDimensions();\n    if (!dims || !this._terminal || isNaN(dims.cols) || isNaN(dims.rows)) {\n      return;\n    }\n\n    // TODO: Remove reliance on private API\n    const core = (this._terminal as any)._core;\n\n    // Force a full render\n    if (this._terminal.rows !== dims.rows || this._terminal.cols !== dims.cols) {\n      core._renderService.clear();\n      this._terminal.resize(dims.cols, dims.rows);\n    }\n  }\n\n  public proposeDimensions(): ITerminalDimensions | undefined {\n    if (!this._terminal) {\n      return undefined;\n    }\n\n    if (!this._terminal.element || !this._terminal.element.parentElement) {\n      return undefined;\n    }\n\n    // TODO: Remove reliance on private API\n    const core = (this._terminal as any)._core;\n    const dims: IRenderDimensions = core._renderService.dimensions;\n\n    if (dims.css.cell.width === 0 || dims.css.cell.height === 0) {\n      return undefined;\n    }\n\n    const scrollbarWidth = this._terminal.options.scrollback === 0 ?\n      0 : core.viewport.scrollBarWidth;\n\n    const parentElementStyle = window.getComputedStyle(this._terminal.element.parentElement);\n    const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));\n    const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));\n    const elementStyle = window.getComputedStyle(this._terminal.element);\n    const elementPadding = {\n      top: parseInt(elementStyle.getPropertyValue('padding-top')),\n      bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),\n      right: parseInt(elementStyle.getPropertyValue('padding-right')),\n      left: parseInt(elementStyle.getPropertyValue('padding-left'))\n    };\n    const elementPaddingVer = elementPadding.top + elementPadding.bottom;\n    const elementPaddingHor = elementPadding.right + elementPadding.left;\n    const availableHeight = parentElementHeight - elementPaddingVer;\n    const availableWidth = parentElementWidth - elementPaddingHor - scrollbarWidth;\n    const geometry = {\n      cols: Math.max(MINIMUM_COLS, Math.floor(availableWidth / dims.css.cell.width)),\n      rows: Math.max(MINIMUM_ROWS, Math.floor(availableHeight / dims.css.cell.height))\n    };\n    return geometry;\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","self","activate","terminal","this","_terminal","dispose","fit","dims","proposeDimensions","isNaN","cols","rows","core","_core","_renderService","clear","resize","element","parentElement","dimensions","css","cell","width","height","scrollbarWidth","options","scrollback","viewport","scrollBarWidth","parentElementStyle","window","getComputedStyle","parentElementHeight","parseInt","getPropertyValue","parentElementWidth","Math","max","elementStyle","availableHeight","availableWidth","floor"],"sourceRoot":""}
\ No newline at end of file
diff --git a/xterm.js/src/xterm-addon-webgl.js b/xterm.js/src/xterm-addon-webgl.js
new file mode 100644 (file)
index 0000000..d020f0d
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.WebglAddon=t():e.WebglAddon=t()}(self,(()=>(()=>{"use strict";var e={965:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.GlyphRenderer=void 0;const r=i(374),o=i(509),n=i(855),a=i(859),h=i(776),l=i(381),c=11,d=c*Float32Array.BYTES_PER_ELEMENT;let _,u=0,g=0,v=0;class f extends a.Disposable{constructor(e,t,i){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._activeBuffer=0,this._vertices={count:0,attributes:new Float32Array(0),attributesBuffers:[new Float32Array(0),new Float32Array(0)]};const s=this._gl;void 0===o.TextureAtlas.maxAtlasPages&&(o.TextureAtlas.maxAtlasPages=Math.min(32,(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS))),o.TextureAtlas.maxTextureSize=(0,r.throwIfFalsy)(s.getParameter(s.MAX_TEXTURE_SIZE))),this._program=(0,r.throwIfFalsy)((0,l.createProgram)(s,"#version 300 es\nlayout (location = 0) in vec2 a_unitquad;\nlayout (location = 1) in vec2 a_cellpos;\nlayout (location = 2) in vec2 a_offset;\nlayout (location = 3) in vec2 a_size;\nlayout (location = 4) in float a_texpage;\nlayout (location = 5) in vec2 a_texcoord;\nlayout (location = 6) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}",function(e){let t="";for(let i=1;i<e;i++)t+=` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;return`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${e}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${t}\n}`}(o.TextureAtlas.maxAtlasPages))),this.register((0,a.toDisposable)((()=>s.deleteProgram(this._program)))),this._projectionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_projection")),this._resolutionLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_resolution")),this._textureLocation=(0,r.throwIfFalsy)(s.getUniformLocation(this._program,"u_texture")),this._vertexArrayObject=s.createVertexArray(),s.bindVertexArray(this._vertexArrayObject);const n=new Float32Array([0,0,1,0,0,1,1,1]),h=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(h)))),s.bindBuffer(s.ARRAY_BUFFER,h),s.bufferData(s.ARRAY_BUFFER,n,s.STATIC_DRAW),s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,this._gl.FLOAT,!1,0,0);const c=new Uint8Array([0,1,2,3]),_=s.createBuffer();this.register((0,a.toDisposable)((()=>s.deleteBuffer(_)))),s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,_),s.bufferData(s.ELEMENT_ARRAY_BUFFER,c,s.STATIC_DRAW),this._attributesBuffer=(0,r.throwIfFalsy)(s.createBuffer()),this.register((0,a.toDisposable)((()=>s.deleteBuffer(this._attributesBuffer)))),s.bindBuffer(s.ARRAY_BUFFER,this._attributesBuffer),s.enableVertexAttribArray(2),s.vertexAttribPointer(2,2,s.FLOAT,!1,d,0),s.vertexAttribDivisor(2,1),s.enableVertexAttribArray(3),s.vertexAttribPointer(3,2,s.FLOAT,!1,d,2*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(3,1),s.enableVertexAttribArray(4),s.vertexAttribPointer(4,1,s.FLOAT,!1,d,4*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(4,1),s.enableVertexAttribArray(5),s.vertexAttribPointer(5,2,s.FLOAT,!1,d,5*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(5,1),s.enableVertexAttribArray(6),s.vertexAttribPointer(6,2,s.FLOAT,!1,d,7*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(6,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,2,s.FLOAT,!1,d,9*Float32Array.BYTES_PER_ELEMENT),s.vertexAttribDivisor(1,1),s.useProgram(this._program);const u=new Int32Array(o.TextureAtlas.maxAtlasPages);for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++)u[e]=e;s.uniform1iv(this._textureLocation,u),s.uniformMatrix4fv(this._projectionLocation,!1,l.PROJECTION_MATRIX),this._atlasTextures=[];for(let e=0;e<o.TextureAtlas.maxAtlasPages;e++){const t=new l.GLTexture((0,r.throwIfFalsy)(s.createTexture()));this.register((0,a.toDisposable)((()=>s.deleteTexture(t.texture)))),s.activeTexture(s.TEXTURE0+e),s.bindTexture(s.TEXTURE_2D,t.texture),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_S,s.CLAMP_TO_EDGE),s.texParameteri(s.TEXTURE_2D,s.TEXTURE_WRAP_T,s.CLAMP_TO_EDGE),s.texImage2D(s.TEXTURE_2D,0,s.RGBA,1,1,0,s.RGBA,s.UNSIGNED_BYTE,new Uint8Array([255,0,0,255])),this._atlasTextures[e]=t}s.enable(s.BLEND),s.blendFunc(s.SRC_ALPHA,s.ONE_MINUS_SRC_ALPHA),this.handleResize()}beginFrame(){return!this._atlas||this._atlas.beginFrame()}updateCell(e,t,i,s,r,o,n,a){this._updateCell(this._vertices.attributes,e,t,i,s,r,o,n,a)}_updateCell(e,t,i,s,r,o,a,h,l){u=(i*this._terminal.cols+t)*c,s!==n.NULL_CELL_CODE&&void 0!==s?this._atlas&&(_=h&&h.length>1?this._atlas.getRasterizedGlyphCombinedChar(h,r,o,a,!1):this._atlas.getRasterizedGlyph(s,r,o,a,!1),g=Math.floor((this._dimensions.device.cell.width-this._dimensions.device.char.width)/2),r!==l&&_.offset.x>g?(v=_.offset.x-g,e[u]=-(_.offset.x-v)+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=(_.size.x-v)/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x+v/this._atlas.pages[_.texturePage].canvas.width,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x-v/this._atlas.pages[_.texturePage].canvas.width,e[u+8]=_.sizeClipSpace.y):(e[u]=-_.offset.x+this._dimensions.device.char.left,e[u+1]=-_.offset.y+this._dimensions.device.char.top,e[u+2]=_.size.x/this._dimensions.device.canvas.width,e[u+3]=_.size.y/this._dimensions.device.canvas.height,e[u+4]=_.texturePage,e[u+5]=_.texturePositionClipSpace.x,e[u+6]=_.texturePositionClipSpace.y,e[u+7]=_.sizeClipSpace.x,e[u+8]=_.sizeClipSpace.y)):e.fill(0,u,u+c-1-2)}clear(){const e=this._terminal,t=e.cols*e.rows*c;this._vertices.count!==t?this._vertices.attributes=new Float32Array(t):this._vertices.attributes.fill(0);let i=0;for(;i<this._vertices.attributesBuffers.length;i++)this._vertices.count!==t?this._vertices.attributesBuffers[i]=new Float32Array(t):this._vertices.attributesBuffers[i].fill(0);this._vertices.count=t,i=0;for(let t=0;t<e.rows;t++)for(let s=0;s<e.cols;s++)this._vertices.attributes[i+9]=s/e.cols,this._vertices.attributes[i+10]=t/e.rows,i+=c}handleResize(){const e=this._gl;e.useProgram(this._program),e.viewport(0,0,e.canvas.width,e.canvas.height),e.uniform2f(this._resolutionLocation,e.canvas.width,e.canvas.height),this.clear()}render(e){if(!this._atlas)return;const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),this._activeBuffer=(this._activeBuffer+1)%2;const i=this._vertices.attributesBuffers[this._activeBuffer];let s=0;for(let t=0;t<e.lineLengths.length;t++){const r=t*this._terminal.cols*c,o=this._vertices.attributes.subarray(r,r+e.lineLengths[t]*c);i.set(o,s),s+=o.length}t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,i.subarray(0,s),t.STREAM_DRAW);for(let e=0;e<this._atlas.pages.length;e++)this._atlas.pages[e].version!==this._atlasTextures[e].version&&this._bindAtlasPageTexture(t,this._atlas,e);t.drawElementsInstanced(t.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,s/c)}setAtlas(e){this._atlas=e;for(const e of this._atlasTextures)e.version=-1}_bindAtlasPageTexture(e,t,i){e.activeTexture(e.TEXTURE0+i),e.bindTexture(e.TEXTURE_2D,this._atlasTextures[i].texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.pages[i].canvas),e.generateMipmap(e.TEXTURE_2D),this._atlasTextures[i].version=t.pages[i].version}setDimensions(e){this._dimensions=e}}t.GlyphRenderer=f,s([h.traceCall],f.prototype,"updateCell",null)},742:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RectangleRenderer=void 0;const s=i(374),r=i(859),o=i(310),n=i(381),a=8*Float32Array.BYTES_PER_ELEMENT;class h{constructor(){this.attributes=new Float32Array(160),this.count=0}}let l=0,c=0,d=0,_=0,u=0,g=0,v=0;class f extends r.Disposable{constructor(e,t,i,o){super(),this._terminal=e,this._gl=t,this._dimensions=i,this._themeService=o,this._vertices=new h,this._verticesCursor=new h;const l=this._gl;this._program=(0,s.throwIfFalsy)((0,n.createProgram)(l,"#version 300 es\nlayout (location = 0) in vec2 a_position;\nlayout (location = 1) in vec2 a_size;\nlayout (location = 2) in vec4 a_color;\nlayout (location = 3) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}","#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}")),this.register((0,r.toDisposable)((()=>l.deleteProgram(this._program)))),this._projectionLocation=(0,s.throwIfFalsy)(l.getUniformLocation(this._program,"u_projection")),this._vertexArrayObject=l.createVertexArray(),l.bindVertexArray(this._vertexArrayObject);const c=new Float32Array([0,0,1,0,0,1,1,1]),d=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(d)))),l.bindBuffer(l.ARRAY_BUFFER,d),l.bufferData(l.ARRAY_BUFFER,c,l.STATIC_DRAW),l.enableVertexAttribArray(3),l.vertexAttribPointer(3,2,this._gl.FLOAT,!1,0,0);const _=new Uint8Array([0,1,2,3]),u=l.createBuffer();this.register((0,r.toDisposable)((()=>l.deleteBuffer(u)))),l.bindBuffer(l.ELEMENT_ARRAY_BUFFER,u),l.bufferData(l.ELEMENT_ARRAY_BUFFER,_,l.STATIC_DRAW),this._attributesBuffer=(0,s.throwIfFalsy)(l.createBuffer()),this.register((0,r.toDisposable)((()=>l.deleteBuffer(this._attributesBuffer)))),l.bindBuffer(l.ARRAY_BUFFER,this._attributesBuffer),l.enableVertexAttribArray(0),l.vertexAttribPointer(0,2,l.FLOAT,!1,a,0),l.vertexAttribDivisor(0,1),l.enableVertexAttribArray(1),l.vertexAttribPointer(1,2,l.FLOAT,!1,a,2*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(1,1),l.enableVertexAttribArray(2),l.vertexAttribPointer(2,4,l.FLOAT,!1,a,4*Float32Array.BYTES_PER_ELEMENT),l.vertexAttribDivisor(2,1),this._updateCachedColors(o.colors),this.register(this._themeService.onChangeColors((e=>{this._updateCachedColors(e),this._updateViewportRectangle()})))}renderBackgrounds(){this._renderVertices(this._vertices)}renderCursor(){this._renderVertices(this._verticesCursor)}_renderVertices(e){const t=this._gl;t.useProgram(this._program),t.bindVertexArray(this._vertexArrayObject),t.uniformMatrix4fv(this._projectionLocation,!1,n.PROJECTION_MATRIX),t.bindBuffer(t.ARRAY_BUFFER,this._attributesBuffer),t.bufferData(t.ARRAY_BUFFER,e.attributes,t.DYNAMIC_DRAW),t.drawElementsInstanced(this._gl.TRIANGLE_STRIP,4,t.UNSIGNED_BYTE,0,e.count)}handleResize(){this._updateViewportRectangle()}setDimensions(e){this._dimensions=e}_updateCachedColors(e){this._bgFloat=this._colorToFloat32Array(e.background),this._cursorFloat=this._colorToFloat32Array(e.cursor)}_updateViewportRectangle(){this._addRectangleFloat(this._vertices.attributes,0,0,0,this._terminal.cols*this._dimensions.device.cell.width,this._terminal.rows*this._dimensions.device.cell.height,this._bgFloat)}updateBackgrounds(e){const t=this._terminal,i=this._vertices;let s,r,n,a,h,l,c,d,_,u,g,v=1;for(s=0;s<t.rows;s++){for(n=-1,a=0,h=0,l=!1,r=0;r<t.cols;r++)c=(s*t.cols+r)*o.RENDER_MODEL_INDICIES_PER_CELL,d=e.cells[c+o.RENDER_MODEL_BG_OFFSET],_=e.cells[c+o.RENDER_MODEL_FG_OFFSET],u=!!(67108864&_),(d!==a||_!==h&&(l||u))&&((0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,r,s)),n=r,a=d,h=_,l=u);(0!==a||l&&0!==h)&&(g=8*v++,this._updateRectangle(i,g,h,a,n,t.cols,s))}i.count=v}updateCursor(e){const t=this._verticesCursor,i=e.cursor;if(!i||"block"===i.style)return void(t.count=0);let s,r=0;"bar"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,"bar"===i.style?i.dpr*i.cursorWidth:i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),"underline"!==i.style&&"outline"!==i.style||(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,(i.y+1)*this._dimensions.device.cell.height-i.dpr,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat)),"outline"===i.style&&(s=8*r++,this._addRectangleFloat(t.attributes,s,i.x*this._dimensions.device.cell.width,i.y*this._dimensions.device.cell.height,i.width*this._dimensions.device.cell.width,i.dpr,this._cursorFloat),s=8*r++,this._addRectangleFloat(t.attributes,s,(i.x+i.width)*this._dimensions.device.cell.width-i.dpr,i.y*this._dimensions.device.cell.height,i.dpr,this._dimensions.device.cell.height,this._cursorFloat)),t.count=r}_updateRectangle(e,t,i,s,r,o,a){if(67108864&i)switch(50331648&i){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&i].rgba;break;case 50331648:l=(16777215&i)<<8;break;default:l=this._themeService.colors.foreground.rgba}else switch(50331648&s){case 16777216:case 33554432:l=this._themeService.colors.ansi[255&s].rgba;break;case 50331648:l=(16777215&s)<<8;break;default:l=this._themeService.colors.background.rgba}e.attributes.length<t+4&&(e.attributes=(0,n.expandFloat32Array)(e.attributes,this._terminal.rows*this._terminal.cols*8)),c=r*this._dimensions.device.cell.width,d=a*this._dimensions.device.cell.height,_=(l>>24&255)/255,u=(l>>16&255)/255,g=(l>>8&255)/255,v=1,this._addRectangle(e.attributes,t,c,d,(o-r)*this._dimensions.device.cell.width,this._dimensions.device.cell.height,_,u,g,v)}_addRectangle(e,t,i,s,r,o,n,a,h,l){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n,e[t+5]=a,e[t+6]=h,e[t+7]=l}_addRectangleFloat(e,t,i,s,r,o,n){e[t]=i/this._dimensions.device.canvas.width,e[t+1]=s/this._dimensions.device.canvas.height,e[t+2]=r/this._dimensions.device.canvas.width,e[t+3]=o/this._dimensions.device.canvas.height,e[t+4]=n[0],e[t+5]=n[1],e[t+6]=n[2],e[t+7]=n[3]}_colorToFloat32Array(e){return new Float32Array([(e.rgba>>24&255)/255,(e.rgba>>16&255)/255,(e.rgba>>8&255)/255,(255&e.rgba)/255])}}t.RectangleRenderer=f},310:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderModel=t.COMBINED_CHAR_BIT_MASK=t.RENDER_MODEL_EXT_OFFSET=t.RENDER_MODEL_FG_OFFSET=t.RENDER_MODEL_BG_OFFSET=t.RENDER_MODEL_INDICIES_PER_CELL=void 0;const s=i(296);t.RENDER_MODEL_INDICIES_PER_CELL=4,t.RENDER_MODEL_BG_OFFSET=1,t.RENDER_MODEL_FG_OFFSET=2,t.RENDER_MODEL_EXT_OFFSET=3,t.COMBINED_CHAR_BIT_MASK=2147483648,t.RenderModel=class{constructor(){this.cells=new Uint32Array(0),this.lineLengths=new Uint32Array(0),this.selection=(0,s.createSelectionRenderModel)()}resize(e,i){const s=e*i*t.RENDER_MODEL_INDICIES_PER_CELL;s!==this.cells.length&&(this.cells=new Uint32Array(s),this.lineLengths=new Uint32Array(i))}clear(){this.cells.fill(0,0),this.lineLengths.fill(0,0)}}},666:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.JoinedCellData=t.WebglRenderer=void 0;const r=i(820),o=i(274),n=i(627),a=i(457),h=i(56),l=i(374),c=i(345),d=i(859),_=i(147),u=i(782),g=i(855),v=i(776),f=i(965),p=i(742),C=i(310),m=i(733);class L extends d.Disposable{constructor(e,t,i,s,a,_,g,v,f){super(),this._terminal=e,this._characterJoinerService=t,this._charSizeService=i,this._coreBrowserService=s,this._coreService=a,this._decorationService=_,this._optionsService=g,this._themeService=v,this._cursorBlinkStateManager=new d.MutableDisposable,this._charAtlasDisposable=this.register(new d.MutableDisposable),this._model=new C.RenderModel,this._workCell=new u.CellData,this._rectangleRenderer=this.register(new d.MutableDisposable),this._glyphRenderer=this.register(new d.MutableDisposable),this._onChangeTextureAtlas=this.register(new c.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new c.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new c.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onRequestRedraw=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRequestRedraw.event,this._onContextLoss=this.register(new c.EventEmitter),this.onContextLoss=this._onContextLoss.event,this.register(this._themeService.onChangeColors((()=>this._handleColorChange()))),this._cellColorResolver=new o.CellColorResolver(this._terminal,this._model.selection,this._decorationService,this._coreBrowserService,this._themeService),this._core=this._terminal._core,this._renderLayers=[new m.LinkRenderLayer(this._core.screenElement,2,this._terminal,this._core.linkifier2,this._coreBrowserService,g,this._themeService)],this.dimensions=(0,l.createRenderDimensions)(),this._devicePixelRatio=this._coreBrowserService.dpr,this._updateDimensions(),this._updateCursorBlink(),this.register(g.onOptionChange((()=>this._handleOptionsChanged()))),this._canvas=document.createElement("canvas");const p={antialias:!1,depth:!1,preserveDrawingBuffer:f};if(this._gl=this._canvas.getContext("webgl2",p),!this._gl)throw new Error("WebGL2 not supported "+this._gl);this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextlost",(e=>{console.log("webglcontextlost event received"),e.preventDefault(),this._contextRestorationTimeout=setTimeout((()=>{this._contextRestorationTimeout=void 0,console.warn("webgl context not restored; firing onContextLoss"),this._onContextLoss.fire(e)}),3e3)}))),this.register((0,r.addDisposableDomListener)(this._canvas,"webglcontextrestored",(e=>{console.warn("webglcontextrestored event received"),clearTimeout(this._contextRestorationTimeout),this._contextRestorationTimeout=void 0,(0,n.removeTerminalFromCache)(this._terminal),this._initializeWebGLState(),this._requestRedrawViewport()}))),this.register((0,h.observeDevicePixelDimensions)(this._canvas,this._coreBrowserService.window,((e,t)=>this._setCanvasDevicePixelDimensions(e,t)))),this._core.screenElement.appendChild(this._canvas),[this._rectangleRenderer.value,this._glyphRenderer.value]=this._initializeWebGLState(),this._isAttached=this._coreBrowserService.window.document.body.contains(this._core.screenElement),this.register((0,d.toDisposable)((()=>{var e;for(const e of this._renderLayers)e.dispose();null===(e=this._canvas.parentElement)||void 0===e||e.removeChild(this._canvas),(0,n.removeTerminalFromCache)(this._terminal)})))}get textureAtlas(){var e;return null===(e=this._charAtlas)||void 0===e?void 0:e.pages[0].canvas}_handleColorChange(){this._refreshCharAtlas(),this._clearModel(!0)}handleDevicePixelRatioChange(){this._devicePixelRatio!==this._coreBrowserService.dpr&&(this._devicePixelRatio=this._coreBrowserService.dpr,this.handleResize(this._terminal.cols,this._terminal.rows))}handleResize(e,t){var i,s,r,o;this._updateDimensions(),this._model.resize(this._terminal.cols,this._terminal.rows);for(const e of this._renderLayers)e.resize(this._terminal,this.dimensions);this._canvas.width=this.dimensions.device.canvas.width,this._canvas.height=this.dimensions.device.canvas.height,this._canvas.style.width=`${this.dimensions.css.canvas.width}px`,this._canvas.style.height=`${this.dimensions.css.canvas.height}px`,this._core.screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._core.screenElement.style.height=`${this.dimensions.css.canvas.height}px`,null===(i=this._rectangleRenderer.value)||void 0===i||i.setDimensions(this.dimensions),null===(s=this._rectangleRenderer.value)||void 0===s||s.handleResize(),null===(r=this._glyphRenderer.value)||void 0===r||r.setDimensions(this.dimensions),null===(o=this._glyphRenderer.value)||void 0===o||o.handleResize(),this._refreshCharAtlas(),this._clearModel(!1)}handleCharSizeChanged(){this.handleResize(this._terminal.cols,this._terminal.rows)}handleBlur(){var e;for(const e of this._renderLayers)e.handleBlur(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.pause(),this._requestRedrawViewport()}handleFocus(){var e;for(const e of this._renderLayers)e.handleFocus(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.resume(),this._requestRedrawViewport()}handleSelectionChanged(e,t,i){for(const s of this._renderLayers)s.handleSelectionChanged(this._terminal,e,t,i);this._model.selection.update(this._terminal,e,t,i),this._requestRedrawViewport()}handleCursorMove(){var e;for(const e of this._renderLayers)e.handleCursorMove(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation()}_handleOptionsChanged(){this._updateDimensions(),this._refreshCharAtlas(),this._updateCursorBlink()}_initializeWebGLState(){return this._rectangleRenderer.value=new p.RectangleRenderer(this._terminal,this._gl,this.dimensions,this._themeService),this._glyphRenderer.value=new f.GlyphRenderer(this._terminal,this._gl,this.dimensions),this.handleCharSizeChanged(),[this._rectangleRenderer.value,this._glyphRenderer.value]}_refreshCharAtlas(){var e;if(this.dimensions.device.char.width<=0&&this.dimensions.device.char.height<=0)return void(this._isAttached=!1);const t=(0,n.acquireTextureAtlas)(this._terminal,this._optionsService.rawOptions,this._themeService.colors,this.dimensions.device.cell.width,this.dimensions.device.cell.height,this.dimensions.device.char.width,this.dimensions.device.char.height,this._coreBrowserService.dpr);this._charAtlas!==t&&(this._onChangeTextureAtlas.fire(t.pages[0].canvas),this._charAtlasDisposable.value=(0,d.getDisposeArrayDisposable)([(0,c.forwardEvent)(t.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas),(0,c.forwardEvent)(t.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)])),this._charAtlas=t,this._charAtlas.warmUp(),null===(e=this._glyphRenderer.value)||void 0===e||e.setAtlas(this._charAtlas)}_clearModel(e){var t;this._model.clear(),e&&(null===(t=this._glyphRenderer.value)||void 0===t||t.clear())}clearTextureAtlas(){var e;null===(e=this._charAtlas)||void 0===e||e.clearTexture(),this._clearModel(!0),this._requestRedrawViewport()}clear(){var e;this._clearModel(!0);for(const e of this._renderLayers)e.reset(this._terminal);null===(e=this._cursorBlinkStateManager.value)||void 0===e||e.restartBlinkAnimation(),this._updateCursorBlink()}registerCharacterJoiner(e){return-1}deregisterCharacterJoiner(e){return!1}renderRows(e,t){if(!this._isAttached){if(!(this._coreBrowserService.window.document.body.contains(this._core.screenElement)&&this._charSizeService.width&&this._charSizeService.height))return;this._updateDimensions(),this._refreshCharAtlas(),this._isAttached=!0}for(const i of this._renderLayers)i.handleGridChanged(this._terminal,e,t);this._glyphRenderer.value&&this._rectangleRenderer.value&&(this._glyphRenderer.value.beginFrame()?(this._clearModel(!0),this._updateModel(0,this._terminal.rows-1)):this._updateModel(e,t),this._rectangleRenderer.value.renderBackgrounds(),this._glyphRenderer.value.render(this._model),this._cursorBlinkStateManager.value&&!this._cursorBlinkStateManager.value.isCursorVisible||this._rectangleRenderer.value.renderCursor())}_updateCursorBlink(){this._terminal.options.cursorBlink?this._cursorBlinkStateManager.value=new a.CursorBlinkStateManager((()=>{this._requestRedrawCursor()}),this._coreBrowserService):this._cursorBlinkStateManager.clear(),this._requestRedrawCursor()}_updateModel(e,t){const i=this._core;let s,r,o,n,a,h,l,c,d,_,u,v,f,p=this._workCell;e=w(e,i.rows-1,0),t=w(t,i.rows-1,0);const m=this._terminal.buffer.active.baseY+this._terminal.buffer.active.cursorY,L=Math.min(this._terminal.buffer.active.cursorX,i.cols-1);let b=-1;const R=this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden&&(!this._cursorBlinkStateManager.value||this._cursorBlinkStateManager.value.isCursorVisible);this._model.cursor=void 0;let M=!1;for(r=e;r<=t;r++)for(o=r+i.buffer.ydisp,n=i.buffer.lines.get(o),this._model.lineLengths[r]=0,a=this._characterJoinerService.getJoinedCharacters(o),v=0;v<i.cols;v++)if(s=this._cellColorResolver.result.bg,n.loadCell(v,p),0===v&&(s=this._cellColorResolver.result.bg),h=!1,l=v,a.length>0&&v===a[0][0]&&(h=!0,c=a.shift(),p=new x(p,n.translateToString(!0,c[0],c[1]),c[1]-c[0]),l=c[1]-1),d=p.getChars(),_=p.getCode(),u=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._cellColorResolver.resolve(p,v,o),R&&o===m&&(v===L&&(this._model.cursor={x:L,y:this._terminal.buffer.active.cursorY,width:p.getWidth(),style:this._coreBrowserService.isFocused?i.options.cursorStyle||"block":i.options.cursorInactiveStyle,cursorWidth:i.options.cursorWidth,dpr:this._devicePixelRatio},b=L+p.getWidth()-1),v>=L&&v<=b&&(this._coreBrowserService.isFocused&&"block"===(i.options.cursorStyle||"block")||!1===this._coreBrowserService.isFocused&&"block"===i.options.cursorInactiveStyle)&&(this._cellColorResolver.result.fg=50331648|this._themeService.colors.cursorAccent.rgba>>8&16777215,this._cellColorResolver.result.bg=50331648|this._themeService.colors.cursor.rgba>>8&16777215)),_!==g.NULL_CELL_CODE&&(this._model.lineLengths[r]=v+1),(this._model.cells[u]!==_||this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]!==this._cellColorResolver.result.bg||this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]!==this._cellColorResolver.result.fg||this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]!==this._cellColorResolver.result.ext)&&(M=!0,d.length>1&&(_|=C.COMBINED_CHAR_BIT_MASK),this._model.cells[u]=_,this._model.cells[u+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[u+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[u+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext,this._glyphRenderer.value.updateCell(v,r,_,this._cellColorResolver.result.bg,this._cellColorResolver.result.fg,this._cellColorResolver.result.ext,d,s),h))for(p=this._workCell,v++;v<l;v++)f=(r*i.cols+v)*C.RENDER_MODEL_INDICIES_PER_CELL,this._glyphRenderer.value.updateCell(v,r,g.NULL_CELL_CODE,0,0,0,g.NULL_CELL_CHAR,0),this._model.cells[f]=g.NULL_CELL_CODE,this._model.cells[f+C.RENDER_MODEL_BG_OFFSET]=this._cellColorResolver.result.bg,this._model.cells[f+C.RENDER_MODEL_FG_OFFSET]=this._cellColorResolver.result.fg,this._model.cells[f+C.RENDER_MODEL_EXT_OFFSET]=this._cellColorResolver.result.ext;M&&this._rectangleRenderer.value.updateBackgrounds(this._model),this._rectangleRenderer.value.updateCursor(this._model)}_updateDimensions(){this._charSizeService.width&&this._charSizeService.height&&(this.dimensions.device.char.width=Math.floor(this._charSizeService.width*this._devicePixelRatio),this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*this._devicePixelRatio),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.top=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.device.cell.height-this.dimensions.device.char.height)/2),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.char.left=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.device.canvas.height=this._terminal.rows*this.dimensions.device.cell.height,this.dimensions.device.canvas.width=this._terminal.cols*this.dimensions.device.cell.width,this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/this._devicePixelRatio),this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/this._devicePixelRatio),this.dimensions.css.cell.height=this.dimensions.device.cell.height/this._devicePixelRatio,this.dimensions.css.cell.width=this.dimensions.device.cell.width/this._devicePixelRatio)}_setCanvasDevicePixelDimensions(e,t){this._canvas.width===e&&this._canvas.height===t||(this._canvas.width=e,this._canvas.height=t,this._requestRedrawViewport())}_requestRedrawViewport(){this._onRequestRedraw.fire({start:0,end:this._terminal.rows-1})}_requestRedrawCursor(){const e=this._terminal.buffer.active.cursorY;this._onRequestRedraw.fire({start:e,end:e})}}t.WebglRenderer=L,s([v.traceCall],L.prototype,"renderRows",null);class x extends _.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}function w(e,t,i=0){return Math.max(Math.min(e,t),i)}t.JoinedCellData=x},381:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.GLTexture=t.expandFloat32Array=t.createShader=t.createProgram=t.PROJECTION_MATRIX=void 0;const s=i(374);function r(e,t,i){const r=(0,s.throwIfFalsy)(e.createShader(t));if(e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return r;console.error(e.getShaderInfoLog(r)),e.deleteShader(r)}t.PROJECTION_MATRIX=new Float32Array([2,0,0,0,0,-2,0,0,0,0,1,0,-1,1,0,1]),t.createProgram=function(e,t,i){const o=(0,s.throwIfFalsy)(e.createProgram());if(e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.VERTEX_SHADER,t))),e.attachShader(o,(0,s.throwIfFalsy)(r(e,e.FRAGMENT_SHADER,i))),e.linkProgram(o),e.getProgramParameter(o,e.LINK_STATUS))return o;console.error(e.getProgramInfoLog(o)),e.deleteProgram(o)},t.createShader=r,t.expandFloat32Array=function(e,t){const i=Math.min(2*e.length,t),s=new Float32Array(i);for(let t=0;t<e.length;t++)s[t]=e[t];return s},t.GLTexture=class{constructor(e){this.texture=e,this.version=-1}}},592:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BaseRenderLayer=void 0;const s=i(627),r=i(237),o=i(374),n=i(859);class a extends n.Disposable{constructor(e,t,i,s,r,o,a,h){super(),this._container=t,this._alpha=r,this._coreBrowserService=o,this._optionsService=a,this._themeService=h,this._deviceCharWidth=0,this._deviceCharHeight=0,this._deviceCellWidth=0,this._deviceCellHeight=0,this._deviceCharLeft=0,this._deviceCharTop=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add(`xterm-${i}-layer`),this._canvas.style.zIndex=s.toString(),this._initCanvas(),this._container.appendChild(this._canvas),this.register(this._themeService.onChangeColors((t=>{this._refreshCharAtlas(e,t),this.reset(e)}))),this.register((0,n.toDisposable)((()=>{this._canvas.remove()})))}_initCanvas(){this._ctx=(0,o.throwIfFalsy)(this._canvas.getContext("2d",{alpha:this._alpha})),this._alpha||this._clearAll()}handleBlur(e){}handleFocus(e){}handleCursorMove(e){}handleGridChanged(e,t,i){}handleSelectionChanged(e,t,i,s=!1){}_setTransparency(e,t){if(t===this._alpha)return;const i=this._canvas;this._alpha=t,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,i),this._refreshCharAtlas(e,this._themeService.colors),this.handleGridChanged(e,0,e.rows-1)}_refreshCharAtlas(e,t){this._deviceCharWidth<=0&&this._deviceCharHeight<=0||(this._charAtlas=(0,s.acquireTextureAtlas)(e,this._optionsService.rawOptions,t,this._deviceCellWidth,this._deviceCellHeight,this._deviceCharWidth,this._deviceCharHeight,this._coreBrowserService.dpr),this._charAtlas.warmUp())}resize(e,t){this._deviceCellWidth=t.device.cell.width,this._deviceCellHeight=t.device.cell.height,this._deviceCharWidth=t.device.char.width,this._deviceCharHeight=t.device.char.height,this._deviceCharLeft=t.device.char.left,this._deviceCharTop=t.device.char.top,this._canvas.width=t.device.canvas.width,this._canvas.height=t.device.canvas.height,this._canvas.style.width=`${t.css.canvas.width}px`,this._canvas.style.height=`${t.css.canvas.height}px`,this._alpha||this._clearAll(),this._refreshCharAtlas(e,this._themeService.colors)}_fillBottomLineAtCells(e,t,i=1){this._ctx.fillRect(e*this._deviceCellWidth,(t+1)*this._deviceCellHeight-this._coreBrowserService.dpr-1,i*this._deviceCellWidth,this._coreBrowserService.dpr)}_clearAll(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))}_clearCells(e,t,i,s){this._alpha?this._ctx.clearRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight):(this._ctx.fillStyle=this._themeService.colors.background.css,this._ctx.fillRect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,s*this._deviceCellHeight))}_fillCharTrueColor(e,t,i,s){this._ctx.font=this._getFont(e,!1,!1),this._ctx.textBaseline=r.TEXT_BASELINE,this._clipCell(i,s,t.getWidth()),this._ctx.fillText(t.getChars(),i*this._deviceCellWidth+this._deviceCharLeft,s*this._deviceCellHeight+this._deviceCharTop+this._deviceCharHeight)}_clipCell(e,t,i){this._ctx.beginPath(),this._ctx.rect(e*this._deviceCellWidth,t*this._deviceCellHeight,i*this._deviceCellWidth,this._deviceCellHeight),this._ctx.clip()}_getFont(e,t,i){return`${i?"italic":""} ${t?e.options.fontWeightBold:e.options.fontWeight} ${e.options.fontSize*this._coreBrowserService.dpr}px ${e.options.fontFamily}`}}t.BaseRenderLayer=a},733:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkRenderLayer=void 0;const s=i(197),r=i(237),o=i(592);class n extends o.BaseRenderLayer{constructor(e,t,i,s,r,o,n){super(i,e,"link",t,!0,r,o,n),this.register(s.onShowLinkUnderline((e=>this._handleShowLinkUnderline(e)))),this.register(s.onHideLinkUnderline((e=>this._handleHideLinkUnderline(e))))}resize(e,t){super.resize(e,t),this._state=void 0}reset(e){this._clearCurrentLink()}_clearCurrentLink(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);const e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}}_handleShowLinkUnderline(e){if(e.fg===r.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._themeService.colors.background.css:void 0!==e.fg&&(0,s.is256Color)(e.fg)?this._ctx.fillStyle=this._themeService.colors.ansi[e.fg].css:this._ctx.fillStyle=this._themeService.colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(let t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e}_handleHideLinkUnderline(e){this._clearCurrentLink()}}t.LinkRenderLayer=n},820:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},274:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellColorResolver=void 0;let i,s=0,r=0,o=!1,n=!1,a=!1;t.CellColorResolver=class{constructor(e,t,i,s,r){this._terminal=e,this._selectionRenderModel=t,this._decorationService=i,this._coreBrowserService=s,this._themeService=r,this.result={fg:0,bg:0,ext:0}}resolve(e,t,h){this.result.bg=e.bg,this.result.fg=e.fg,this.result.ext=268435456&e.bg?e.extended.ext:0,r=0,s=0,n=!1,o=!1,a=!1,i=this._themeService.colors,this._decorationService.forEachDecorationAtCell(t,h,"bottom",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),a=this._selectionRenderModel.isCellSelected(this._terminal,t,h),a&&(r=(this._coreBrowserService.isFocused?i.selectionBackgroundOpaque:i.selectionInactiveBackgroundOpaque).rgba>>8&16777215,n=!0,i.selectionForeground&&(s=i.selectionForeground.rgba>>8&16777215,o=!0)),this._decorationService.forEachDecorationAtCell(t,h,"top",(e=>{e.backgroundColorRGB&&(r=e.backgroundColorRGB.rgba>>8&16777215,n=!0),e.foregroundColorRGB&&(s=e.foregroundColorRGB.rgba>>8&16777215,o=!0)})),n&&(r=a?-16777216&e.bg&-134217729|r|50331648:-16777216&e.bg|r|50331648),o&&(s=-16777216&e.fg&-67108865|s|50331648),67108864&this.result.fg&&(n&&!o&&(s=0==(50331648&this.result.bg)?-134217728&this.result.fg|16777215&i.background.rgba>>8|50331648:-134217728&this.result.fg|67108863&this.result.bg,o=!0),!n&&o&&(r=0==(50331648&this.result.fg)?-67108864&this.result.bg|16777215&i.foreground.rgba>>8|50331648:-67108864&this.result.bg|67108863&this.result.fg,n=!0)),i=void 0,this.result.bg=n?r:this.result.bg,this.result.fg=o?s:this.result.fg}}},627:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.removeTerminalFromCache=t.acquireTextureAtlas=void 0;const s=i(509),r=i(197),o=[];t.acquireTextureAtlas=function(e,t,i,n,a,h,l,c){const d=(0,r.generateConfig)(n,a,h,l,t,i,c);for(let t=0;t<o.length;t++){const i=o[t],s=i.ownedBy.indexOf(e);if(s>=0){if((0,r.configEquals)(i.config,d))return i.atlas;1===i.ownedBy.length?(i.atlas.dispose(),o.splice(t,1)):i.ownedBy.splice(s,1);break}}for(let t=0;t<o.length;t++){const i=o[t];if((0,r.configEquals)(i.config,d))return i.ownedBy.push(e),i.atlas}const _=e._core,u={atlas:new s.TextureAtlas(document,d,_.unicodeService),config:d,ownedBy:[e]};return o.push(u),u.atlas},t.removeTerminalFromCache=function(e){for(let t=0;t<o.length;t++){const i=o[t].ownedBy.indexOf(e);if(-1!==i){1===o[t].ownedBy.length?(o[t].atlas.dispose(),o.splice(t,1)):o[t].ownedBy.splice(i,1);break}}}},197:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.is256Color=t.configEquals=t.generateConfig=void 0;const s=i(160);t.generateConfig=function(e,t,i,r,o,n,a){const h={foreground:n.foreground,background:n.background,cursor:s.NULL_COLOR,cursorAccent:s.NULL_COLOR,selectionForeground:s.NULL_COLOR,selectionBackgroundTransparent:s.NULL_COLOR,selectionBackgroundOpaque:s.NULL_COLOR,selectionInactiveBackgroundTransparent:s.NULL_COLOR,selectionInactiveBackgroundOpaque:s.NULL_COLOR,ansi:n.ansi.slice(),contrastCache:n.contrastCache,halfContrastCache:n.halfContrastCache};return{customGlyphs:o.customGlyphs,devicePixelRatio:a,letterSpacing:o.letterSpacing,lineHeight:o.lineHeight,deviceCellWidth:e,deviceCellHeight:t,deviceCharWidth:i,deviceCharHeight:r,fontFamily:o.fontFamily,fontSize:o.fontSize,fontWeight:o.fontWeight,fontWeightBold:o.fontWeightBold,allowTransparency:o.allowTransparency,drawBoldTextInBrightColors:o.drawBoldTextInBrightColors,minimumContrastRatio:o.minimumContrastRatio,colors:h}},t.configEquals=function(e,t){for(let i=0;i<e.colors.ansi.length;i++)if(e.colors.ansi[i].rgba!==t.colors.ansi[i].rgba)return!1;return e.devicePixelRatio===t.devicePixelRatio&&e.customGlyphs===t.customGlyphs&&e.lineHeight===t.lineHeight&&e.letterSpacing===t.letterSpacing&&e.fontFamily===t.fontFamily&&e.fontSize===t.fontSize&&e.fontWeight===t.fontWeight&&e.fontWeightBold===t.fontWeightBold&&e.allowTransparency===t.allowTransparency&&e.deviceCharWidth===t.deviceCharWidth&&e.deviceCharHeight===t.deviceCharHeight&&e.drawBoldTextInBrightColors===t.drawBoldTextInBrightColors&&e.minimumContrastRatio===t.minimumContrastRatio&&e.colors.foreground.rgba===t.colors.foreground.rgba&&e.colors.background.rgba===t.colors.background.rgba},t.is256Color=function(e){return 16777216==(50331648&e)||33554432==(50331648&e)}},237:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(399);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},457:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CursorBlinkStateManager=void 0;t.CursorBlinkStateManager=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this.isCursorVisible=!0,this._coreBrowserService.isFocused&&this._restartInterval()}get isPaused(){return!(this._blinkStartTimeout||this._blinkInterval)}dispose(){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}restartBlinkAnimation(){this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))))}_restartInterval(e=600){this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=this._coreBrowserService.window.setTimeout((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);if(this._animationTimeRestarted=void 0,e>0)return void this._restartInterval(e)}this.isCursorVisible=!1,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0})),this._blinkInterval=this._coreBrowserService.window.setInterval((()=>{if(this._animationTimeRestarted){const e=600-(Date.now()-this._animationTimeRestarted);return this._animationTimeRestarted=void 0,void this._restartInterval(e)}this.isCursorVisible=!this.isCursorVisible,this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._renderCallback(),this._animationFrame=void 0}))}),600)}),e)}pause(){this.isCursorVisible=!0,this._blinkInterval&&(this._coreBrowserService.window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}resume(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()}}},860:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tryDrawCustomChar=t.powerlineDefinitions=t.boxDrawingDefinitions=t.blockElementDefinitions=void 0;const s=i(374);t.blockElementDefinitions={"▀":[{x:0,y:0,w:8,h:4}],"▁":[{x:0,y:7,w:8,h:1}],"▂":[{x:0,y:6,w:8,h:2}],"▃":[{x:0,y:5,w:8,h:3}],"▄":[{x:0,y:4,w:8,h:4}],"▅":[{x:0,y:3,w:8,h:5}],"▆":[{x:0,y:2,w:8,h:6}],"▇":[{x:0,y:1,w:8,h:7}],"█":[{x:0,y:0,w:8,h:8}],"▉":[{x:0,y:0,w:7,h:8}],"▊":[{x:0,y:0,w:6,h:8}],"▋":[{x:0,y:0,w:5,h:8}],"▌":[{x:0,y:0,w:4,h:8}],"▍":[{x:0,y:0,w:3,h:8}],"▎":[{x:0,y:0,w:2,h:8}],"▏":[{x:0,y:0,w:1,h:8}],"▐":[{x:4,y:0,w:4,h:8}],"▔":[{x:0,y:0,w:8,h:1}],"▕":[{x:7,y:0,w:1,h:8}],"▖":[{x:0,y:4,w:4,h:4}],"▗":[{x:4,y:4,w:4,h:4}],"▘":[{x:0,y:0,w:4,h:4}],"▙":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"▚":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],"▛":[{x:0,y:0,w:4,h:8},{x:4,y:0,w:4,h:4}],"▜":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],"▝":[{x:4,y:0,w:4,h:4}],"▞":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],"▟":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],"🭰":[{x:1,y:0,w:1,h:8}],"🭱":[{x:2,y:0,w:1,h:8}],"🭲":[{x:3,y:0,w:1,h:8}],"🭳":[{x:4,y:0,w:1,h:8}],"🭴":[{x:5,y:0,w:1,h:8}],"🭵":[{x:6,y:0,w:1,h:8}],"🭶":[{x:0,y:1,w:8,h:1}],"🭷":[{x:0,y:2,w:8,h:1}],"🭸":[{x:0,y:3,w:8,h:1}],"🭹":[{x:0,y:4,w:8,h:1}],"🭺":[{x:0,y:5,w:8,h:1}],"🭻":[{x:0,y:6,w:8,h:1}],"🭼":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🭽":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭾":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],"🭿":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],"🮀":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮁":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],"🮂":[{x:0,y:0,w:8,h:2}],"🮃":[{x:0,y:0,w:8,h:3}],"🮄":[{x:0,y:0,w:8,h:5}],"🮅":[{x:0,y:0,w:8,h:6}],"🮆":[{x:0,y:0,w:8,h:7}],"🮇":[{x:6,y:0,w:2,h:8}],"🮈":[{x:5,y:0,w:3,h:8}],"🮉":[{x:3,y:0,w:5,h:8}],"🮊":[{x:2,y:0,w:6,h:8}],"🮋":[{x:1,y:0,w:7,h:8}],"🮕":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],"🮖":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],"🮗":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]};const r={"░":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],"▒":[[1,0],[0,0],[0,1],[0,0]],"▓":[[0,1],[1,1],[1,0],[1,1]]};t.boxDrawingDefinitions={"─":{1:"M0,.5 L1,.5"},"━":{3:"M0,.5 L1,.5"},"│":{1:"M.5,0 L.5,1"},"┃":{3:"M.5,0 L.5,1"},"┌":{1:"M0.5,1 L.5,.5 L1,.5"},"┏":{3:"M0.5,1 L.5,.5 L1,.5"},"┐":{1:"M0,.5 L.5,.5 L.5,1"},"┓":{3:"M0,.5 L.5,.5 L.5,1"},"└":{1:"M.5,0 L.5,.5 L1,.5"},"┗":{3:"M.5,0 L.5,.5 L1,.5"},"┘":{1:"M.5,0 L.5,.5 L0,.5"},"┛":{3:"M.5,0 L.5,.5 L0,.5"},"├":{1:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┣":{3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"┤":{1:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┫":{3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"┬":{1:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┳":{3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"┴":{1:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┻":{3:"M0,.5 L1,.5 M.5,.5 L.5,0"},"┼":{1:"M0,.5 L1,.5 M.5,0 L.5,1"},"╋":{3:"M0,.5 L1,.5 M.5,0 L.5,1"},"╴":{1:"M.5,.5 L0,.5"},"╸":{3:"M.5,.5 L0,.5"},"╵":{1:"M.5,.5 L.5,0"},"╹":{3:"M.5,.5 L.5,0"},"╶":{1:"M.5,.5 L1,.5"},"╺":{3:"M.5,.5 L1,.5"},"╷":{1:"M.5,.5 L.5,1"},"╻":{3:"M.5,.5 L.5,1"},"═":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"║":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╒":{1:(e,t)=>`M.5,1 L.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╓":{1:(e,t)=>`M${.5-e},1 L${.5-e},.5 L1,.5 M${.5+e},.5 L${.5+e},1`},"╔":{1:(e,t)=>`M1,${.5-t} L${.5-e},${.5-t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╕":{1:(e,t)=>`M0,${.5-t} L.5,${.5-t} L.5,1 M0,${.5+t} L.5,${.5+t}`},"╖":{1:(e,t)=>`M${.5+e},1 L${.5+e},.5 L0,.5 M${.5-e},.5 L${.5-e},1`},"╗":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5+e},${.5-t} L${.5+e},1`},"╘":{1:(e,t)=>`M.5,0 L.5,${.5+t} L1,${.5+t} M.5,${.5-t} L1,${.5-t}`},"╙":{1:(e,t)=>`M1,.5 L${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╚":{1:(e,t)=>`M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0 M1,${.5+t} L${.5-e},${.5+t} L${.5-e},0`},"╛":{1:(e,t)=>`M0,${.5+t} L.5,${.5+t} L.5,0 M0,${.5-t} L.5,${.5-t}`},"╜":{1:(e,t)=>`M0,.5 L${.5+e},.5 L${.5+e},0 M${.5-e},.5 L${.5-e},0`},"╝":{1:(e,t)=>`M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M0,${.5+t} L${.5+e},${.5+t} L${.5+e},0`},"╞":{1:(e,t)=>`M.5,0 L.5,1 M.5,${.5-t} L1,${.5-t} M.5,${.5+t} L1,${.5+t}`},"╟":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1 M${.5+e},.5 L1,.5`},"╠":{1:(e,t)=>`M${.5-e},0 L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╡":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L.5,${.5-t} M0,${.5+t} L.5,${.5+t}`},"╢":{1:(e,t)=>`M0,.5 L${.5-e},.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╣":{1:(e,t)=>`M${.5+e},0 L${.5+e},1 M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0`},"╤":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t} M.5,${.5+t} L.5,1`},"╥":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},1 M${.5+e},.5 L${.5+e},1`},"╦":{1:(e,t)=>`M0,${.5-t} L1,${.5-t} M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1`},"╧":{1:(e,t)=>`M.5,0 L.5,${.5-t} M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╨":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},.5 L${.5-e},0 M${.5+e},.5 L${.5+e},0`},"╩":{1:(e,t)=>`M0,${.5+t} L1,${.5+t} M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╪":{1:(e,t)=>`M.5,0 L.5,1 M0,${.5-t} L1,${.5-t} M0,${.5+t} L1,${.5+t}`},"╫":{1:(e,t)=>`M0,.5 L1,.5 M${.5-e},0 L${.5-e},1 M${.5+e},0 L${.5+e},1`},"╬":{1:(e,t)=>`M0,${.5+t} L${.5-e},${.5+t} L${.5-e},1 M1,${.5+t} L${.5+e},${.5+t} L${.5+e},1 M0,${.5-t} L${.5-e},${.5-t} L${.5-e},0 M1,${.5-t} L${.5+e},${.5-t} L${.5+e},0`},"╱":{1:"M1,0 L0,1"},"╲":{1:"M0,0 L1,1"},"╳":{1:"M1,0 L0,1 M0,0 L1,1"},"╼":{1:"M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"╽":{1:"M.5,.5 L.5,0",3:"M.5,.5 L.5,1"},"╾":{1:"M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"╿":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┍":{1:"M.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┎":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┑":{1:"M.5,.5 L.5,1",3:"M.5,.5 L0,.5"},"┒":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┕":{1:"M.5,.5 L.5,0",3:"M.5,.5 L1,.5"},"┖":{1:"M.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┙":{1:"M.5,.5 L.5,0",3:"M.5,.5 L0,.5"},"┚":{1:"M.5,.5 L0,.5",3:"M.5,.5 L.5,0"},"┝":{1:"M.5,0 L.5,1",3:"M.5,.5 L1,.5"},"┞":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L.5,0"},"┟":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L.5,1"},"┠":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1"},"┡":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"┢":{1:"M.5,.5 L.5,0",3:"M0.5,1 L.5,.5 L1,.5"},"┥":{1:"M.5,0 L.5,1",3:"M.5,.5 L0,.5"},"┦":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"┧":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L.5,1"},"┨":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1"},"┩":{1:"M.5,.5 L.5,1",3:"M.5,0 L.5,.5 L0,.5"},"┪":{1:"M.5,.5 L.5,0",3:"M0,.5 L.5,.5 L.5,1"},"┭":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┮":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,.5 L1,.5"},"┯":{1:"M.5,.5 L.5,1",3:"M0,.5 L1,.5"},"┰":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"┱":{1:"M.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"┲":{1:"M.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"┵":{1:"M.5,0 L.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┶":{1:"M.5,0 L.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┷":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5"},"┸":{1:"M0,.5 L1,.5",3:"M.5,.5 L.5,0"},"┹":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"┺":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,.5 L1,.5"},"┽":{1:"M.5,0 L.5,1 M.5,.5 L1,.5",3:"M.5,.5 L0,.5"},"┾":{1:"M.5,0 L.5,1 M.5,.5 L0,.5",3:"M.5,.5 L1,.5"},"┿":{1:"M.5,0 L.5,1",3:"M0,.5 L1,.5"},"╀":{1:"M0,.5 L1,.5 M.5,.5 L.5,1",3:"M.5,.5 L.5,0"},"╁":{1:"M.5,.5 L.5,0 M0,.5 L1,.5",3:"M.5,.5 L.5,1"},"╂":{1:"M0,.5 L1,.5",3:"M.5,0 L.5,1"},"╃":{1:"M0.5,1 L.5,.5 L1,.5",3:"M.5,0 L.5,.5 L0,.5"},"╄":{1:"M0,.5 L.5,.5 L.5,1",3:"M.5,0 L.5,.5 L1,.5"},"╅":{1:"M.5,0 L.5,.5 L1,.5",3:"M0,.5 L.5,.5 L.5,1"},"╆":{1:"M.5,0 L.5,.5 L0,.5",3:"M0.5,1 L.5,.5 L1,.5"},"╇":{1:"M.5,.5 L.5,1",3:"M.5,.5 L.5,0 M0,.5 L1,.5"},"╈":{1:"M.5,.5 L.5,0",3:"M0,.5 L1,.5 M.5,.5 L.5,1"},"╉":{1:"M.5,.5 L1,.5",3:"M.5,0 L.5,1 M.5,.5 L0,.5"},"╊":{1:"M.5,.5 L0,.5",3:"M.5,0 L.5,1 M.5,.5 L1,.5"},"╌":{1:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"╍":{3:"M.1,.5 L.4,.5 M.6,.5 L.9,.5"},"┄":{1:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┅":{3:"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5"},"┈":{1:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"┉":{3:"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5"},"╎":{1:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"╏":{3:"M.5,.1 L.5,.4 M.5,.6 L.5,.9"},"┆":{1:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┇":{3:"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333"},"┊":{1:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"┋":{3:"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95"},"╭":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,1,.5`},"╮":{1:(e,t)=>`M.5,1 L.5,${.5+t/.15*.5} C.5,${.5+t/.15*.5},.5,.5,0,.5`},"╯":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,0,.5`},"╰":{1:(e,t)=>`M.5,0 L.5,${.5-t/.15*.5} C.5,${.5-t/.15*.5},.5,.5,1,.5`}},t.powerlineDefinitions={"":{d:"M0,0 L1,.5 L0,1",type:0,rightPadding:2},"":{d:"M-1,-.5 L1,.5 L-1,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1,0 L0,.5 L1,1",type:0,leftPadding:2},"":{d:"M2,-.5 L0,.5 L2,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0",type:0,rightPadding:1},"":{d:"M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0",type:1,rightPadding:1},"":{d:"M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0",type:0,leftPadding:1},"":{d:"M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0",type:1,leftPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L-.5,1.5",type:0},"":{d:"M-.5,-.5 L1.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M1.5,-.5 L-.5,1.5 L1.5,1.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5 L-.5,-.5",type:0},"":{d:"M1.5,-.5 L-.5,1.5",type:1,leftPadding:1,rightPadding:1},"":{d:"M-.5,-.5 L1.5,1.5 L1.5,-.5",type:0}},t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.powerlineDefinitions[""]=t.powerlineDefinitions[""],t.tryDrawCustomChar=function(e,i,n,l,c,d,_,u){const g=t.blockElementDefinitions[i];if(g)return function(e,t,i,s,r,o){for(let n=0;n<t.length;n++){const a=t[n],h=r/8,l=o/8;e.fillRect(i+a.x*h,s+a.y*l,a.w*h,a.h*l)}}(e,g,n,l,c,d),!0;const v=r[i];if(v)return function(e,t,i,r,n,a){let h=o.get(t);h||(h=new Map,o.set(t,h));const l=e.fillStyle;if("string"!=typeof l)throw new Error(`Unexpected fillStyle type "${l}"`);let c=h.get(l);if(!c){const i=t[0].length,r=t.length,o=document.createElement("canvas");o.width=i,o.height=r;const n=(0,s.throwIfFalsy)(o.getContext("2d")),a=new ImageData(i,r);let d,_,u,g;if(l.startsWith("#"))d=parseInt(l.slice(1,3),16),_=parseInt(l.slice(3,5),16),u=parseInt(l.slice(5,7),16),g=l.length>7&&parseInt(l.slice(7,9),16)||1;else{if(!l.startsWith("rgba"))throw new Error(`Unexpected fillStyle color format "${l}" when drawing pattern glyph`);[d,_,u,g]=l.substring(5,l.length-1).split(",").map((e=>parseFloat(e)))}for(let e=0;e<r;e++)for(let s=0;s<i;s++)a.data[4*(e*i+s)]=d,a.data[4*(e*i+s)+1]=_,a.data[4*(e*i+s)+2]=u,a.data[4*(e*i+s)+3]=t[e][s]*(255*g);n.putImageData(a,0,0),c=(0,s.throwIfFalsy)(e.createPattern(o,null)),h.set(l,c)}e.fillStyle=c,e.fillRect(i,r,n,a)}(e,v,n,l,c,d),!0;const f=t.boxDrawingDefinitions[i];if(f)return function(e,t,i,s,r,o,n){e.strokeStyle=e.fillStyle;for(const[l,c]of Object.entries(t)){let t;e.beginPath(),e.lineWidth=n*Number.parseInt(l),t="function"==typeof c?c(.15,.15/o*r):c;for(const l of t.split(" ")){const t=l[0],c=a[t];if(!c){console.error(`Could not find drawing instructions for "${t}"`);continue}const d=l.substring(1).split(",");d[0]&&d[1]&&c(e,h(d,r,o,i,s,!0,n))}e.stroke(),e.closePath()}}(e,f,n,l,c,d,u),!0;const p=t.powerlineDefinitions[i];return!!p&&(function(e,t,i,s,r,o,n,l){var c,d;const _=new Path2D;_.rect(i,s,r,o),e.clip(_),e.beginPath();const u=n/12;e.lineWidth=l*u;for(const n of t.d.split(" ")){const _=n[0],g=a[_];if(!g){console.error(`Could not find drawing instructions for "${_}"`);continue}const v=n.substring(1).split(",");v[0]&&v[1]&&g(e,h(v,r,o,i,s,!1,l,(null!==(c=t.leftPadding)&&void 0!==c?c:0)*(u/2),(null!==(d=t.rightPadding)&&void 0!==d?d:0)*(u/2)))}1===t.type?(e.strokeStyle=e.fillStyle,e.stroke()):e.fill(),e.closePath()}(e,p,n,l,c,d,_,u),!0)};const o=new Map;function n(e,t,i=0){return Math.max(Math.min(e,t),i)}const a={C:(e,t)=>e.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5]),L:(e,t)=>e.lineTo(t[0],t[1]),M:(e,t)=>e.moveTo(t[0],t[1])};function h(e,t,i,s,r,o,a,h=0,l=0){const c=e.map((e=>parseFloat(e)||parseInt(e)));if(c.length<2)throw new Error("Too few arguments for instruction");for(let e=0;e<c.length;e+=2)c[e]*=t-h*a-l*a,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,t,0)),c[e]+=s+h*a;for(let e=1;e<c.length;e+=2)c[e]*=i,o&&0!==c[e]&&(c[e]=n(Math.round(c[e]+.5)-.5,i,0)),c[e]+=r;return c}},56:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.observeDevicePixelDimensions=void 0;const s=i(859);t.observeDevicePixelDimensions=function(e,t,i){let r=new t.ResizeObserver((t=>{const s=t.find((t=>t.target===e));if(!s)return;if(!("devicePixelContentBoxSize"in s))return null==r||r.disconnect(),void(r=void 0);const o=s.devicePixelContentBoxSize[0].inlineSize,n=s.devicePixelContentBoxSize[0].blockSize;o>0&&n>0&&i(o,n)}));try{r.observe(e,{box:["device-pixel-content-box"]})}catch(e){r.disconnect(),r=void 0}return(0,s.toDisposable)((()=>null==r?void 0:r.disconnect()))}},374:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},296:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=t[1]-e.buffer.active.viewportY,o=i[1]-e.buffer.active.viewportY,n=Math.max(r,0),a=Math.min(o,e.rows-1);n>=e.rows||a<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=r,this.viewportEndRow=o,this.viewportCappedStartRow=n,this.viewportCappedEndRow=a,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t<this.endCol&&i<=this.viewportCappedEndRow:t<this.startCol&&i>=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},509:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n};Object.defineProperty(t,"__esModule",{value:!0}),t.TextureAtlas=void 0;const r=i(237),o=i(860),n=i(374),a=i(160),h=i(345),l=i(485),c=i(385),d=i(147),_=i(855),u=i(776),g={texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},offset:{x:0,y:0},size:{x:0,y:0},sizeClipSpace:{x:0,y:0}};let v;class f{get pages(){return this._pages}constructor(e,t,i){this._document=e,this._config=t,this._unicodeService=i,this._didWarmUp=!1,this._cacheMap=new l.FourKeyMap,this._cacheMapCombined=new l.FourKeyMap,this._pages=[],this._activePages=[],this._workBoundingBox={top:0,left:0,bottom:0,right:0},this._workAttributeData=new d.AttributeData,this._textureSize=512,this._onAddTextureAtlasCanvas=new h.EventEmitter,this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=new h.EventEmitter,this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._requestClearModel=!1,this._createNewPage(),this._tmpCanvas=m(e,4*this._config.deviceCellWidth+4,this._config.deviceCellHeight+4),this._tmpCtx=(0,n.throwIfFalsy)(this._tmpCanvas.getContext("2d",{alpha:this._config.allowTransparency,willReadFrequently:!0}))}dispose(){for(const e of this.pages)e.canvas.remove();this._onAddTextureAtlasCanvas.dispose()}warmUp(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)}_doWarmUp(){const e=new c.IdleTaskQueue;for(let t=33;t<126;t++)e.enqueue((()=>{if(!this._cacheMap.get(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT)){const e=this._drawToCache(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT);this._cacheMap.set(t,_.DEFAULT_COLOR,_.DEFAULT_COLOR,_.DEFAULT_EXT,e)}}))}beginFrame(){return this._requestClearModel}clearTexture(){if(0!==this._pages[0].currentRow.x||0!==this._pages[0].currentRow.y){for(const e of this._pages)e.clear();this._cacheMap.clear(),this._cacheMapCombined.clear(),this._didWarmUp=!1}}_createNewPage(){if(f.maxAtlasPages&&this._pages.length>=Math.max(4,f.maxAtlasPages)){const e=this._pages.filter((e=>2*e.canvas.width<=(f.maxTextureSize||4096))).sort(((e,t)=>t.canvas.width!==e.canvas.width?t.canvas.width-e.canvas.width:t.percentageUsed-e.percentageUsed));let t=-1,i=0;for(let s=0;s<e.length;s++)if(e[s].canvas.width!==i)t=s,i=e[s].canvas.width;else if(s-t==3)break;const s=e.slice(t,t+4),r=s.map((e=>e.glyphs[0].texturePage)).sort(((e,t)=>e>t?1:-1)),o=this.pages.length-s.length,n=this._mergePages(s,o);n.version++;for(let e=r.length-1;e>=0;e--)this._deletePage(r[e]);this.pages.push(n),this._requestClearModel=!0,this._onAddTextureAtlasCanvas.fire(n.canvas)}const e=new p(this._document,this._textureSize);return this._pages.push(e),this._activePages.push(e),this._onAddTextureAtlasCanvas.fire(e.canvas),e}_mergePages(e,t){const i=2*e[0].canvas.width,s=new p(this._document,i,e);for(const[r,o]of e.entries()){const e=r*o.canvas.width%i,n=Math.floor(r/2)*o.canvas.height;s.ctx.drawImage(o.canvas,e,n);for(const s of o.glyphs)s.texturePage=t,s.sizeClipSpace.x=s.size.x/i,s.sizeClipSpace.y=s.size.y/i,s.texturePosition.x+=e,s.texturePosition.y+=n,s.texturePositionClipSpace.x=s.texturePosition.x/i,s.texturePositionClipSpace.y=s.texturePosition.y/i;this._onRemoveTextureAtlasCanvas.fire(o.canvas);const a=this._activePages.indexOf(o);-1!==a&&this._activePages.splice(a,1)}return s}_deletePage(e){this._pages.splice(e,1);for(let t=e;t<this._pages.length;t++){const e=this._pages[t];for(const t of e.glyphs)t.texturePage--;e.version++}}getRasterizedGlyphCombinedChar(e,t,i,s,r){return this._getFromCacheMap(this._cacheMapCombined,e,t,i,s,r)}getRasterizedGlyph(e,t,i,s,r){return this._getFromCacheMap(this._cacheMap,e,t,i,s,r)}_getFromCacheMap(e,t,i,s,r,o=!1){return v=e.get(t,i,s,r),v||(v=this._drawToCache(t,i,s,r,o),e.set(t,i,s,r,v)),v}_getColorFromAnsiIndex(e){if(e>=this._config.colors.ansi.length)throw new Error("No color found for idx "+e);return this._config.colors.ansi[e]}_getBackgroundColor(e,t,i,s){if(this._config.allowTransparency)return a.NULL_COLOR;let r;switch(e){case 16777216:case 33554432:r=this._getColorFromAnsiIndex(t);break;case 50331648:const e=d.AttributeData.toColorRGB(t);r=a.rgba.toColor(e[0],e[1],e[2]);break;default:r=i?a.color.opaque(this._config.colors.foreground):this._config.colors.background}return r}_getForegroundColor(e,t,i,s,o,n,h,l,c,_){const u=this._getMinimumContrastColor(e,t,i,s,o,n,!1,c,l,_);if(u)return u;let g;switch(o){case 16777216:case 33554432:this._config.drawBoldTextInBrightColors&&c&&n<8&&(n+=8),g=this._getColorFromAnsiIndex(n);break;case 50331648:const e=d.AttributeData.toColorRGB(n);g=a.rgba.toColor(e[0],e[1],e[2]);break;default:g=h?this._config.colors.background:this._config.colors.foreground}return this._config.allowTransparency&&(g=a.color.opaque(g)),l&&(g=a.color.multiplyOpacity(g,r.DIM_OPACITY)),g}_resolveBackgroundRgba(e,t,i){switch(e){case 16777216:case 33554432:return this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.foreground.rgba:this._config.colors.background.rgba}}_resolveForegroundRgba(e,t,i,s){switch(e){case 16777216:case 33554432:return this._config.drawBoldTextInBrightColors&&s&&t<8&&(t+=8),this._getColorFromAnsiIndex(t).rgba;case 50331648:return t<<8;default:return i?this._config.colors.background.rgba:this._config.colors.foreground.rgba}}_getMinimumContrastColor(e,t,i,s,r,o,n,h,l,c){if(1===this._config.minimumContrastRatio||c)return;const d=this._getContrastCache(l),_=d.getColor(e,s);if(void 0!==_)return _||void 0;const u=this._resolveBackgroundRgba(t,i,n),g=this._resolveForegroundRgba(r,o,n,h),v=a.rgba.ensureContrastRatio(u,g,this._config.minimumContrastRatio/(l?2:1));if(!v)return void d.setColor(e,s,null);const f=a.rgba.toColor(v>>24&255,v>>16&255,v>>8&255);return d.setColor(e,s,f),f}_getContrastCache(e){return e?this._config.colors.halfContrastCache:this._config.colors.contrastCache}_drawToCache(e,t,i,s,a=!1){const h="number"==typeof e?String.fromCharCode(e):e,l=Math.min(this._config.deviceCellWidth*Math.max(h.length,2)+4,this._textureSize);this._tmpCanvas.width<l&&(this._tmpCanvas.width=l);const c=Math.min(this._config.deviceCellHeight+8,this._textureSize);if(this._tmpCanvas.height<c&&(this._tmpCanvas.height=c),this._tmpCtx.save(),this._workAttributeData.fg=i,this._workAttributeData.bg=t,this._workAttributeData.extended.ext=s,this._workAttributeData.isInvisible())return g;const _=!!this._workAttributeData.isBold(),u=!!this._workAttributeData.isInverse(),v=!!this._workAttributeData.isDim(),p=!!this._workAttributeData.isItalic(),m=!!this._workAttributeData.isUnderline(),L=!!this._workAttributeData.isStrikethrough(),x=!!this._workAttributeData.isOverline();let w=this._workAttributeData.getFgColor(),b=this._workAttributeData.getFgColorMode(),R=this._workAttributeData.getBgColor(),M=this._workAttributeData.getBgColorMode();if(u){const e=w;w=R,R=e;const t=b;b=M,M=t}const y=this._getBackgroundColor(M,R,u,v);this._tmpCtx.globalCompositeOperation="copy",this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.globalCompositeOperation="source-over";const A=_?this._config.fontWeightBold:this._config.fontWeight,E=p?"italic":"";this._tmpCtx.font=`${E} ${A} ${this._config.fontSize*this._config.devicePixelRatio}px ${this._config.fontFamily}`,this._tmpCtx.textBaseline=r.TEXT_BASELINE;const S=1===h.length&&(0,n.isPowerlineGlyph)(h.charCodeAt(0)),T=1===h.length&&(0,n.isRestrictedPowerlineGlyph)(h.charCodeAt(0)),D=this._getForegroundColor(t,M,R,i,b,w,u,v,_,(0,n.excludeFromContrastRatioDemands)(h.charCodeAt(0)));this._tmpCtx.fillStyle=D.css;const P=T?0:4;let F=!1;!1!==this._config.customGlyphs&&(F=(0,o.tryDrawCustomChar)(this._tmpCtx,h,P,P,this._config.deviceCellWidth,this._config.deviceCellHeight,this._config.fontSize,this._config.devicePixelRatio));let B,I=!S;if(B="number"==typeof e?this._unicodeService.wcwidth(e):this._unicodeService.getStringCellWidth(e),m){this._tmpCtx.save();const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;if(this._tmpCtx.lineWidth=e,this._workAttributeData.isUnderlineColorDefault())this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle;else if(this._workAttributeData.isUnderlineColorRGB())I=!1,this._tmpCtx.strokeStyle=`rgb(${d.AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(",")})`;else{I=!1;let e=this._workAttributeData.getUnderlineColor();this._config.drawBoldTextInBrightColors&&this._workAttributeData.isBold()&&e<8&&(e+=8),this._tmpCtx.strokeStyle=this._getColorFromAnsiIndex(e).css}this._tmpCtx.beginPath();const i=P,s=Math.ceil(P+this._config.deviceCharHeight)-t-(a?2*e:0),r=s+e,o=s+2*e;for(let n=0;n<B;n++){this._tmpCtx.save();const a=i+n*this._config.deviceCellWidth,h=i+(n+1)*this._config.deviceCellWidth,l=a+this._config.deviceCellWidth/2;switch(this._workAttributeData.extended.underlineStyle){case 2:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s),this._tmpCtx.moveTo(a,o),this._tmpCtx.lineTo(h,o);break;case 3:const i=e<=1?o:Math.ceil(P+this._config.deviceCharHeight-e/2)-t,n=e<=1?s:Math.ceil(P+this._config.deviceCharHeight+e/2)-t,c=new Path2D;c.rect(a,s,this._config.deviceCellWidth,o-s),this._tmpCtx.clip(c),this._tmpCtx.moveTo(a-this._config.deviceCellWidth/2,r),this._tmpCtx.bezierCurveTo(a-this._config.deviceCellWidth/2,n,a,n,a,r),this._tmpCtx.bezierCurveTo(a,i,l,i,l,r),this._tmpCtx.bezierCurveTo(l,n,h,n,h,r),this._tmpCtx.bezierCurveTo(h,i,h+this._config.deviceCellWidth/2,i,h+this._config.deviceCellWidth/2,r);break;case 4:this._tmpCtx.setLineDash([Math.round(e),Math.round(e)]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;case 5:this._tmpCtx.setLineDash([4*this._config.devicePixelRatio,3*this._config.devicePixelRatio]),this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s);break;default:this._tmpCtx.moveTo(a,s),this._tmpCtx.lineTo(h,s)}this._tmpCtx.stroke(),this._tmpCtx.restore()}if(this._tmpCtx.restore(),!F&&this._config.fontSize>=12&&!this._config.allowTransparency&&" "!==h){this._tmpCtx.save(),this._tmpCtx.textBaseline="alphabetic";const t=this._tmpCtx.measureText(h);if(this._tmpCtx.restore(),"actualBoundingBoxDescent"in t&&t.actualBoundingBoxDescent>0){this._tmpCtx.save();const t=new Path2D;t.rect(i,s-Math.ceil(e/2),this._config.deviceCellWidth*B,o-s+Math.ceil(e/2)),this._tmpCtx.clip(t),this._tmpCtx.lineWidth=3*this._config.devicePixelRatio,this._tmpCtx.strokeStyle=y.css,this._tmpCtx.strokeText(h,P,P+this._config.deviceCharHeight),this._tmpCtx.restore()}}}if(x){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/15)),t=e%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+t),this._tmpCtx.stroke()}if(F||this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight),"_"===h&&!this._config.allowTransparency){let e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I);if(e)for(let t=1;t<=5&&(this._tmpCtx.save(),this._tmpCtx.fillStyle=y.css,this._tmpCtx.fillRect(0,0,this._tmpCanvas.width,this._tmpCanvas.height),this._tmpCtx.restore(),this._tmpCtx.fillText(h,P,P+this._config.deviceCharHeight-t),e=C(this._tmpCtx.getImageData(P,P,this._config.deviceCellWidth,this._config.deviceCellHeight),y,D,I),e);t++);}if(L){const e=Math.max(1,Math.floor(this._config.fontSize*this._config.devicePixelRatio/10)),t=this._tmpCtx.lineWidth%2==1?.5:0;this._tmpCtx.lineWidth=e,this._tmpCtx.strokeStyle=this._tmpCtx.fillStyle,this._tmpCtx.beginPath(),this._tmpCtx.moveTo(P,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.lineTo(P+this._config.deviceCharWidth*B,P+Math.floor(this._config.deviceCharHeight/2)-t),this._tmpCtx.stroke()}this._tmpCtx.restore();const O=this._tmpCtx.getImageData(0,0,this._tmpCanvas.width,this._tmpCanvas.height);let $;if($=this._config.allowTransparency?function(e){for(let t=0;t<e.data.length;t+=4)if(e.data[t+3]>0)return!1;return!0}(O):C(O,y,D,I),$)return g;const k=this._findGlyphBoundingBox(O,this._workBoundingBox,l,T,F,P);let U,N;for(;;){if(0===this._activePages.length){const e=this._createNewPage();U=e,N=e.currentRow,N.height=k.size.y;break}U=this._activePages[this._activePages.length-1],N=U.currentRow;for(const e of this._activePages)k.size.y<=e.currentRow.height&&(U=e,N=e.currentRow);for(let e=this._activePages.length-1;e>=0;e--)for(const t of this._activePages[e].fixedRows)t.height<=N.height&&k.size.y<=t.height&&(U=this._activePages[e],N=t);if(N.y+k.size.y>=U.canvas.height||N.height>k.size.y+2){let e=!1;if(U.currentRow.y+U.currentRow.height+k.size.y>=U.canvas.height){let t;for(const e of this._activePages)if(e.currentRow.y+e.currentRow.height+k.size.y<e.canvas.height){t=e;break}if(t)U=t;else if(f.maxAtlasPages&&this._pages.length>=f.maxAtlasPages&&N.y+k.size.y<=U.canvas.height&&N.height>=k.size.y&&N.x+k.size.x<=U.canvas.width)e=!0;else{const t=this._createNewPage();U=t,N=t.currentRow,N.height=k.size.y,e=!0}}e||(U.currentRow.height>0&&U.fixedRows.push(U.currentRow),N={x:0,y:U.currentRow.y+U.currentRow.height,height:k.size.y},U.fixedRows.push(N),U.currentRow={x:0,y:N.y+N.height,height:0})}if(N.x+k.size.x<=U.canvas.width)break;N===U.currentRow?(N.x=0,N.y+=N.height,N.height=0):U.fixedRows.splice(U.fixedRows.indexOf(N),1)}return k.texturePage=this._pages.indexOf(U),k.texturePosition.x=N.x,k.texturePosition.y=N.y,k.texturePositionClipSpace.x=N.x/U.canvas.width,k.texturePositionClipSpace.y=N.y/U.canvas.height,k.sizeClipSpace.x/=U.canvas.width,k.sizeClipSpace.y/=U.canvas.height,N.height=Math.max(N.height,k.size.y),N.x+=k.size.x,U.ctx.putImageData(O,k.texturePosition.x-this._workBoundingBox.left,k.texturePosition.y-this._workBoundingBox.top,this._workBoundingBox.left,this._workBoundingBox.top,k.size.x,k.size.y),U.addGlyph(k),U.version++,k}_findGlyphBoundingBox(e,t,i,s,r,o){t.top=0;const n=s?this._config.deviceCellHeight:this._tmpCanvas.height,a=s?this._config.deviceCellWidth:i;let h=!1;for(let i=0;i<n;i++){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.top=i,h=!0;break}}if(h)break}t.left=0,h=!1;for(let i=0;i<o+a;i++){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.left=i,h=!0;break}}if(h)break}t.right=a,h=!1;for(let i=o+a-1;i>=o;i--){for(let s=0;s<n;s++){const r=s*this._tmpCanvas.width*4+4*i+3;if(0!==e.data[r]){t.right=i,h=!0;break}}if(h)break}t.bottom=n,h=!1;for(let i=n-1;i>=0;i--){for(let s=0;s<a;s++){const r=i*this._tmpCanvas.width*4+4*s+3;if(0!==e.data[r]){t.bottom=i,h=!0;break}}if(h)break}return{texturePage:0,texturePosition:{x:0,y:0},texturePositionClipSpace:{x:0,y:0},size:{x:t.right-t.left+1,y:t.bottom-t.top+1},sizeClipSpace:{x:t.right-t.left+1,y:t.bottom-t.top+1},offset:{x:-t.left+o+(s||r?Math.floor((this._config.deviceCellWidth-this._config.deviceCharWidth)/2):0),y:-t.top+o+(s||r?1===this._config.lineHeight?0:Math.round((this._config.deviceCellHeight-this._config.deviceCharHeight)/2):0)}}}}t.TextureAtlas=f,s([u.traceCall],f.prototype,"_drawToCache",null);class p{get percentageUsed(){return this._usedPixels/(this.canvas.width*this.canvas.height)}get glyphs(){return this._glyphs}addGlyph(e){this._glyphs.push(e),this._usedPixels+=e.size.x*e.size.y}constructor(e,t,i){if(this._usedPixels=0,this._glyphs=[],this.version=0,this.currentRow={x:0,y:0,height:0},this.fixedRows=[],i)for(const e of i)this._glyphs.push(...e.glyphs),this._usedPixels+=e._usedPixels;this.canvas=m(e,t,t),this.ctx=(0,n.throwIfFalsy)(this.canvas.getContext("2d",{alpha:!0}))}clear(){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.currentRow.x=0,this.currentRow.y=0,this.currentRow.height=0,this.fixedRows.length=0,this.version++}}function C(e,t,i,s){const r=t.rgba>>>24,o=t.rgba>>>16&255,n=t.rgba>>>8&255,a=i.rgba>>>24,h=i.rgba>>>16&255,l=i.rgba>>>8&255,c=Math.floor((Math.abs(r-a)+Math.abs(o-h)+Math.abs(n-l))/12);let d=!0;for(let t=0;t<e.data.length;t+=4)e.data[t]===r&&e.data[t+1]===o&&e.data[t+2]===n||s&&Math.abs(e.data[t]-r)+Math.abs(e.data[t+1]-o)+Math.abs(e.data[t+2]-n)<c?e.data[t+3]=0:d=!1;return d}function m(e,t,i){const s=e.createElement("canvas");return s.width=t,s.height=i,s}},160:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(399);let r=0,o=0,n=0,a=0;var h,l,c,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function g(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${u(e)}${u(t)}${u(i)}${u(s)}`:`#${u(e)}${u(t)}${u(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,o,n]=_.toChannels(e.rgba),{css:h.toCss(r,o,n,a),rgba:h.toRgba(r,o,n,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,l=t.rgba>>8&255,c=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=c+Math.round((i-c)*a),o=d+Math.round((s-d)*a),n=_+Math.round((l-_)*a),{css:h.toCss(r,o,n),rgba:h.toRgba(r,o,n)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,o,n]=_.toChannels(t),{css:h.toCss(r,o,n),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(l||(t.color=l={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,o,n);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),o=parseInt(e.slice(2,3).repeat(2),16),n=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,o,n,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),o=parseInt(s[2]),n=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,o,n,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,o,n,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,o,n,a),css:e}}}(c||(t.css=c={})),function(e){function t(e,t,i){const s=e/255,r=t/255,o=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n>0||a>0||h>0);)n-=Math.max(0,Math.ceil(.1*n)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,o=e>>8&255;let n=t>>24&255,a=t>>16&255,h=t>>8&255,l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));for(;l<i&&(n<255||a<255||h<255);)n=Math.min(255,n+Math.ceil(.1*(255-n))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),l=g(d.relativeLuminance2(n,a,h),d.relativeLuminance2(s,r,o));return(n<<24|a<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,s,r){const o=d.relativeLuminance(e>>8),n=d.relativeLuminance(s>>8);if(g(o,n)<r){if(n<o){const n=t(e,s,r),a=g(o,d.relativeLuminance(n>>8));if(a<r){const t=i(e,s,r);return a>g(o,d.relativeLuminance(t>>8))?n:t}return n}const a=i(e,s,r),h=g(o,d.relativeLuminance(a>>8));if(h<r){const i=t(e,s,r);return h>g(o,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=g},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))}},859:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,o){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,o)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},399:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},385:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(399);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class o extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=o,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:o,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},147:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},782:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(133),r=i(855),o=i(147);class n extends o.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new o.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new n;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=n},855:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},133:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let o=r;o<i;++o){const r=e.charCodeAt(o);if(55296<=r&&r<=56319){if(++o>=i)return this._interim=r,s;const n=e.charCodeAt(o);56320<=n&&n<=57343?t[s++]=1024*(r-55296)+n-56320+65536:(t[s++]=r,t[s++]=n)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,o,n,a=0,h=0,l=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let o,n=0;for(;(o=63&this.interim[++n])&&n<4;)r<<=6,r|=o;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,c=h-n;for(;l<c;){if(l>=i)return 0;if(o=e[l++],128!=(192&o)){l--,s=!0;break}this.interim[n++]=o,r<<=6,r|=63&o}s||(2===h?r<128?l--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const c=i-4;let d=l;for(;d<i;){for(;!(!(d<c)||128&(s=e[d])||128&(r=e[d+1])||128&(o=e[d+2])||128&(n=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=o,t[a++]=n,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&o,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(o=e[d++],128!=(192&o)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=o,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&o)<<6|63&n,h<65536||h>1114111)continue;t[a++]=h}}return a}}},776:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,o=arguments.length,n=o<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(n=(o<3?r(n):o>3?r(t,i,n):r(t,i))||n);return o>3&&n&&Object.defineProperty(t,i,n),n},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const o=i(859),n=i(97),a={trace:n.LogLevelEnum.TRACE,debug:n.LogLevelEnum.DEBUG,info:n.LogLevelEnum.INFO,warn:n.LogLevelEnum.WARN,error:n.LogLevelEnum.ERROR,off:n.LogLevelEnum.OFF};let h,l=t.LogService=class extends o.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=n.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.TRACE&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.trace.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}debug(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.DEBUG&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.debug.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}info(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.INFO&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.info.bind(this._optionsService.options.logger))&&void 0!==s?s:console.info,e,t)}warn(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.WARN&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.warn.bind(this._optionsService.options.logger))&&void 0!==s?s:console.warn,e,t)}error(e,...t){var i,s;this._logLevel<=n.LogLevelEnum.ERROR&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.error.bind(this._optionsService.options.logger))&&void 0!==s?s:console.error,e,t)}};t.LogService=l=s([r(0,n.IOptionsService)],l),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==n.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},726:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,o){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,o)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},97:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(726);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var o=t[s]={exports:{}};return e[s].call(o.exports,o,o.exports,i),o.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.WebglAddon=void 0;const t=i(345),r=i(859),o=i(399),n=i(666),a=i(776);class h extends r.Disposable{constructor(e){if(o.isSafari&&(0,o.getSafariVersion)()<16)throw new Error("Webgl2 is only supported on Safari 16 and above");super(),this._preserveDrawingBuffer=e,this._onChangeTextureAtlas=this.register(new t.EventEmitter),this.onChangeTextureAtlas=this._onChangeTextureAtlas.event,this._onAddTextureAtlasCanvas=this.register(new t.EventEmitter),this.onAddTextureAtlasCanvas=this._onAddTextureAtlasCanvas.event,this._onRemoveTextureAtlasCanvas=this.register(new t.EventEmitter),this.onRemoveTextureAtlasCanvas=this._onRemoveTextureAtlasCanvas.event,this._onContextLoss=this.register(new t.EventEmitter),this.onContextLoss=this._onContextLoss.event}activate(e){const i=e._core;if(!e.element)return void this.register(i.onWillOpen((()=>this.activate(e))));this._terminal=e;const s=i.coreService,o=i.optionsService,h=i,l=h._renderService,c=h._characterJoinerService,d=h._charSizeService,_=h._coreBrowserService,u=h._decorationService,g=h._logService,v=h._themeService;(0,a.setTraceLogger)(g),this._renderer=this.register(new n.WebglRenderer(e,c,d,_,s,u,o,v,this._preserveDrawingBuffer)),this.register((0,t.forwardEvent)(this._renderer.onContextLoss,this._onContextLoss)),this.register((0,t.forwardEvent)(this._renderer.onChangeTextureAtlas,this._onChangeTextureAtlas)),this.register((0,t.forwardEvent)(this._renderer.onAddTextureAtlasCanvas,this._onAddTextureAtlasCanvas)),this.register((0,t.forwardEvent)(this._renderer.onRemoveTextureAtlasCanvas,this._onRemoveTextureAtlasCanvas)),l.setRenderer(this._renderer),this.register((0,r.toDisposable)((()=>{const t=this._terminal._core._renderService;t.setRenderer(this._terminal._core._createRenderer()),t.handleResize(e.cols,e.rows)})))}get textureAtlas(){var e;return null===(e=this._renderer)||void 0===e?void 0:e.textureAtlas}clearTextureAtlas(){var e;null===(e=this._renderer)||void 0===e||e.clearTextureAtlas()}}e.WebglAddon=h})(),s})()));
+//# sourceMappingURL=xterm-addon-webgl.js.map
\ No newline at end of file
diff --git a/xterm.js/src/xterm-addon-webgl.js.map b/xterm.js/src/xterm-addon-webgl.js.map
new file mode 100644 (file)
index 0000000..76b373b
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"xterm-addon-webgl.js","mappings":"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","sources":["webpack://WebglAddon/webpack/universalModuleDefinition","webpack://WebglAddon/./src/GlyphRenderer.ts","webpack://WebglAddon/./src/RectangleRenderer.ts","webpack://WebglAddon/./src/RenderModel.ts","webpack://WebglAddon/./src/WebglRenderer.ts","webpack://WebglAddon/./src/WebglUtils.ts","webpack://WebglAddon/./src/renderLayer/BaseRenderLayer.ts","webpack://WebglAddon/./src/renderLayer/LinkRenderLayer.ts","webpack://WebglAddon/../../src/browser/Lifecycle.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CellColorResolver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasCache.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CharAtlasUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/Constants.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CursorBlinkStateManager.ts","webpack://WebglAddon/../../src/browser/renderer/shared/CustomGlyphs.ts","webpack://WebglAddon/../../src/browser/renderer/shared/DevicePixelObserver.ts","webpack://WebglAddon/../../src/browser/renderer/shared/RendererUtils.ts","webpack://WebglAddon/../../src/browser/renderer/shared/SelectionRenderModel.ts","webpack://WebglAddon/../../src/browser/renderer/shared/TextureAtlas.ts","webpack://WebglAddon/../../src/common/Color.ts","webpack://WebglAddon/../../src/common/EventEmitter.ts","webpack://WebglAddon/../../src/common/Lifecycle.ts","webpack://WebglAddon/../../src/common/MultiKeyMap.ts","webpack://WebglAddon/../../src/common/Platform.ts","webpack://WebglAddon/../../src/common/TaskQueue.ts","webpack://WebglAddon/../../src/common/buffer/AttributeData.ts","webpack://WebglAddon/../../src/common/buffer/CellData.ts","webpack://WebglAddon/../../src/common/buffer/Constants.ts","webpack://WebglAddon/../../src/common/input/TextDecoder.ts","webpack://WebglAddon/../../src/common/services/LogService.ts","webpack://WebglAddon/../../src/common/services/ServiceRegistry.ts","webpack://WebglAddon/../../src/common/services/Services.ts","webpack://WebglAddon/webpack/bootstrap","webpack://WebglAddon/./src/WebglAddon.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WebglAddon\"] = factory();\n\telse\n\t\troot[\"WebglAddon\"] = factory();\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { traceCall } from 'common/services/LogService';\nimport { Terminal } from 'xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\n\ninterface IVertices {\n  attributes: Float32Array;\n  /**\n   * These buffers are the ones used to bind to WebGL, the reason there are\n   * multiple is to allow double buffering to work as you cannot modify the\n   * buffer while it's being used by the GPU. Having multiple lets us start\n   * working on the next frame.\n   */\n  attributesBuffers: Float32Array[];\n  count: number;\n}\n\nconst enum VertexAttribLocations {\n  UNIT_QUAD = 0,\n  CELL_POSITION = 1,\n  OFFSET = 2,\n  SIZE = 3,\n  TEXPAGE = 4,\n  TEXCOORD = 5,\n  TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n  vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_texpage = int(a_texpage);\n  v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n  let textureConditionals = '';\n  for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n    textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n  }\n  return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n  if (v_texpage == 0) {\n    outColor = texture(u_texture[0], v_texcoord);\n  } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n  private readonly _program: WebGLProgram;\n  private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n  private readonly _projectionLocation: WebGLUniformLocation;\n  private readonly _resolutionLocation: WebGLUniformLocation;\n  private readonly _textureLocation: WebGLUniformLocation;\n  private readonly _atlasTextures: GLTexture[];\n  private readonly _attributesBuffer: WebGLBuffer;\n\n  private _atlas: ITextureAtlas | undefined;\n  private _activeBuffer: number = 0;\n  private readonly _vertices: IVertices = {\n    count: 0,\n    attributes: new Float32Array(0),\n    attributesBuffers: [\n      new Float32Array(0),\n      new Float32Array(0)\n    ]\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    if (TextureAtlas.maxAtlasPages === undefined) {\n      // Typically 8 or 16\n      TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n      // Almost all clients will support >= 4096\n      TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n    }\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n    this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n    this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n    gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n    // Setup static uniforms\n    gl.useProgram(this._program);\n    const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      textureUnits[i] = i;\n    }\n    gl.uniform1iv(this._textureLocation, textureUnits);\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n    // is ever drawn it will show characters as red rectangles.\n    this._atlasTextures = [];\n    for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n      const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n      this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n      gl.activeTexture(gl.TEXTURE0 + i);\n      gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n      this._atlasTextures[i] = glTexture;\n    }\n\n    // Allow drawing of transparent texture\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n    // Set viewport\n    this.handleResize();\n  }\n\n  public beginFrame(): boolean {\n    return this._atlas ? this._atlas.beginFrame() : true;\n  }\n\n  @traceCall\n  public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n    // should not instantiate any variables unless a new glyph is drawn to the cache where the\n    // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n    // each glyph.\n    this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg);\n  }\n\n  private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number): void {\n    $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n    // Exit early if this is a null character, allow space character to continue as it may have\n    // underline/strikethrough styles\n    if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n      array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n      return;\n    }\n\n    if (!this._atlas) {\n      return;\n    }\n\n    // Get the glyph\n    if (chars && chars.length > 1) {\n      $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n    } else {\n      $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n    }\n\n    $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n    if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n      $clippedPixels = $glyph.offset.x - $leftCellPadding;\n      // a_origin\n      array[$i    ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    } else {\n      // a_origin\n      array[$i    ] = -$glyph.offset.x + this._dimensions.device.char.left;\n      array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n      // a_size\n      array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n      array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n      // a_texpage\n      array[$i + 4] = $glyph.texturePage;\n      // a_texcoord\n      array[$i + 5] = $glyph.texturePositionClipSpace.x;\n      array[$i + 6] = $glyph.texturePositionClipSpace.y;\n      // a_texsize\n      array[$i + 7] = $glyph.sizeClipSpace.x;\n      array[$i + 8] = $glyph.sizeClipSpace.y;\n    }\n    // a_cellpos only changes on resize\n  }\n\n  public clear(): void {\n    const terminal = this._terminal;\n    const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n    // Clear vertices\n    if (this._vertices.count !== newCount) {\n      this._vertices.attributes = new Float32Array(newCount);\n    } else {\n      this._vertices.attributes.fill(0);\n    }\n    let i = 0;\n    for (; i < this._vertices.attributesBuffers.length; i++) {\n      if (this._vertices.count !== newCount) {\n        this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n      } else {\n        this._vertices.attributesBuffers[i].fill(0);\n      }\n    }\n    this._vertices.count = newCount;\n    i = 0;\n    for (let y = 0; y < terminal.rows; y++) {\n      for (let x = 0; x < terminal.cols; x++) {\n        this._vertices.attributes[i + 9] = x / terminal.cols;\n        this._vertices.attributes[i + 10] = y / terminal.rows;\n        i += INDICES_PER_CELL;\n      }\n    }\n  }\n\n  public handleResize(): void {\n    const gl = this._gl;\n    gl.useProgram(this._program);\n    gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n    gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n    this.clear();\n  }\n\n  public render(renderModel: IRenderModel): void {\n    if (!this._atlas) {\n      return;\n    }\n\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n    this._activeBuffer = (this._activeBuffer + 1) % 2;\n    const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n    // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n    // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n    // The reasons for this are as follows:\n    // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n    // - To copy either the normal attributes buffer or the selection attributes buffer when there\n    //   is a selection\n    // - So we don't send vertices for all the line-ending whitespace to the GPU\n    let bufferLength = 0;\n    for (let y = 0; y < renderModel.lineLengths.length; y++) {\n      const si = y * this._terminal.cols * INDICES_PER_CELL;\n      const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n      activeBuffer.set(sub, bufferLength);\n      bufferLength += sub.length;\n    }\n\n    // Bind the attributes buffer\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n    // Bind the atlas page texture if they have changed\n    for (let i = 0; i < this._atlas.pages.length; i++) {\n      if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n        this._bindAtlasPageTexture(gl, this._atlas, i);\n      }\n    }\n\n    // Draw the viewport\n    gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n  }\n\n  public setAtlas(atlas: ITextureAtlas): void {\n    this._atlas = atlas;\n    for (const glTexture of this._atlasTextures) {\n      glTexture.version = -1;\n    }\n  }\n\n  private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n    gl.activeTexture(gl.TEXTURE0 + i);\n    gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n    gl.generateMipmap(gl.TEXTURE_2D);\n    this._atlasTextures[i].version = atlas.pages[i].version;\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from 'xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n  POSITION = 0,\n  SIZE = 1,\n  COLOR = 2,\n  UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n  vec2 zeroToOne = a_position + (a_unitquad * a_size);\n  gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n  v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n  outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n  public attributes: Float32Array;\n  public count: number;\n\n  constructor() {\n    this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n    this.count = 0;\n  }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n  private _program: WebGLProgram;\n  private _vertexArrayObject: IWebGLVertexArrayObject;\n  private _attributesBuffer: WebGLBuffer;\n  private _projectionLocation: WebGLUniformLocation;\n  private _bgFloat!: Float32Array;\n  private _cursorFloat!: Float32Array;\n\n  private _vertices: Vertices = new Vertices();\n  private _verticesCursor: Vertices = new Vertices();\n\n  constructor(\n    private _terminal: Terminal,\n    private _gl: IWebGL2RenderingContext,\n    private _dimensions: IRenderDimensions,\n    private readonly _themeService: IThemeService\n  ) {\n    super();\n\n    const gl = this._gl;\n\n    this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n    this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n    // Uniform locations\n    this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n    // Create and set the vertex array object\n    this._vertexArrayObject = gl.createVertexArray();\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    // Setup a_unitquad, this defines the 4 vertices of a rectangle\n    const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n    const unitQuadVerticesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n    gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n    // Setup the unit quad element array buffer, this points to indices in\n    // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n    // triangle strip\n    const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n    const elementIndicesBuffer = gl.createBuffer();\n    this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n    // Setup attributes\n    this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n    this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n    gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n    gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n    gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n    gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n    gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n    gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n    this._updateCachedColors(_themeService.colors);\n    this.register(this._themeService.onChangeColors(e => {\n      this._updateCachedColors(e);\n      this._updateViewportRectangle();\n    }));\n  }\n\n  public renderBackgrounds(): void {\n    this._renderVertices(this._vertices);\n  }\n\n  public renderCursor(): void {\n    this._renderVertices(this._verticesCursor);\n  }\n\n  private _renderVertices(vertices: Vertices): void {\n    const gl = this._gl;\n\n    gl.useProgram(this._program);\n\n    gl.bindVertexArray(this._vertexArrayObject);\n\n    gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n    // Bind attributes buffer and draw\n    gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n    gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n  }\n\n  public handleResize(): void {\n    this._updateViewportRectangle();\n  }\n\n  public setDimensions(dimensions: IRenderDimensions): void {\n    this._dimensions = dimensions;\n  }\n\n  private _updateCachedColors(colors: ReadonlyColorSet): void {\n    this._bgFloat = this._colorToFloat32Array(colors.background);\n    this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n  }\n\n  private _updateViewportRectangle(): void {\n    // Set first rectangle that clears the screen\n    this._addRectangleFloat(\n      this._vertices.attributes,\n      0,\n      0,\n      0,\n      this._terminal.cols * this._dimensions.device.cell.width,\n      this._terminal.rows * this._dimensions.device.cell.height,\n      this._bgFloat\n    );\n  }\n\n  public updateBackgrounds(model: IRenderModel): void {\n    const terminal = this._terminal;\n    const vertices = this._vertices;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let rectangleCount = 1;\n    let y: number;\n    let x: number;\n    let currentStartX: number;\n    let currentBg: number;\n    let currentFg: number;\n    let currentInverse: boolean;\n    let modelIndex: number;\n    let bg: number;\n    let fg: number;\n    let inverse: boolean;\n    let offset: number;\n\n    for (y = 0; y < terminal.rows; y++) {\n      currentStartX = -1;\n      currentBg = 0;\n      currentFg = 0;\n      currentInverse = false;\n      for (x = 0; x < terminal.cols; x++) {\n        modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n        bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n        fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n        inverse = !!(fg & FgFlags.INVERSE);\n        if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n          // A rectangle needs to be drawn if going from non-default to another color\n          if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n            offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n            this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n          }\n          currentStartX = x;\n          currentBg = bg;\n          currentFg = fg;\n          currentInverse = inverse;\n        }\n      }\n      // Finish rectangle if it's still going\n      if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n        offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n        this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n      }\n    }\n    vertices.count = rectangleCount;\n  }\n\n  public updateCursor(model: IRenderModel): void {\n    const vertices = this._verticesCursor;\n    const cursor = model.cursor;\n    if (!cursor || cursor.style === 'block') {\n      vertices.count = 0;\n      return;\n    }\n\n    let offset: number;\n    let rectangleCount = 0;\n\n    if (cursor.style === 'bar' || cursor.style === 'outline') {\n      // Left edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'underline' || cursor.style === 'outline') {\n      // Bottom edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n    }\n    if (cursor.style === 'outline') {\n      // Top edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        cursor.x * this._dimensions.device.cell.width,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.width * this._dimensions.device.cell.width,\n        cursor.dpr,\n        this._cursorFloat\n      );\n      // Right edge\n      offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n      this._addRectangleFloat(\n        vertices.attributes,\n        offset,\n        (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n        cursor.y * this._dimensions.device.cell.height,\n        cursor.dpr,\n        this._dimensions.device.cell.height,\n        this._cursorFloat\n      );\n    }\n\n    vertices.count = rectangleCount;\n  }\n\n  private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n    if (fg & FgFlags.INVERSE) {\n      switch (fg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (fg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.foreground.rgba;\n      }\n    } else {\n      switch (bg & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n          break;\n        case Attributes.CM_RGB:\n          $rgba = (bg & Attributes.RGB_MASK) << 8;\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          $rgba = this._themeService.colors.background.rgba;\n      }\n    }\n\n    if (vertices.attributes.length < offset + 4) {\n      vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n    }\n    $x1 = startX * this._dimensions.device.cell.width;\n    $y1 = y * this._dimensions.device.cell.height;\n    $r = (($rgba >> 24) & 0xFF) / 255;\n    $g = (($rgba >> 16) & 0xFF) / 255;\n    $b = (($rgba >> 8 ) & 0xFF) / 255;\n    $a = 1;\n\n    this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n  }\n\n  private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = r;\n    array[offset + 5] = g;\n    array[offset + 6] = b;\n    array[offset + 7] = a;\n  }\n\n  private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n    array[offset    ] = x1 / this._dimensions.device.canvas.width;\n    array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n    array[offset + 2] = width / this._dimensions.device.canvas.width;\n    array[offset + 3] = height / this._dimensions.device.canvas.height;\n    array[offset + 4] = color[0];\n    array[offset + 5] = color[1];\n    array[offset + 6] = color[2];\n    array[offset + 7] = color[3];\n  }\n\n  private _colorToFloat32Array(color: IColor): Float32Array {\n    return new Float32Array([\n      ((color.rgba >> 24) & 0xFF) / 255,\n      ((color.rgba >> 16) & 0xFF) / 255,\n      ((color.rgba >> 8 ) & 0xFF) / 255,\n      ((color.rgba      ) & 0xFF) / 255\n    ]);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n  public cells: Uint32Array;\n  public lineLengths: Uint32Array;\n  public selection: ISelectionRenderModel;\n  public cursor?: ICursorRenderModel;\n\n  constructor() {\n    this.cells = new Uint32Array(0);\n    this.lineLengths = new Uint32Array(0);\n    this.selection = createSelectionRenderModel();\n  }\n\n  public resize(cols: number, rows: number): void {\n    const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n    if (indexCount !== this.cells.length) {\n      this.cells = new Uint32Array(indexCount);\n      this.lineLengths = new Uint32Array(rows);\n    }\n  }\n\n  public clear(): void {\n    this.cells.fill(0, 0);\n    this.lineLengths.fill(0, 0);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n  private _renderLayers: IRenderLayer[];\n  private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n  private _charAtlasDisposable = this.register(new MutableDisposable());\n  private _charAtlas: ITextureAtlas | undefined;\n  private _devicePixelRatio: number;\n\n  private _model: RenderModel = new RenderModel();\n  private _workCell: CellData = new CellData();\n  private _cellColorResolver: CellColorResolver;\n\n  private _canvas: HTMLCanvasElement;\n  private _gl: IWebGL2RenderingContext;\n  private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n  private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n  public readonly dimensions: IRenderDimensions;\n\n  private _core: ITerminal;\n  private _isAttached: boolean;\n  private _contextRestorationTimeout: number | undefined;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>());\n  public readonly onRequestRedraw = this._onRequestRedraw.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _terminal: Terminal,\n    private readonly _characterJoinerService: ICharacterJoinerService,\n    private readonly _charSizeService: ICharSizeService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _coreService: ICoreService,\n    private readonly _decorationService: IDecorationService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _themeService: IThemeService,\n    preserveDrawingBuffer?: boolean\n  ) {\n    super();\n\n    this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n    this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n    this._core = (this._terminal as any)._core;\n\n    this._renderLayers = [\n      new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier2, this._coreBrowserService, _optionsService, this._themeService)\n    ];\n    this.dimensions = createRenderDimensions();\n    this._devicePixelRatio = this._coreBrowserService.dpr;\n    this._updateDimensions();\n    this._updateCursorBlink();\n    this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this._canvas = document.createElement('canvas');\n\n    const contextAttributes = {\n      antialias: false,\n      depth: false,\n      preserveDrawingBuffer\n    };\n    this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n    if (!this._gl) {\n      throw new Error('WebGL2 not supported ' + this._gl);\n    }\n\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n      console.log('webglcontextlost event received');\n      // Prevent the default behavior in order to enable WebGL context restoration.\n      e.preventDefault();\n      // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n      // If not, dispatch the onContextLoss notification to observers.\n      this._contextRestorationTimeout = setTimeout(() => {\n        this._contextRestorationTimeout = undefined;\n        console.warn('webgl context not restored; firing onContextLoss');\n        this._onContextLoss.fire(e);\n      }, 3000 /* ms */);\n    }));\n    this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n      console.warn('webglcontextrestored event received');\n      clearTimeout(this._contextRestorationTimeout);\n      this._contextRestorationTimeout = undefined;\n      // The texture atlas and glyph renderer must be fully reinitialized\n      // because their contents have been lost.\n      removeTerminalFromCache(this._terminal);\n      this._initializeWebGLState();\n      this._requestRedrawViewport();\n    }));\n\n    this.register(observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)));\n\n    this._core.screenElement!.appendChild(this._canvas);\n\n    [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n    this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n    this.register(toDisposable(() => {\n      for (const l of this._renderLayers) {\n        l.dispose();\n      }\n      this._canvas.parentElement?.removeChild(this._canvas);\n      removeTerminalFromCache(this._terminal);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._charAtlas?.pages[0].canvas;\n  }\n\n  private _handleColorChange(): void {\n    this._refreshCharAtlas();\n\n    // Force a full refresh\n    this._clearModel(true);\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // If the device pixel ratio changed, the char atlas needs to be regenerated\n    // and the terminal needs to refreshed\n    if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n      this._devicePixelRatio = this._coreBrowserService.dpr;\n      this.handleResize(this._terminal.cols, this._terminal.rows);\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    // Update character and canvas dimensions\n    this._updateDimensions();\n\n    this._model.resize(this._terminal.cols, this._terminal.rows);\n\n    // Resize all render layers\n    for (const l of this._renderLayers) {\n      l.resize(this._terminal, this.dimensions);\n    }\n\n    // Resize the canvas\n    this._canvas.width = this.dimensions.device.canvas.width;\n    this._canvas.height = this.dimensions.device.canvas.height;\n    this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    // Resize the screen\n    this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n    this._rectangleRenderer.value?.setDimensions(this.dimensions);\n    this._rectangleRenderer.value?.handleResize();\n    this._glyphRenderer.value?.setDimensions(this.dimensions);\n    this._glyphRenderer.value?.handleResize();\n\n    this._refreshCharAtlas();\n\n    // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n    // so there is no need to clear it again here.\n    this._clearModel(false);\n  }\n\n  public handleCharSizeChanged(): void {\n    this.handleResize(this._terminal.cols, this._terminal.rows);\n  }\n\n  public handleBlur(): void {\n    for (const l of this._renderLayers) {\n      l.handleBlur(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.pause();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleFocus(): void {\n    for (const l of this._renderLayers) {\n      l.handleFocus(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.resume();\n    // Request a redraw for active/inactive selection background\n    this._requestRedrawViewport();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    for (const l of this._renderLayers) {\n      l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n    }\n    this._model.selection.update(this._terminal, start, end, columnSelectMode);\n    this._requestRedrawViewport();\n  }\n\n  public handleCursorMove(): void {\n    for (const l of this._renderLayers) {\n      l.handleCursorMove(this._terminal);\n    }\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n  }\n\n  private _handleOptionsChanged(): void {\n    this._updateDimensions();\n    this._refreshCharAtlas();\n    this._updateCursorBlink();\n  }\n\n  /**\n   * Initializes members dependent on WebGL context state.\n   */\n  private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n    this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n    this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions);\n\n    // Update dimensions and acquire char atlas\n    this.handleCharSizeChanged();\n\n    return [this._rectangleRenderer.value, this._glyphRenderer.value];\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   */\n  private _refreshCharAtlas(): void {\n    if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n      // Mark as not attached so char atlas gets refreshed on next render\n      this._isAttached = false;\n      return;\n    }\n\n    const atlas = acquireTextureAtlas(\n      this._terminal,\n      this._optionsService.rawOptions,\n      this._themeService.colors,\n      this.dimensions.device.cell.width,\n      this.dimensions.device.cell.height,\n      this.dimensions.device.char.width,\n      this.dimensions.device.char.height,\n      this._coreBrowserService.dpr\n    );\n    if (this._charAtlas !== atlas) {\n      this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n      this._charAtlasDisposable.value = getDisposeArrayDisposable([\n        forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n        forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n      ]);\n    }\n    this._charAtlas = atlas;\n    this._charAtlas.warmUp();\n    this._glyphRenderer.value?.setAtlas(this._charAtlas);\n  }\n\n  /**\n   * Clear the model.\n   * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n   * should be true generally to make sure it is in the same state as the model.\n   */\n  private _clearModel(clearGlyphRenderer: boolean): void {\n    this._model.clear();\n    if (clearGlyphRenderer) {\n      this._glyphRenderer.value?.clear();\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    this._charAtlas?.clearTexture();\n    this._clearModel(true);\n    this._requestRedrawViewport();\n  }\n\n  public clear(): void {\n    this._clearModel(true);\n    for (const l of this._renderLayers) {\n      l.reset(this._terminal);\n    }\n\n    this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n    this._updateCursorBlink();\n  }\n\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    return -1;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): boolean {\n    return false;\n  }\n\n  @traceCall\n  public renderRows(start: number, end: number): void {\n    if (!this._isAttached) {\n      if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n        this._updateDimensions();\n        this._refreshCharAtlas();\n        this._isAttached = true;\n      } else {\n        return;\n      }\n    }\n\n    // Update render layers\n    for (const l of this._renderLayers) {\n      l.handleGridChanged(this._terminal, start, end);\n    }\n\n    if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n      return;\n    }\n\n    // Tell renderer the frame is beginning\n    // upon a model clear also refresh the full viewport model\n    // (also triggered by an atlas page merge, part of #4480)\n    if (this._glyphRenderer.value.beginFrame()) {\n      this._clearModel(true);\n      this._updateModel(0, this._terminal.rows - 1);\n    } else {\n      // just update changed lines to draw\n      this._updateModel(start, end);\n    }\n\n    // Render\n    this._rectangleRenderer.value.renderBackgrounds();\n    this._glyphRenderer.value.render(this._model);\n    if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n      this._rectangleRenderer.value.renderCursor();\n    }\n  }\n\n  private _updateCursorBlink(): void {\n    if (this._terminal.options.cursorBlink) {\n      this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n        this._requestRedrawCursor();\n      }, this._coreBrowserService);\n    } else {\n      this._cursorBlinkStateManager.clear();\n    }\n    // Request a refresh from the terminal as management of rendering is being\n    // moved back to the terminal\n    this._requestRedrawCursor();\n  }\n\n  private _updateModel(start: number, end: number): void {\n    const terminal = this._core;\n    let cell: ICellData = this._workCell;\n\n    // Declare variable ahead of time to avoid garbage collection\n    let lastBg: number;\n    let y: number;\n    let row: number;\n    let line: IBufferLine;\n    let joinedRanges: [number, number][];\n    let isJoined: boolean;\n    let lastCharX: number;\n    let range: [number, number];\n    let chars: string;\n    let code: number;\n    let i: number;\n    let x: number;\n    let j: number;\n    start = clamp(start, terminal.rows - 1, 0);\n    end = clamp(end, terminal.rows - 1, 0);\n\n    const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n    // in case cursor.x == cols adjust visual cursor to cols - 1\n    const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n    let lastCursorX = -1;\n    const isCursorVisible =\n      this._coreService.isCursorInitialized &&\n      !this._coreService.isCursorHidden &&\n      (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n    this._model.cursor = undefined;\n    let modelUpdated = false;\n\n    for (y = start; y <= end; y++) {\n      row = y + terminal.buffer.ydisp;\n      line = terminal.buffer.lines.get(row)!;\n      this._model.lineLengths[y] = 0;\n      joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n      for (x = 0; x < terminal.cols; x++) {\n        lastBg = this._cellColorResolver.result.bg;\n        line.loadCell(x, cell);\n\n        if (x === 0) {\n          lastBg = this._cellColorResolver.result.bg;\n        }\n\n        // If true, indicates that the current character(s) to draw were joined.\n        isJoined = false;\n        lastCharX = x;\n\n        // Process any joined character ranges as needed. Because of how the\n        // ranges are produced, we know that they are valid for the characters\n        // and attributes of our input.\n        if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n          isJoined = true;\n          range = joinedRanges.shift()!;\n\n          // We already know the exact start and end column of the joined range,\n          // so we get the string and width representing it directly.\n          cell = new JoinedCellData(\n            cell,\n            line!.translateToString(true, range[0], range[1]),\n            range[1] - range[0]\n          );\n\n          // Skip over the cells occupied by this range in the loop\n          lastCharX = range[1] - 1;\n        }\n\n        chars = cell.getChars();\n        code = cell.getCode();\n        i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n        // Load colors/resolve overrides into work colors\n        this._cellColorResolver.resolve(cell, x, row);\n\n        // Override colors for cursor cell\n        if (isCursorVisible && row === cursorY) {\n          if (x === cursorX) {\n            this._model.cursor = {\n              x: cursorX,\n              y: this._terminal.buffer.active.cursorY,\n              width: cell.getWidth(),\n              style: this._coreBrowserService.isFocused ?\n                (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n              cursorWidth: terminal.options.cursorWidth,\n              dpr: this._devicePixelRatio\n            };\n            lastCursorX = cursorX + cell.getWidth() - 1;\n          }\n          if (x >= cursorX && x <= lastCursorX &&\n              ((this._coreBrowserService.isFocused &&\n              (terminal.options.cursorStyle || 'block') === 'block') ||\n              (this._coreBrowserService.isFocused === false &&\n              terminal.options.cursorInactiveStyle === 'block'))) {\n            this._cellColorResolver.result.fg =\n              Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n            this._cellColorResolver.result.bg =\n              Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n          }\n        }\n\n        if (code !== NULL_CELL_CODE) {\n          this._model.lineLengths[y] = x + 1;\n        }\n\n        // Nothing has changed, no updates needed\n        if (this._model.cells[i] === code &&\n            this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n            this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n            this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n          continue;\n        }\n\n        modelUpdated = true;\n\n        // Flag combined chars with a bit mask so they're easily identifiable\n        if (chars.length > 1) {\n          code |= COMBINED_CHAR_BIT_MASK;\n        }\n\n        // Cache the results in the model\n        this._model.cells[i] = code;\n        this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n        this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n        this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n        this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg);\n\n        if (isJoined) {\n          // Restore work cell\n          cell = this._workCell;\n\n          // Null out non-first cells\n          for (x++; x < lastCharX; x++) {\n            j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n            this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0);\n            this._model.cells[j] = NULL_CELL_CODE;\n            this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n            this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n            this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n          }\n        }\n      }\n    }\n    if (modelUpdated) {\n      this._rectangleRenderer.value!.updateBackgrounds(this._model);\n    }\n    this._rectangleRenderer.value!.updateCursor(this._model);\n  }\n\n  /**\n   * Recalculates the character and canvas dimensions.\n   */\n  private _updateDimensions(): void {\n    // Perform a new measure if the CharMeasure dimensions are not yet available\n    if (!this._charSizeService.width || !this._charSizeService.height) {\n      return;\n    }\n\n    // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n    // in order for the char atlas glyphs to not be blurry.\n    this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n    // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n    // floating point number in order to ensure there is enough space to draw the character to the\n    // cell.\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n    // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n    // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n    // will always be larger than device char height.\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n    // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n    // Calculate the device cell width, taking the letterSpacing into account.\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n    // Calculate the x offset with a cell that text should draw from in order for it to be centered\n    // correctly within the cell.\n    this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n    // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n    // the canvas\n    this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n    this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n    // The the size of the canvas on the page. It's important that this rounds to nearest integer\n    // and not ceils as browsers often have floating point precision issues where\n    // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n    // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n    // large for the canvas element size.\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n    // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n    // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n    // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n    // size on the canvas can differ.\n    this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n    this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n  }\n\n  private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n    if (this._canvas.width === width && this._canvas.height === height) {\n      return;\n    }\n    // While the actual canvas size has changed, keep device canvas dimensions as the value before\n    // the change as it's an exact multiple of the cell sizes.\n    this._canvas.width = width;\n    this._canvas.height = height;\n    this._requestRedrawViewport();\n  }\n\n  private _requestRedrawViewport(): void {\n    this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n  }\n\n  private _requestRedrawCursor(): void {\n    const cursorY = this._terminal.buffer.active.cursorY;\n    this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n  }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n  private _width: number;\n  // .content carries no meaning for joined CellData, simply nullify it\n  // thus we have to overload all other .content accessors\n  public content: number = 0;\n  public fg: number;\n  public bg: number;\n  public combinedData: string = '';\n\n  constructor(firstCell: ICellData, chars: string, width: number) {\n    super();\n    this.fg = firstCell.fg;\n    this.bg = firstCell.bg;\n    this.combinedData = chars;\n    this._width = width;\n  }\n\n  public isCombined(): number {\n    // always mark joined cell data as combined\n    return Content.IS_COMBINED_MASK;\n  }\n\n  public getWidth(): number {\n    return this._width;\n  }\n\n  public getChars(): string {\n    return this.combinedData;\n  }\n\n  public getCode(): number {\n    // code always gets the highest possible fake codepoint (read as -1)\n    // this is needed as code is used by caches as identifier\n    return 0x1FFFFF;\n  }\n\n  public setFromCharData(value: CharData): void {\n    throw new Error('not implemented');\n  }\n\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n  2, 0, 0, 0,\n  0, -2, 0, 0,\n  0, 0, 1, 0,\n  -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n  const program = throwIfFalsy(gl.createProgram());\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n  gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n  gl.linkProgram(program);\n  const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n  if (success) {\n    return program;\n  }\n\n  console.error(gl.getProgramInfoLog(program));\n  gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n  const shader = throwIfFalsy(gl.createShader(type));\n  gl.shaderSource(shader, source);\n  gl.compileShader(shader);\n  const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n  if (success) {\n    return shader;\n  }\n\n  console.error(gl.getShaderInfoLog(shader));\n  gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n  const newLength = Math.min(source.length * 2, max);\n  const newArray = new Float32Array(newLength);\n  for (let i = 0; i < source.length; i++) {\n    newArray[i] = source[i];\n  }\n  return newArray;\n}\n\nexport class GLTexture {\n  public texture: WebGLTexture;\n  public version: number;\n\n  constructor(texture: WebGLTexture) {\n    this.texture = texture;\n    this.version = -1;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n  private _canvas: HTMLCanvasElement;\n  protected _ctx!: CanvasRenderingContext2D;\n  private _deviceCharWidth: number = 0;\n  private _deviceCharHeight: number = 0;\n  private _deviceCellWidth: number = 0;\n  private _deviceCellHeight: number = 0;\n  private _deviceCharLeft: number = 0;\n  private _deviceCharTop: number = 0;\n\n  protected _charAtlas: ITextureAtlas | undefined;\n\n  constructor(\n    terminal: Terminal,\n    private _container: HTMLElement,\n    id: string,\n    zIndex: number,\n    private _alpha: boolean,\n    protected readonly _coreBrowserService: ICoreBrowserService,\n    protected readonly _optionsService: IOptionsService,\n    protected readonly _themeService: IThemeService\n  ) {\n    super();\n    this._canvas = document.createElement('canvas');\n    this._canvas.classList.add(`xterm-${id}-layer`);\n    this._canvas.style.zIndex = zIndex.toString();\n    this._initCanvas();\n    this._container.appendChild(this._canvas);\n    this.register(this._themeService.onChangeColors(e => {\n      this._refreshCharAtlas(terminal, e);\n      this.reset(terminal);\n    }));\n    this.register(toDisposable(() => {\n      this._canvas.remove();\n    }));\n  }\n\n  private _initCanvas(): void {\n    this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n  }\n\n  public handleBlur(terminal: Terminal): void {}\n  public handleFocus(terminal: Terminal): void {}\n  public handleCursorMove(terminal: Terminal): void {}\n  public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n  public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n  protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n    // Do nothing when alpha doesn't change\n    if (alpha === this._alpha) {\n      return;\n    }\n\n    // Create new canvas and replace old one\n    const oldCanvas = this._canvas;\n    this._alpha = alpha;\n    // Cloning preserves properties\n    this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n    this._initCanvas();\n    this._container.replaceChild(this._canvas, oldCanvas);\n\n    // Regenerate char atlas and force a full redraw\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n    this.handleGridChanged(terminal, 0, terminal.rows - 1);\n  }\n\n  /**\n   * Refreshes the char atlas, aquiring a new one if necessary.\n   * @param terminal The terminal.\n   * @param colorSet The color set to use for the char atlas.\n   */\n  private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n    if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n      return;\n    }\n    this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n    this._charAtlas.warmUp();\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    this._deviceCellWidth = dim.device.cell.width;\n    this._deviceCellHeight = dim.device.cell.height;\n    this._deviceCharWidth = dim.device.char.width;\n    this._deviceCharHeight = dim.device.char.height;\n    this._deviceCharLeft = dim.device.char.left;\n    this._deviceCharTop = dim.device.char.top;\n    this._canvas.width = dim.device.canvas.width;\n    this._canvas.height = dim.device.canvas.height;\n    this._canvas.style.width = `${dim.css.canvas.width}px`;\n    this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n    // Draw the background if this is an opaque layer\n    if (!this._alpha) {\n      this._clearAll();\n    }\n\n    this._refreshCharAtlas(terminal, this._themeService.colors);\n  }\n\n  public abstract reset(terminal: Terminal): void;\n\n  /**\n   * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n   * existing fillStyle on the context.\n   * @param x The column to fill.\n   * @param y The row to fill.\n   */\n  protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n    this._ctx.fillRect(\n      x * this._deviceCellWidth,\n      (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n      width * this._deviceCellWidth,\n      this._coreBrowserService.dpr);\n  }\n\n  /**\n   * Clears the entire canvas.\n   */\n  protected _clearAll(): void {\n    if (this._alpha) {\n      this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n    }\n  }\n\n  /**\n   * Clears 1+ cells completely.\n   * @param x The column to start at.\n   * @param y The row to start at.\n   * @param width The number of columns to clear.\n   * @param height The number of rows to clear.\n   */\n  protected _clearCells(x: number, y: number, width: number, height: number): void {\n    if (this._alpha) {\n      this._ctx.clearRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n      this._ctx.fillRect(\n        x * this._deviceCellWidth,\n        y * this._deviceCellHeight,\n        width * this._deviceCellWidth,\n        height * this._deviceCellHeight);\n    }\n  }\n\n  /**\n   * Draws a truecolor character at the cell. The character will be clipped to\n   * ensure that it fits with the cell, including the cell to the right if it's\n   * a wide character. This uses the existing fillStyle on the context.\n   * @param terminal The terminal.\n   * @param cell The cell data for the character to draw.\n   * @param x The column to draw at.\n   * @param y The row to draw at.\n   */\n  protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n    this._ctx.font = this._getFont(terminal, false, false);\n    this._ctx.textBaseline = TEXT_BASELINE;\n    this._clipCell(x, y, cell.getWidth());\n    this._ctx.fillText(\n      cell.getChars(),\n      x * this._deviceCellWidth + this._deviceCharLeft,\n      y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n  }\n\n  /**\n   * Clips a cell to ensure no pixels will be drawn outside of it.\n   * @param x The column to clip.\n   * @param y The row to clip.\n   * @param width The number of columns to clip.\n   */\n  private _clipCell(x: number, y: number, width: number): void {\n    this._ctx.beginPath();\n    this._ctx.rect(\n      x * this._deviceCellWidth,\n      y * this._deviceCellHeight,\n      width * this._deviceCellWidth,\n      this._deviceCellHeight);\n    this._ctx.clip();\n  }\n\n  /**\n   * Gets the current font.\n   * @param terminal The terminal.\n   * @param isBold If we should use the bold fontWeight.\n   */\n  protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n    const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n    const fontStyle = isItalic ? 'italic' : '';\n\n    return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n  }\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from 'xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n  private _state: ILinkifierEvent | undefined;\n\n  constructor(\n    container: HTMLElement,\n    zIndex: number,\n    terminal: Terminal,\n    linkifier2: ILinkifier2,\n    coreBrowserService: ICoreBrowserService,\n    optionsService: IOptionsService,\n    themeService: IThemeService\n  ) {\n    super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n    this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n    this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n  }\n\n  public resize(terminal: Terminal, dim: IRenderDimensions): void {\n    super.resize(terminal, dim);\n    // Resizing the canvas discards the contents of the canvas so clear state\n    this._state = undefined;\n  }\n\n  public reset(terminal: Terminal): void {\n    this._clearCurrentLink();\n  }\n\n  private _clearCurrentLink(): void {\n    if (this._state) {\n      this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n      const middleRowCount = this._state.y2 - this._state.y1 - 1;\n      if (middleRowCount > 0) {\n        this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n      }\n      this._clearCells(0, this._state.y2, this._state.x2, 1);\n      this._state = undefined;\n    }\n  }\n\n  private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n    if (e.fg === INVERTED_DEFAULT_COLOR) {\n      this._ctx.fillStyle = this._themeService.colors.background.css;\n    } else if (e.fg !== undefined && is256Color(e.fg)) {\n      // 256 color support\n      this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n    } else {\n      this._ctx.fillStyle = this._themeService.colors.foreground.css;\n    }\n\n    if (e.y1 === e.y2) {\n      // Single line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n    } else {\n      // Multi-line link\n      this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n      for (let y = e.y1 + 1; y < e.y2; y++) {\n        this._fillBottomLineAtCells(0, y, e.cols);\n      }\n      this._fillBottomLineAtCells(0, e.y2, e.x2);\n    }\n    this._state = e;\n  }\n\n  private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n    this._clearCurrentLink();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n  node: Element | Window | Document,\n  type: string,\n  handler: (e: any) => void,\n  options?: boolean | AddEventListenerOptions\n): IDisposable {\n  node.addEventListener(type, handler, options);\n  let disposed = false;\n  return {\n    dispose: () => {\n      if (disposed) {\n        return;\n      }\n      disposed = true;\n      node.removeEventListener(type, handler, options);\n    }\n  };\n}\n","import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, FgFlags } from 'common/buffer/Constants';\nimport { IDecorationService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from 'xterm';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\n\nexport class CellColorResolver {\n  /**\n   * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n   * any other calls will share object.\n   */\n  public readonly result: { fg: number, bg: number, ext: number } = {\n    fg: 0,\n    bg: 0,\n    ext: 0\n  };\n\n  constructor(\n    private readonly _terminal: Terminal,\n    private readonly _selectionRenderModel: ISelectionRenderModel,\n    private readonly _decorationService: IDecorationService,\n    private readonly _coreBrowserService: ICoreBrowserService,\n    private readonly _themeService: IThemeService\n  ) {\n  }\n\n  /**\n   * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n   * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n   */\n  public resolve(cell: ICellData, x: number, y: number): void {\n    this.result.bg = cell.bg;\n    this.result.fg = cell.fg;\n    this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n    // Get any foreground/background overrides, this happens on the model to avoid spreading\n    // override logic throughout the different sub-renderers\n\n    // Reset overrides work variables\n    $bg = 0;\n    $fg = 0;\n    $hasBg = false;\n    $hasFg = false;\n    $isSelected = false;\n    $colors = this._themeService.colors;\n\n    // Apply decorations on the bottom layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Apply the selection color if needed\n    $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n    if ($isSelected) {\n      $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & 0xFFFFFF;\n      $hasBg = true;\n      if ($colors.selectionForeground) {\n        $fg = $colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    }\n\n    // Apply decorations on the top layer\n    this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n      if (d.backgroundColorRGB) {\n        $bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasBg = true;\n      }\n      if (d.foregroundColorRGB) {\n        $fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n        $hasFg = true;\n      }\n    });\n\n    // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n    // ahead of time in order to use the correct cache key\n    if ($hasBg) {\n      if ($isSelected) {\n        // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n      } else {\n        // Non-RGB attributes from model + override + force RGB color mode\n        $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n      }\n    }\n    if ($hasFg) {\n      // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n      $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n    }\n\n    // Handle case where inverse was specified by only one of bg override or fg override was set,\n    // resolving the other inverse color and setting the inverse flag if needed.\n    if (this.result.fg & FgFlags.INVERSE) {\n      if ($hasBg && !$hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasFg = true;\n      }\n      if (!$hasBg && $hasFg) {\n        // Resolve bg color type (default color has a different meaning in fg vs bg)\n        if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & 0xFFFFFF) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n        } else {\n          $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n        }\n        $hasBg = true;\n      }\n    }\n\n    // Release object\n    $colors = undefined;\n\n    // Use the override if it exists\n    this.result.bg = $hasBg ? $bg : this.result.bg;\n    this.result.fg = $hasFg ? $fg : this.result.fg;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from 'xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n  atlas: ITextureAtlas;\n  config: ICharAtlasConfig;\n  // N.B. This implementation potentially holds onto copies of the terminal forever, so\n  // this may cause memory leaks.\n  ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n  terminal: Terminal,\n  options: Required<ITerminalOptions>,\n  colors: ReadonlyColorSet,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  deviceCharWidth: number,\n  deviceCharHeight: number,\n  devicePixelRatio: number\n): ITextureAtlas {\n  const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n  // Check to see if the terminal already owns this config\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    const ownedByIndex = entry.ownedBy.indexOf(terminal);\n    if (ownedByIndex >= 0) {\n      if (configEquals(entry.config, newConfig)) {\n        return entry.atlas;\n      }\n      // The configs differ, release the terminal from the entry\n      if (entry.ownedBy.length === 1) {\n        entry.atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        entry.ownedBy.splice(ownedByIndex, 1);\n      }\n      break;\n    }\n  }\n\n  // Try match a char atlas from the cache\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const entry = charAtlasCache[i];\n    if (configEquals(entry.config, newConfig)) {\n      // Add the terminal to the cache entry and return\n      entry.ownedBy.push(terminal);\n      return entry.atlas;\n    }\n  }\n\n  const core: ITerminal = (terminal as any)._core;\n  const newEntry: ITextureAtlasCacheEntry = {\n    atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n    config: newConfig,\n    ownedBy: [terminal]\n  };\n  charAtlasCache.push(newEntry);\n  return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n  for (let i = 0; i < charAtlasCache.length; i++) {\n    const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n    if (index !== -1) {\n      if (charAtlasCache[i].ownedBy.length === 1) {\n        // Remove the cache entry if it's the only terminal\n        charAtlasCache[i].atlas.dispose();\n        charAtlasCache.splice(i, 1);\n      } else {\n        // Remove the reference from the cache entry\n        charAtlasCache[i].ownedBy.splice(index, 1);\n      }\n      break;\n    }\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from 'xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n  // null out some fields that don't matter\n  const clonedColors: IColorSet = {\n    foreground: colors.foreground,\n    background: colors.background,\n    cursor: NULL_COLOR,\n    cursorAccent: NULL_COLOR,\n    selectionForeground: NULL_COLOR,\n    selectionBackgroundTransparent: NULL_COLOR,\n    selectionBackgroundOpaque: NULL_COLOR,\n    selectionInactiveBackgroundTransparent: NULL_COLOR,\n    selectionInactiveBackgroundOpaque: NULL_COLOR,\n    // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n    // dynamic character atlas.\n    ansi: colors.ansi.slice(),\n    contrastCache: colors.contrastCache,\n    halfContrastCache: colors.halfContrastCache\n  };\n  return {\n    customGlyphs: options.customGlyphs,\n    devicePixelRatio,\n    letterSpacing: options.letterSpacing,\n    lineHeight: options.lineHeight,\n    deviceCellWidth: deviceCellWidth,\n    deviceCellHeight: deviceCellHeight,\n    deviceCharWidth: deviceCharWidth,\n    deviceCharHeight: deviceCharHeight,\n    fontFamily: options.fontFamily,\n    fontSize: options.fontSize,\n    fontWeight: options.fontWeight,\n    fontWeightBold: options.fontWeightBold,\n    allowTransparency: options.allowTransparency,\n    drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n    minimumContrastRatio: options.minimumContrastRatio,\n    colors: clonedColors\n  };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n  for (let i = 0; i < a.colors.ansi.length; i++) {\n    if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n      return false;\n    }\n  }\n  return a.devicePixelRatio === b.devicePixelRatio &&\n      a.customGlyphs === b.customGlyphs &&\n      a.lineHeight === b.lineHeight &&\n      a.letterSpacing === b.letterSpacing &&\n      a.fontFamily === b.fontFamily &&\n      a.fontSize === b.fontSize &&\n      a.fontWeight === b.fontWeight &&\n      a.fontWeightBold === b.fontWeightBold &&\n      a.allowTransparency === b.allowTransparency &&\n      a.deviceCharWidth === b.deviceCharWidth &&\n      a.deviceCharHeight === b.deviceCharHeight &&\n      a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n      a.minimumContrastRatio === b.minimumContrastRatio &&\n      a.colors.foreground.rgba === b.colors.foreground.rgba &&\n      a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n  return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n  public isCursorVisible: boolean;\n\n  private _animationFrame: number | undefined;\n  private _blinkStartTimeout: number | undefined;\n  private _blinkInterval: number | undefined;\n\n  /**\n   * The time at which the animation frame was restarted, this is used on the\n   * next render to restart the timers so they don't need to restart the timers\n   * multiple times over a short period.\n   */\n  private _animationTimeRestarted: number | undefined;\n\n  constructor(\n    private _renderCallback: () => void,\n    private _coreBrowserService: ICoreBrowserService\n  ) {\n    this.isCursorVisible = true;\n    if (this._coreBrowserService.isFocused) {\n      this._restartInterval();\n    }\n  }\n\n  public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n  public dispose(): void {\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public restartBlinkAnimation(): void {\n    if (this.isPaused) {\n      return;\n    }\n    // Save a timestamp so that the restart can be done on the next interval\n    this._animationTimeRestarted = Date.now();\n    // Force a cursor render to ensure it's visible and in the correct position\n    this.isCursorVisible = true;\n    if (!this._animationFrame) {\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n    }\n  }\n\n  private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n    // Clear any existing interval\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n\n    // Setup the initial timeout which will hide the cursor, this is done before\n    // the regular interval is setup in order to support restarting the blink\n    // animation in a lightweight way (without thrashing clearInterval and\n    // setInterval).\n    this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n      // Check if another animation restart was requested while this was being\n      // started\n      if (this._animationTimeRestarted) {\n        const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n        this._animationTimeRestarted = undefined;\n        if (time > 0) {\n          this._restartInterval(time);\n          return;\n        }\n      }\n\n      // Hide the cursor\n      this.isCursorVisible = false;\n      this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n        this._renderCallback();\n        this._animationFrame = undefined;\n      });\n\n      // Setup the blink interval\n      this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n        // Adjust the animation time if it was restarted\n        if (this._animationTimeRestarted) {\n          // calc time diff\n          // Make restart interval do a setTimeout initially?\n          const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n          this._animationTimeRestarted = undefined;\n          this._restartInterval(time);\n          return;\n        }\n\n        // Invert visibility and render\n        this.isCursorVisible = !this.isCursorVisible;\n        this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n          this._renderCallback();\n          this._animationFrame = undefined;\n        });\n      }, BLINK_INTERVAL);\n    }, timeToStart);\n  }\n\n  public pause(): void {\n    this.isCursorVisible = true;\n    if (this._blinkInterval) {\n      this._coreBrowserService.window.clearInterval(this._blinkInterval);\n      this._blinkInterval = undefined;\n    }\n    if (this._blinkStartTimeout) {\n      this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n      this._blinkStartTimeout = undefined;\n    }\n    if (this._animationFrame) {\n      this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public resume(): void {\n    // Clear out any existing timers just in case\n    this.pause();\n\n    this._animationTimeRestarted = undefined;\n    this._restartInterval();\n    this.restartBlinkAnimation();\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n  // Block elements (0x2580-0x2590)\n  '▀': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n  '▁': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n  '▂': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n  '▃': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n  '▄': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n  '▅': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n  '▆': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n  '▇': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n  '█': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n  '▉': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n  '▊': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n  '▋': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n  '▌': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n  '▍': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n  '▎': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n  '▏': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n  '▐': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n  // Block elements (0x2594-0x2595)\n  '▔': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n  '▕': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n  // Terminal graphic characters (0x2596-0x259F)\n  '▖': [{ x: 0, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER LEFT\n  '▗': [{ x: 4, y: 4, w: 4, h: 4 }],                             // QUADRANT LOWER RIGHT\n  '▘': [{ x: 0, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER LEFT\n  '▙': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n  '▚': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n  '▛': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n  '▜': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n  '▝': [{ x: 4, y: 0, w: 4, h: 4 }],                             // QUADRANT UPPER RIGHT\n  '▞': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n  '▟': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n  // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n  '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n  '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n  '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n  '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n  '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n  '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n  // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n  '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n  '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n  '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n  '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n  '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n  '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n  // LEFT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // LEFT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND UPPER ONE EIGHTH BLOCK\n  '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n  // RIGHT AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // UPPER AND LOWER ONE EIGHTH BLOCK\n  '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n  // HORIZONTAL ONE EIGHTH BLOCK-1358\n  '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n  // UPPER ONE QUARTER BLOCK\n  '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n  // UPPER THREE EIGHTHS BLOCK\n  '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n  // UPPER FIVE EIGHTHS BLOCK\n  '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n  // UPPER THREE QUARTERS BLOCK\n  '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n  // UPPER SEVEN EIGHTHS BLOCK\n  '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n  // RIGHT ONE QUARTER BLOCK\n  '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n  // RIGHT THREE EIGHTHS B0OCK\n  '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n  // RIGHT FIVE EIGHTHS BL0CK\n  '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n  // RIGHT THREE QUARTERS 0LOCK\n  '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n  // RIGHT SEVEN EIGHTHS B0OCK\n  '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n  // CHECKER BOARD FILL\n  '\\u{1FB95}': [\n    { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n    { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n    { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n    { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n  ],\n  // INVERSE CHECKER BOARD FILL\n  '\\u{1FB96}': [\n    { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n    { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n    { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n    { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n  ],\n  // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n  '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n  // Shade characters (0x2591-0x2593)\n  '░': [ // LIGHT SHADE (25%)\n    [1, 0, 0, 0],\n    [0, 0, 0, 0],\n    [0, 0, 1, 0],\n    [0, 0, 0, 0]\n  ],\n  '▒': [ // MEDIUM SHADE (50%)\n    [1, 0],\n    [0, 0],\n    [0, 1],\n    [0, 0]\n  ],\n  '▓': [ // DARK SHADE (75%)\n    [0, 1],\n    [1, 1],\n    [1, 0],\n    [1, 1]\n  ]\n};\n\nconst enum Shapes {\n  /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n  /** ─ */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n  /** └ */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n  /** ┘ */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n  /** ┐ */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n  /** ┌ */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n  /** ╵ */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n  /** ╴ */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n  /** ╶ */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n  /** ╷ */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n  /** ┴ */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n  /** ┤ */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n  /** ├ */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n  /** ┬ */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n  /** ┼ */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n  /** ╌ */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n  /** ┄ */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n  /** ┉ */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n  /** ╎ */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n  /** ┆ */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n  /** ┊ */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n  NORMAL = 1,\n  BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n  // Uniform normal and bold\n  '─': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n  '━': { [Style.BOLD]:   Shapes.LEFT_TO_RIGHT },\n  '│': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n  '┃': { [Style.BOLD]:   Shapes.TOP_TO_BOTTOM },\n  '┌': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n  '┏': { [Style.BOLD]:   Shapes.RIGHT_TO_BOTTOM },\n  '┐': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n  '┓': { [Style.BOLD]:   Shapes.LEFT_TO_BOTTOM },\n  '└': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n  '┗': { [Style.BOLD]:   Shapes.TOP_TO_RIGHT },\n  '┘': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n  '┛': { [Style.BOLD]:   Shapes.TOP_TO_LEFT },\n  '├': { [Style.NORMAL]: Shapes.T_RIGHT },\n  '┣': { [Style.BOLD]:   Shapes.T_RIGHT },\n  '┤': { [Style.NORMAL]: Shapes.T_LEFT },\n  '┫': { [Style.BOLD]:   Shapes.T_LEFT },\n  '┬': { [Style.NORMAL]: Shapes.T_BOTTOM },\n  '┳': { [Style.BOLD]:   Shapes.T_BOTTOM },\n  '┴': { [Style.NORMAL]: Shapes.T_TOP },\n  '┻': { [Style.BOLD]:   Shapes.T_TOP },\n  '┼': { [Style.NORMAL]: Shapes.CROSS },\n  '╋': { [Style.BOLD]:   Shapes.CROSS },\n  '╴': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n  '╸': { [Style.BOLD]:   Shapes.MIDDLE_TO_LEFT },\n  '╵': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n  '╹': { [Style.BOLD]:   Shapes.MIDDLE_TO_TOP },\n  '╶': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n  '╺': { [Style.BOLD]:   Shapes.MIDDLE_TO_RIGHT },\n  '╷': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n  '╻': { [Style.BOLD]:   Shapes.MIDDLE_TO_BOTTOM },\n\n  // Double border\n  '═': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '║': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╒': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╓': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╔': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╕': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╖': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n  '╗': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n  '╘': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n  '╙': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╚': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n  '╛': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n  '╜': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n  '╝': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n  '╞': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n  '╟': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n  '╠': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╡': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n  '╢': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╣': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n  '╤': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n  '╥': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n  '╦': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n  '╧': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╨': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n  '╩': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n  '╪': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n  '╫': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n  '╬': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n  // Diagonal\n  '╱': { [Style.NORMAL]: 'M1,0 L0,1' },\n  '╲': { [Style.NORMAL]: 'M0,0 L1,1' },\n  '╳': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n  // Mixed weight\n  '╼': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '╽': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╾': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '╿': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┍': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┎': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┑': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┒': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┕': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┖': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┙': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┚': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┝': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┞': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┟': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┠': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┡': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┢': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┥': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┦': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┧': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┨': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '┩': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┪': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┭': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┮': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┯': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┰': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '┱': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '┲': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '┵': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┶': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┷': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '┸': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '┹': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '┺': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '┽': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`,  [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n  '┾': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`,   [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n  '┿': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM,                                 [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n  '╀': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n  '╁': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`,    [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n  '╂': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT,                                 [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n  '╃': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM,                               [Style.BOLD]: Shapes.TOP_TO_LEFT },\n  '╄': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM,                                [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n  '╅': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT,                                  [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n  '╆': { [Style.NORMAL]: Shapes.TOP_TO_LEFT,                                   [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n  '╇': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM,                              [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n  '╈': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP,                                 [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n  '╉': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT,                               [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n  '╊': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT,                                [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n  // Dashed\n  '╌': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n  '╍': { [Style.BOLD]:   Shapes.TWO_DASHES_HORIZONTAL },\n  '┄': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n  '┅': { [Style.BOLD]:   Shapes.THREE_DASHES_HORIZONTAL },\n  '┈': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n  '┉': { [Style.BOLD]:   Shapes.FOUR_DASHES_HORIZONTAL },\n  '╎': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n  '╏': { [Style.BOLD]:   Shapes.TWO_DASHES_VERTICAL },\n  '┆': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL  },\n  '┇': { [Style.BOLD]:   Shapes.THREE_DASHES_VERTICAL },\n  '┊': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n  '┋': { [Style.BOLD]:   Shapes.FOUR_DASHES_VERTICAL },\n\n  // Curved\n  '╭': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n  '╮': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n  '╯': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n  '╰': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n  d: string;\n  type: VectorType;\n  leftPadding?: number;\n  rightPadding?: number;\n}\n\nconst enum VectorType {\n  FILL,\n  STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n  // Right triangle solid\n  '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n  // Right triangle line\n  '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Left triangle solid\n  '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n  // Left triangle line\n  '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Right semi-circle solid\n  '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n  // Right semi-circle line\n  '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n  // Left semi-circle solid\n  '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n  // Left semi-circle line\n  '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n  // Lower left triangle\n  '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n  // Backslash separator\n  '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Lower right triangle\n  '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n  // Upper left triangle\n  '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n  // Forward slash separator\n  '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n  // Upper right triangle\n  '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n  ctx: CanvasRenderingContext2D,\n  c: string,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): boolean {\n  const blockElementDefinition = blockElementDefinitions[c];\n  if (blockElementDefinition) {\n    drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const patternDefinition = patternCharacterDefinitions[c];\n  if (patternDefinition) {\n    drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n    return true;\n  }\n\n  const boxDrawingDefinition = boxDrawingDefinitions[c];\n  if (boxDrawingDefinition) {\n    drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n    return true;\n  }\n\n  const powerlineDefinition = powerlineDefinitions[c];\n  if (powerlineDefinition) {\n    drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n    return true;\n  }\n\n  return false;\n}\n\nfunction drawBlockElementChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IBlockVector[],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  for (let i = 0; i < charDefinition.length; i++) {\n    const box = charDefinition[i];\n    const xEighth = deviceCellWidth / 8;\n    const yEighth = deviceCellHeight / 8;\n    ctx.fillRect(\n      xOffset + box.x * xEighth,\n      yOffset + box.y * yEighth,\n      box.w * xEighth,\n      box.h * yEighth\n    );\n  }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: number[][],\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number\n): void {\n  let patternSet = cachedPatterns.get(charDefinition);\n  if (!patternSet) {\n    patternSet = new Map();\n    cachedPatterns.set(charDefinition, patternSet);\n  }\n  const fillStyle = ctx.fillStyle;\n  if (typeof fillStyle !== 'string') {\n    throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n  }\n  let pattern = patternSet.get(fillStyle);\n  if (!pattern) {\n    const width = charDefinition[0].length;\n    const height = charDefinition.length;\n    const tmpCanvas = document.createElement('canvas');\n    tmpCanvas.width = width;\n    tmpCanvas.height = height;\n    const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n    const imageData = new ImageData(width, height);\n\n    // Extract rgba from fillStyle\n    let r: number;\n    let g: number;\n    let b: number;\n    let a: number;\n    if (fillStyle.startsWith('#')) {\n      r = parseInt(fillStyle.slice(1, 3), 16);\n      g = parseInt(fillStyle.slice(3, 5), 16);\n      b = parseInt(fillStyle.slice(5, 7), 16);\n      a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n    } else if (fillStyle.startsWith('rgba')) {\n      ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n    } else {\n      throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n    }\n\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        imageData.data[(y * width + x) * 4    ] = r;\n        imageData.data[(y * width + x) * 4 + 1] = g;\n        imageData.data[(y * width + x) * 4 + 2] = b;\n        imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n      }\n    }\n    tmpCtx.putImageData(imageData, 0, 0);\n    pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n    patternSet.set(fillStyle, pattern);\n  }\n  ctx.fillStyle = pattern;\n  ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles:       ┎┰┒┍┯┑╓╥╖╒╤╕ ┏┳┓┌┲┓┌┬┐┏┱┐\n * ┌─┬─┐ ┏━┳━┓ ╔═╦═╗ ┠╂┨┝┿┥╟╫╢╞╪╡ ┡╇┩├╊┫┢╈┪┣╉┤\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┖┸┚┕┷┙╙╨╜╘╧╛ └┴┘└┺┛┗┻┛┗┹┘\n * ├─┼─┤ ┣━╋━┫ ╠═╬═╣ ┏┱┐┌┲┓┌┬┐┌┬┐ ┏┳┓┌┮┓┌┬┐┏┭┐\n * │ │ │ ┃ ┃ ┃ ║ ║ ║ ┡╃┤├╄┩├╆┪┢╅┤ ┞╀┦├┾┫┟╁┧┣┽┤\n * └─┴─┘ ┗━┻━┛ ╚═╩═╝ └┴┘└┴┘└┺┛┗┹┘ └┴┘└┶┛┗┻┛┗┵┘\n *\n * Other:\n * ╭─╮ ╲ ╱ ╷╻╎╏┆┇┊┋ ╺╾╴ ╌╌╌ ┄┄┄ ┈┈┈\n * │ │  ╳  ╽╿╎╏┆┇┊┋ ╶╼╸ ╍╍╍ ┅┅┅ ┉┉┉\n * ╰─╯ ╱ ╲ ╹╵╎╏┆┇┊┋\n *\n * All box drawing characters:\n * ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n * ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n * ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n * ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n * ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n * ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n * ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n * ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n *\n * ---\n *\n * Box drawing alignment tests:                                          █\n *                                                                       ▉\n *   ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳\n *   ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳\n *   ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳\n *   ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳\n *   ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎\n *   ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏\n *   ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  devicePixelRatio: number\n): void {\n  ctx.strokeStyle = ctx.fillStyle;\n  for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n    ctx.beginPath();\n    ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n    let actualInstructions: string;\n    if (typeof instructions === 'function') {\n      const xp = .15;\n      const yp = .15 / deviceCellHeight * deviceCellWidth;\n      actualInstructions = instructions(xp, yp);\n    } else {\n      actualInstructions = instructions;\n    }\n    for (const instruction of actualInstructions.split(' ')) {\n      const type = instruction[0];\n      const f = svgToCanvasInstructionMap[type];\n      if (!f) {\n        console.error(`Could not find drawing instructions for \"${type}\"`);\n        continue;\n      }\n      const args: string[] = instruction.substring(1).split(',');\n      if (!args[0] || !args[1]) {\n        continue;\n      }\n      f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n    }\n    ctx.stroke();\n    ctx.closePath();\n  }\n}\n\nfunction drawPowerlineChar(\n  ctx: CanvasRenderingContext2D,\n  charDefinition: IVectorShape,\n  xOffset: number,\n  yOffset: number,\n  deviceCellWidth: number,\n  deviceCellHeight: number,\n  fontSize: number,\n  devicePixelRatio: number\n): void {\n  // Clip the cell to make sure drawing doesn't occur beyond bounds\n  const clipRegion = new Path2D();\n  clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n  ctx.clip(clipRegion);\n\n  ctx.beginPath();\n  // Scale the stroke with DPR and font size\n  const cssLineWidth = fontSize / 12;\n  ctx.lineWidth = devicePixelRatio * cssLineWidth;\n  for (const instruction of charDefinition.d.split(' ')) {\n    const type = instruction[0];\n    const f = svgToCanvasInstructionMap[type];\n    if (!f) {\n      console.error(`Could not find drawing instructions for \"${type}\"`);\n      continue;\n    }\n    const args: string[] = instruction.substring(1).split(',');\n    if (!args[0] || !args[1]) {\n      continue;\n    }\n    f(ctx, translateArgs(\n      args,\n      deviceCellWidth,\n      deviceCellHeight,\n      xOffset,\n      yOffset,\n      false,\n      devicePixelRatio,\n      (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n      (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n    ));\n  }\n  if (charDefinition.type === VectorType.STROKE) {\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.stroke();\n  } else {\n    ctx.fill();\n  }\n  ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n  return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n  'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n  'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n  'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n  const result = args.map(e => parseFloat(e) || parseInt(e));\n\n  if (result.length < 2) {\n    throw new Error('Too few arguments for instruction');\n  }\n\n  for (let x = 0; x < result.length; x += 2) {\n    // Translate from 0-1 to 0-cellWidth\n    result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[x] !== 0) {\n      result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n    }\n    // Apply the cell's offset (ie. x*cellWidth)\n    result[x] += xOffset + (leftPadding * devicePixelRatio);\n  }\n\n  for (let y = 1; y < result.length; y += 2) {\n    // Translate from 0-1 to 0-cellHeight\n    result[y] *= cellHeight;\n    // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n    // line at 100% devicePixelRatio\n    if (doClamp && result[y] !== 0) {\n      result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n    }\n    // Apply the cell's offset (ie. x*cellHeight)\n    result[y] += yOffset;\n  }\n\n  return result;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n  // Observe any resizes to the element and extract the actual pixel size of the element if the\n  // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n  // converting between CSS pixels and device pixels which causes blurry rendering when device\n  // pixel ratio is not a round number.\n  let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n    const entry = entries.find((entry) => entry.target === element);\n    if (!entry) {\n      return;\n    }\n\n    // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n    if (!('devicePixelContentBoxSize' in entry)) {\n      observer?.disconnect();\n      observer = undefined;\n      return;\n    }\n\n    // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n    const width = entry.devicePixelContentBoxSize[0].inlineSize;\n    const height = entry.devicePixelContentBoxSize[0].blockSize;\n    if (width > 0 && height > 0) {\n      callback(width, height);\n    }\n  });\n  try {\n    observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n  } catch {\n    observer.disconnect();\n    observer = undefined;\n  }\n  return toDisposable(() => observer?.disconnect());\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n  if (!value) {\n    throw new Error('value must not be falsy');\n  }\n  return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n  // Only return true for Powerline symbols which require\n  // different padding and should be excluded from minimum contrast\n  // ratio standards\n  return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n  return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n  return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n  return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from 'xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n  public hasSelection!: boolean;\n  public columnSelectMode!: boolean;\n  public viewportStartRow!: number;\n  public viewportEndRow!: number;\n  public viewportCappedStartRow!: number;\n  public viewportCappedEndRow!: number;\n  public startCol!: number;\n  public endCol!: number;\n  public selectionStart: [number, number] | undefined;\n  public selectionEnd: [number, number] | undefined;\n\n  constructor() {\n    this.clear();\n  }\n\n  public clear(): void {\n    this.hasSelection = false;\n    this.columnSelectMode = false;\n    this.viewportStartRow = 0;\n    this.viewportEndRow = 0;\n    this.viewportCappedStartRow = 0;\n    this.viewportCappedEndRow = 0;\n    this.startCol = 0;\n    this.endCol = 0;\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n  }\n\n  public update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n    this.selectionStart = start;\n    this.selectionEnd = end;\n    // Selection does not exist\n    if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n      this.clear();\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportStartRow = start[1] - terminal.buffer.active.viewportY;\n    const viewportEndRow = end[1] - terminal.buffer.active.viewportY;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n      this.clear();\n      return;\n    }\n\n    this.hasSelection = true;\n    this.columnSelectMode = columnSelectMode;\n    this.viewportStartRow = viewportStartRow;\n    this.viewportEndRow = viewportEndRow;\n    this.viewportCappedStartRow = viewportCappedStartRow;\n    this.viewportCappedEndRow = viewportCappedEndRow;\n    this.startCol = start[0];\n    this.endCol = end[0];\n  }\n\n  public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n    if (!this.hasSelection) {\n      return false;\n    }\n    y -= terminal.buffer.active.viewportY;\n    if (this.columnSelectMode) {\n      if (this.startCol <= this.endCol) {\n        return x >= this.startCol && y >= this.viewportCappedStartRow &&\n          x < this.endCol && y <= this.viewportCappedEndRow;\n      }\n      return x < this.startCol && y >= this.viewportCappedStartRow &&\n        x >= this.endCol && y <= this.viewportCappedEndRow;\n    }\n    return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n      (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n      (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n  }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n  return new SelectionRenderModel();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, color, rgba } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { traceCall } from 'common/services/LogService';\nimport { IUnicodeService } from 'common/services/Services';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n  texturePage: 0,\n  texturePosition: { x: 0, y: 0 },\n  texturePositionClipSpace: { x: 0, y: 0 },\n  offset: { x: 0, y: 0 },\n  size: { x: 0, y: 0 },\n  sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n  /**\n   * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n   * page pack as tightly as possible, but more pages would end up being created as a result.\n   */\n  ROW_PIXEL_THRESHOLD = 2,\n  /**\n   * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n   * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n   * 4096 squared image takes up 16MB of GPU memory.\n   */\n  FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n  x: number;\n  y: number;\n  height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n  private _didWarmUp: boolean = false;\n\n  private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n  private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n  // The texture that the atlas is drawn to\n  private _pages: AtlasPage[] = [];\n  public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n  // The set of atlas pages that can be written to\n  private _activePages: AtlasPage[] = [];\n\n  private _tmpCanvas: HTMLCanvasElement;\n  // A temporary context that glyphs are drawn to before being transfered to the atlas.\n  private _tmpCtx: CanvasRenderingContext2D;\n\n  private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n  private _workAttributeData: AttributeData = new AttributeData();\n\n  private _textureSize: number = 512;\n\n  public static maxAtlasPages: number | undefined;\n  public static maxTextureSize: number | undefined;\n\n  private readonly _onAddTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n  constructor(\n    private readonly _document: Document,\n    private readonly _config: ICharAtlasConfig,\n    private readonly _unicodeService: IUnicodeService\n  ) {\n    this._createNewPage();\n    this._tmpCanvas = createCanvas(\n      _document,\n      this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n      this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n    );\n    this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n      alpha: this._config.allowTransparency,\n      willReadFrequently: true\n    }));\n  }\n\n  public dispose(): void {\n    for (const page of this.pages) {\n      page.canvas.remove();\n    }\n    this._onAddTextureAtlasCanvas.dispose();\n  }\n\n  public warmUp(): void {\n    if (!this._didWarmUp) {\n      this._doWarmUp();\n      this._didWarmUp = true;\n    }\n  }\n\n  private _doWarmUp(): void {\n    // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n    const queue = new IdleTaskQueue();\n    for (let i = 33; i < 126; i++) {\n      queue.enqueue(() => {\n        if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n          const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n          this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n        }\n      });\n    }\n  }\n\n  private _requestClearModel = false;\n  public beginFrame(): boolean {\n    return this._requestClearModel;\n  }\n\n  public clearTexture(): void {\n    if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n      return;\n    }\n    for (const page of this._pages) {\n      page.clear();\n    }\n    this._cacheMap.clear();\n    this._cacheMapCombined.clear();\n    this._didWarmUp = false;\n  }\n\n  private _createNewPage(): AtlasPage {\n    // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n    // microtask to ensure it does not interrupt textures that will be rendered in the current\n    // animation frame which would result in blank rendered areas. This is actually not that\n    // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n    if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n      // Find the set of the largest 4 images, below the maximum size, with the highest\n      // percentages used\n      const pagesBySize = this._pages.filter(e => {\n        return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n      }).sort((a, b) => {\n        if (b.canvas.width !== a.canvas.width) {\n          return b.canvas.width - a.canvas.width;\n        }\n        return b.percentageUsed - a.percentageUsed;\n      });\n      let sameSizeI = -1;\n      let size = 0;\n      for (let i = 0; i < pagesBySize.length; i++) {\n        if (pagesBySize[i].canvas.width !== size) {\n          sameSizeI = i;\n          size = pagesBySize[i].canvas.width;\n        } else if (i - sameSizeI === 3) {\n          break;\n        }\n      }\n\n      // Gather details of the merge\n      const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n      const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n      const mergedPageIndex = this.pages.length - mergingPages.length;\n\n      // Merge into the new page\n      const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n      mergedPage.version++;\n\n      // Delete the pages, shifting glyph texture pages as needed\n      for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n        this._deletePage(sortedMergingPagesIndexes[i]);\n      }\n\n      // Add the new merged page to the end\n      this.pages.push(mergedPage);\n\n      // Request the model to be cleared to refresh all texture pages.\n      this._requestClearModel = true;\n      this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n    }\n\n    // All new atlas pages are created small as they are highly dynamic\n    const newPage = new AtlasPage(this._document, this._textureSize);\n    this._pages.push(newPage);\n    this._activePages.push(newPage);\n    this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n    return newPage;\n  }\n\n  private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n    const mergedSize = mergingPages[0].canvas.width * 2;\n    const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n    for (const [i, p] of mergingPages.entries()) {\n      const xOffset = i * p.canvas.width % mergedSize;\n      const yOffset = Math.floor(i / 2) * p.canvas.height;\n      mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n      for (const g of p.glyphs) {\n        g.texturePage = mergedPageIndex;\n        g.sizeClipSpace.x = g.size.x / mergedSize;\n        g.sizeClipSpace.y = g.size.y / mergedSize;\n        g.texturePosition.x += xOffset;\n        g.texturePosition.y += yOffset;\n        g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n        g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n      }\n\n      this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n      // Remove the merging page from active pages if it was there\n      const index = this._activePages.indexOf(p);\n      if (index !== -1) {\n        this._activePages.splice(index, 1);\n      }\n    }\n    return mergedPage;\n  }\n\n  private _deletePage(pageIndex: number): void {\n    this._pages.splice(pageIndex, 1);\n    for (let j = pageIndex; j < this._pages.length; j++) {\n      const adjustingPage = this._pages[j];\n      for (const g of adjustingPage.glyphs) {\n        g.texturePage--;\n      }\n      adjustingPage.version++;\n    }\n  }\n\n  public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n  }\n\n  public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n    return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n  }\n\n  /**\n   * Gets the glyphs texture coords, drawing the texture if it's not already\n   */\n  private _getFromCacheMap(\n    cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n    key: string | number,\n    bg: number,\n    fg: number,\n    ext: number,\n    restrictToCellHeight: boolean = false\n  ): IRasterizedGlyph {\n    $glyph = cacheMap.get(key, bg, fg, ext);\n    if (!$glyph) {\n      $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n      cacheMap.set(key, bg, fg, ext, $glyph);\n    }\n    return $glyph;\n  }\n\n  private _getColorFromAnsiIndex(idx: number): IColor {\n    if (idx >= this._config.colors.ansi.length) {\n      throw new Error('No color found for idx ' + idx);\n    }\n    return this._config.colors.ansi[idx];\n  }\n\n  private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n    if (this._config.allowTransparency) {\n      // The background color might have some transparency, so we need to render it as fully\n      // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n      // around the anti-aliased edges of the glyph, and it would look too dark.\n      return NULL_COLOR;\n    }\n\n    let result: IColor;\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        result = this._getColorFromAnsiIndex(bgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(bgColor);\n        // TODO: This object creation is slow\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = color.opaque(this._config.colors.foreground);\n        } else {\n          result = this._config.colors.background;\n        }\n        break;\n    }\n\n    return result;\n  }\n\n  private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n    const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, false, bold, dim, excludeFromContrastRatioDemands);\n    if (minimumContrastColor) {\n      return minimumContrastColor;\n    }\n\n    let result: IColor;\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        result = this._getColorFromAnsiIndex(fgColor);\n        break;\n      case Attributes.CM_RGB:\n        const arr = AttributeData.toColorRGB(fgColor);\n        result = rgba.toColor(arr[0], arr[1], arr[2]);\n        break;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          result = this._config.colors.background;\n        } else {\n          result = this._config.colors.foreground;\n        }\n    }\n\n    // Always use an opaque color regardless of allowTransparency\n    if (this._config.allowTransparency) {\n      result = color.opaque(result);\n    }\n\n    // Apply dim to the color, opacity is fine to use for the foreground color\n    if (dim) {\n      result = color.multiplyOpacity(result, DIM_OPACITY);\n    }\n\n    return result;\n  }\n\n  private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n    switch (bgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        return this._getColorFromAnsiIndex(bgColor).rgba;\n      case Attributes.CM_RGB:\n        return bgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.foreground.rgba;\n        }\n        return this._config.colors.background.rgba;\n    }\n  }\n\n  private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n    switch (fgColorMode) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:\n        if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n          fgColor += 8;\n        }\n        return this._getColorFromAnsiIndex(fgColor).rgba;\n      case Attributes.CM_RGB:\n        return fgColor << 8;\n      case Attributes.CM_DEFAULT:\n      default:\n        if (inverse) {\n          return this._config.colors.background.rgba;\n        }\n        return this._config.colors.foreground.rgba;\n    }\n  }\n\n  private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n    if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n      return undefined;\n    }\n\n    // Try get from cache first\n    const cache = this._getContrastCache(dim);\n    const adjustedColor = cache.getColor(bg, fg);\n    if (adjustedColor !== undefined) {\n      return adjustedColor || undefined;\n    }\n\n    const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n    const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n    // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n    // non-dim cells\n    const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n    if (!result) {\n      cache.setColor(bg, fg, null);\n      return undefined;\n    }\n\n    const color = rgba.toColor(\n      (result >> 24) & 0xFF,\n      (result >> 16) & 0xFF,\n      (result >> 8) & 0xFF\n    );\n    cache.setColor(bg, fg, color);\n\n    return color;\n  }\n\n  private _getContrastCache(dim: boolean): IColorContrastCache {\n    if (dim) {\n      return this._config.colors.halfContrastCache;\n    }\n    return this._config.colors.contrastCache;\n  }\n\n  @traceCall\n  private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n    const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n    // Uncomment for debugging\n    // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n    // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n    // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n    // giant ligatures (eg. =====>) don't impact overall performance.\n    const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n    if (this._tmpCanvas.width < allowedWidth) {\n      this._tmpCanvas.width = allowedWidth;\n    }\n    // Include line height when drawing glyphs\n    const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n    if (this._tmpCanvas.height < allowedHeight) {\n      this._tmpCanvas.height = allowedHeight;\n    }\n    this._tmpCtx.save();\n\n    this._workAttributeData.fg = fg;\n    this._workAttributeData.bg = bg;\n    this._workAttributeData.extended.ext = ext;\n\n    const invisible = !!this._workAttributeData.isInvisible();\n    if (invisible) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const bold = !!this._workAttributeData.isBold();\n    const inverse = !!this._workAttributeData.isInverse();\n    const dim = !!this._workAttributeData.isDim();\n    const italic = !!this._workAttributeData.isItalic();\n    const underline = !!this._workAttributeData.isUnderline();\n    const strikethrough = !!this._workAttributeData.isStrikethrough();\n    const overline = !!this._workAttributeData.isOverline();\n    let fgColor = this._workAttributeData.getFgColor();\n    let fgColorMode = this._workAttributeData.getFgColorMode();\n    let bgColor = this._workAttributeData.getBgColor();\n    let bgColorMode = this._workAttributeData.getBgColorMode();\n    if (inverse) {\n      const temp = fgColor;\n      fgColor = bgColor;\n      bgColor = temp;\n      const temp2 = fgColorMode;\n      fgColorMode = bgColorMode;\n      bgColorMode = temp2;\n    }\n\n    // draw the background\n    const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n    // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n    // regardless of transparency in backgroundColor\n    this._tmpCtx.globalCompositeOperation = 'copy';\n    this._tmpCtx.fillStyle = backgroundColor.css;\n    this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n    this._tmpCtx.globalCompositeOperation = 'source-over';\n\n    // draw the foreground/glyph\n    const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n    const fontStyle = italic ? 'italic' : '';\n    this._tmpCtx.font =\n      `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n    this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n    const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n    const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n    const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, excludeFromContrastRatioDemands(chars.charCodeAt(0)));\n    this._tmpCtx.fillStyle = foregroundColor.css;\n\n    // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n    const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n    // Draw custom characters if applicable\n    let customGlyph = false;\n    if (this._config.customGlyphs !== false) {\n      customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n    }\n\n    // Whether to clear pixels based on a threshold difference between the glyph color and the\n    // background color. This should be disabled when the glyph contains multiple colors such as\n    // underline colors to prevent important colors could get cleared.\n    let enableClearThresholdCheck = !powerlineGlyph;\n\n    let chWidth: number;\n    if (typeof codeOrChars === 'number') {\n      chWidth = this._unicodeService.wcwidth(codeOrChars);\n    } else {\n      chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n    }\n\n    // Draw underline\n    if (underline) {\n      this._tmpCtx.save();\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      // When the line width is odd, draw at a 0.5 position\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n\n      // Underline color\n      if (this._workAttributeData.isUnderlineColorDefault()) {\n        this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      } else if (this._workAttributeData.isUnderlineColorRGB()) {\n        enableClearThresholdCheck = false;\n        this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n      } else {\n        enableClearThresholdCheck = false;\n        let fg = this._workAttributeData.getUnderlineColor();\n        if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n          fg += 8;\n        }\n        this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n      }\n\n      // Underline style/stroke\n      this._tmpCtx.beginPath();\n      const xLeft = padding;\n      const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n      const yMid = yTop + lineWidth;\n      const yBot = yTop + lineWidth * 2;\n\n      for (let i = 0; i < chWidth; i++) {\n        this._tmpCtx.save();\n        const xChLeft = xLeft + i * this._config.deviceCellWidth;\n        const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n        const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n        switch (this._workAttributeData.extended.underlineStyle) {\n          case UnderlineStyle.DOUBLE:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            this._tmpCtx.moveTo(xChLeft, yBot);\n            this._tmpCtx.lineTo(xChRight, yBot);\n            break;\n          case UnderlineStyle.CURLY:\n            // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n            // made taller when the line width is  as otherwise it's not very clear otherwise.\n            const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n            const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n            // Clip the left and right edges of the underline such that it can be drawn just outside\n            // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n            // glyphs adjacent to one another.\n            const clipRegion = new Path2D();\n            clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n            this._tmpCtx.clip(clipRegion);\n            // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n            // cells\n            this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n            this._tmpCtx.bezierCurveTo(\n              xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n              xChLeft, yCurlyTop,\n              xChLeft, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChLeft, yCurlyBot,\n              xChMid, yCurlyBot,\n              xChMid, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChMid, yCurlyTop,\n              xChRight, yCurlyTop,\n              xChRight, yMid\n            );\n            this._tmpCtx.bezierCurveTo(\n              xChRight, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n              xChRight + this._config.deviceCellWidth / 2, yMid\n            );\n            break;\n          case UnderlineStyle.DOTTED:\n            this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.DASHED:\n            this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]);\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n          case UnderlineStyle.SINGLE:\n          default:\n            this._tmpCtx.moveTo(xChLeft, yTop);\n            this._tmpCtx.lineTo(xChRight, yTop);\n            break;\n        }\n        this._tmpCtx.stroke();\n        this._tmpCtx.restore();\n      }\n      this._tmpCtx.restore();\n\n      // Draw stroke in the background color for non custom characters in order to give an outline\n      // between the text and the underline. Only do this when font size is >= 12 as the underline\n      // looks odd when the font size is too small\n      if (!customGlyph && this._config.fontSize >= 12) {\n        // This only works when transparency is disabled because it's not clear how to clear stroked\n        // text\n        if (!this._config.allowTransparency && chars !== ' ') {\n          // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n          // baseline\n          this._tmpCtx.save();\n          this._tmpCtx.textBaseline = 'alphabetic';\n          const metrics = this._tmpCtx.measureText(chars);\n          this._tmpCtx.restore();\n          if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n            // This translates to 1/2 the line width in either direction\n            this._tmpCtx.save();\n            // Clip the region to only draw in valid pixels near the underline to avoid a slight\n            // outline around the whole glyph, as well as additional pixels in the glyph at the top\n            // which would increase GPU memory demands\n            const clipRegion = new Path2D();\n            clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n            this._tmpCtx.clip(clipRegion);\n            this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n            this._tmpCtx.strokeStyle = backgroundColor.css;\n            this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n            this._tmpCtx.restore();\n          }\n        }\n      }\n    }\n\n    // Overline\n    if (overline) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n      const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    // Draw the character\n    if (!customGlyph) {\n      this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n    }\n\n    // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n    // even on the bottom row, try for a maximum of 5 pixels.\n    if (chars === '_' && !this._config.allowTransparency) {\n      let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n      if (isBeyondCellBounds) {\n        for (let offset = 1; offset <= 5; offset++) {\n          this._tmpCtx.save();\n          this._tmpCtx.fillStyle = backgroundColor.css;\n          this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n          this._tmpCtx.restore();\n          this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n          isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n          if (!isBeyondCellBounds) {\n            break;\n          }\n        }\n      }\n    }\n\n    // Draw strokethrough\n    if (strikethrough) {\n      const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n      const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n      this._tmpCtx.lineWidth = lineWidth;\n      this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n      this._tmpCtx.beginPath();\n      this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n      this._tmpCtx.stroke();\n    }\n\n    this._tmpCtx.restore();\n\n    // clear the background from the character to avoid issues with drawing over the previous\n    // character if it extends past it's bounds\n    const imageData = this._tmpCtx.getImageData(\n      0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n    );\n\n    // Clear out the background color and determine if the glyph is empty.\n    let isEmpty: boolean;\n    if (!this._config.allowTransparency) {\n      isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n    } else {\n      isEmpty = checkCompletelyTransparent(imageData);\n    }\n\n    // Handle empty glyphs\n    if (isEmpty) {\n      return NULL_RASTERIZED_GLYPH;\n    }\n\n    const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n    // Find the best atlas row to use\n    let activePage: AtlasPage;\n    let activeRow: ICharAtlasActiveRow;\n    while (true) {\n      // If there are no active pages (the last smallest 4 were merged), create a new one\n      if (this._activePages.length === 0) {\n        const newPage = this._createNewPage();\n        activePage = newPage;\n        activeRow = newPage.currentRow;\n        activeRow.height = rasterizedGlyph.size.y;\n        break;\n      }\n\n      // Get the best current row from all active pages\n      activePage = this._activePages[this._activePages.length - 1];\n      activeRow = activePage.currentRow;\n      for (const p of this._activePages) {\n        if (rasterizedGlyph.size.y <= p.currentRow.height) {\n          activePage = p;\n          activeRow = p.currentRow;\n        }\n      }\n\n      // TODO: This algorithm could be simplified:\n      // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n      // - Keep track of current/fixed rows in a Map\n\n      // Replace the best current row with a fixed row if there is one at least as good as the\n      // current row. Search in reverse to prioritize filling in older pages.\n      for (let i = this._activePages.length - 1; i >= 0; i--) {\n        for (const row of this._activePages[i].fixedRows) {\n          if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n            activePage = this._activePages[i];\n            activeRow = row;\n          }\n        }\n      }\n\n      // Create a new page if too much vertical space would be wasted or there is not enough room\n      // left in the page. The previous active row will become fixed in the process as it now has a\n      // fixed height\n      if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n        // Create the new fixed height row, creating a new page if there isn't enough room on the\n        // current page\n        let wasPageAndRowFound = false;\n        if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n          // Find the first page with room to create the new row on\n          let candidatePage: AtlasPage | undefined;\n          for (const p of this._activePages) {\n            if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n              candidatePage = p;\n              break;\n            }\n          }\n          if (candidatePage) {\n            activePage = candidatePage;\n          } else {\n            // Before creating a new atlas page that would trigger a page merge, check if the\n            // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n            // improve texture utilization by using the available space before the page is merged\n            // and becomes static.\n            if (\n              TextureAtlas.maxAtlasPages &&\n              this._pages.length >= TextureAtlas.maxAtlasPages &&\n              activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n              activeRow.height >= rasterizedGlyph.size.y &&\n              activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n            ) {\n              // activePage and activeRow is already valid\n              wasPageAndRowFound = true;\n            } else {\n              // Create a new page if there is no room\n              const newPage = this._createNewPage();\n              activePage = newPage;\n              activeRow = newPage.currentRow;\n              activeRow.height = rasterizedGlyph.size.y;\n              wasPageAndRowFound = true;\n            }\n          }\n        }\n        if (!wasPageAndRowFound) {\n          // Fix the current row as the new row is being added below\n          if (activePage.currentRow.height > 0) {\n            activePage.fixedRows.push(activePage.currentRow);\n          }\n          activeRow = {\n            x: 0,\n            y: activePage.currentRow.y + activePage.currentRow.height,\n            height: rasterizedGlyph.size.y\n          };\n          activePage.fixedRows.push(activeRow);\n\n          // Create the new current row below the new fixed height row\n          activePage.currentRow = {\n            x: 0,\n            y: activeRow.y + activeRow.height,\n            height: 0\n          };\n        }\n        // TODO: Remove pages from _activePages when all rows are filled\n      }\n\n      // Exit the loop if there is enough room in the row\n      if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n        break;\n      }\n\n      // If there is not enough room in the current row, finish it and try again\n      if (activeRow === activePage.currentRow) {\n        activeRow.x = 0;\n        activeRow.y += activeRow.height;\n        activeRow.height = 0;\n      } else {\n        activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n      }\n    }\n\n    // Record texture position\n    rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n    rasterizedGlyph.texturePosition.x = activeRow.x;\n    rasterizedGlyph.texturePosition.y = activeRow.y;\n    rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n    rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n    // Fix the clipspace position as pages may be of differing size\n    rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n    rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n    // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n    // height\n    activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n    activeRow.x += rasterizedGlyph.size.x;\n\n    // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n    activePage.ctx.putImageData(\n      imageData,\n      rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n      rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n      this._workBoundingBox.left,\n      this._workBoundingBox.top,\n      rasterizedGlyph.size.x,\n      rasterizedGlyph.size.y\n    );\n    activePage.addGlyph(rasterizedGlyph);\n    activePage.version++;\n\n    return rasterizedGlyph;\n  }\n\n  /**\n   * Given an ImageData object, find the bounding box of the non-transparent\n   * portion of the texture and return an IRasterizedGlyph with these\n   * dimensions.\n   * @param imageData The image data to read.\n   * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n   */\n  private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n    boundingBox.top = 0;\n    const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n    const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n    let found = false;\n    for (let y = 0; y < height; y++) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.top = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.left = 0;\n    found = false;\n    for (let x = 0; x < padding + width; x++) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.left = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.right = width;\n    found = false;\n    for (let x = padding + width - 1; x >= padding; x--) {\n      for (let y = 0; y < height; y++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.right = x;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    boundingBox.bottom = height;\n    found = false;\n    for (let y = height - 1; y >= 0; y--) {\n      for (let x = 0; x < width; x++) {\n        const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n        if (imageData.data[alphaOffset] !== 0) {\n          boundingBox.bottom = y;\n          found = true;\n          break;\n        }\n      }\n      if (found) {\n        break;\n      }\n    }\n    return {\n      texturePage: 0,\n      texturePosition: { x: 0, y: 0 },\n      texturePositionClipSpace: { x: 0, y: 0 },\n      size: {\n        x: boundingBox.right - boundingBox.left + 1,\n        y: boundingBox.bottom - boundingBox.top + 1\n      },\n      sizeClipSpace: {\n        x: (boundingBox.right - boundingBox.left + 1),\n        y: (boundingBox.bottom - boundingBox.top + 1)\n      },\n      offset: {\n        x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n        y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n      }\n    };\n  }\n}\n\nclass AtlasPage {\n  public readonly canvas: HTMLCanvasElement;\n  public readonly ctx: CanvasRenderingContext2D;\n\n  private _usedPixels: number = 0;\n  public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n  private readonly _glyphs: IRasterizedGlyph[] = [];\n  public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n  public addGlyph(glyph: IRasterizedGlyph): void {\n    this._glyphs.push(glyph);\n    this._usedPixels += glyph.size.x * glyph.size.y;\n  }\n\n  /**\n   * Used to check whether the canvas of the atlas page has changed.\n   */\n  public version = 0;\n\n  // Texture atlas current positioning data. The texture packing strategy used is to fill from\n  // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n  // row's height, the following happens:\n  //\n  // - The current row becomes the fixed height row A\n  // - A new fixed height row B the exact size of the glyph is created below the current row\n  // - A new dynamic height current row is created below B\n  //\n  // This strategy does a good job preventing space being wasted for very short glyphs such as\n  // underscores, hyphens etc. or those with underlines rendered.\n  public currentRow: ICharAtlasActiveRow = {\n    x: 0,\n    y: 0,\n    height: 0\n  };\n  public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n  constructor(\n    document: Document,\n    size: number,\n    sourcePages?: AtlasPage[]\n  ) {\n    if (sourcePages) {\n      for (const p of sourcePages) {\n        this._glyphs.push(...p.glyphs);\n        this._usedPixels += p._usedPixels;\n      }\n    }\n    this.canvas = createCanvas(document, size, size);\n    // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n    // It might also contain some characters with transparent backgrounds if allowTransparency is\n    // set.\n    this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n  }\n\n  public clear(): void {\n    this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n    this.currentRow.x = 0;\n    this.currentRow.y = 0;\n    this.currentRow.height = 0;\n    this.fixedRows.length = 0;\n    this.version++;\n  }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n  // Get color channels\n  const r = bg.rgba >>> 24;\n  const g = bg.rgba >>> 16 & 0xFF;\n  const b = bg.rgba >>> 8 & 0xFF;\n  const fgR = fg.rgba >>> 24;\n  const fgG = fg.rgba >>> 16 & 0xFF;\n  const fgB = fg.rgba >>> 8 & 0xFF;\n\n  // Calculate a threshold that when below a color will be treated as transpart when the sum of\n  // channel value differs. This helps improve rendering when glyphs overlap with others. This\n  // threshold is calculated relative to the difference between the background and foreground to\n  // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n  // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n  // were covered (fg=#8ae234, bg=#c4a000).\n  const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n  // Set alpha channel of relevent pixels to 0\n  let isEmpty = true;\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    // Check exact match\n    if (imageData.data[offset] === r &&\n        imageData.data[offset + 1] === g &&\n        imageData.data[offset + 2] === b) {\n      imageData.data[offset + 3] = 0;\n    } else {\n      // Check the threshold based difference\n      if (enableThresholdCheck &&\n          (Math.abs(imageData.data[offset] - r) +\n          Math.abs(imageData.data[offset + 1] - g) +\n          Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n        imageData.data[offset + 3] = 0;\n      } else {\n        isEmpty = false;\n      }\n    }\n  }\n\n  return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n  for (let offset = 0; offset < imageData.data.length; offset += 4) {\n    if (imageData.data[offset + 3] > 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n  const canvas = document.createElement('canvas');\n  canvas.width = width;\n  canvas.height = height;\n  return canvas;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n  export function toCss(r: number, g: number, b: number, a?: number): string {\n    if (a !== undefined) {\n      return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n    }\n    return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n  }\n\n  export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n    // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n    // on LE systems, before it can be used for direct 32-bit buffer writes.\n    // >>> 0 forces an unsigned int\n    return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n  }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n  export function blend(bg: IColor, fg: IColor): IColor {\n    $a = (fg.rgba & 0xFF) / 255;\n    if ($a === 1) {\n      return {\n        css: fg.css,\n        rgba: fg.rgba\n      };\n    }\n    const fgR = (fg.rgba >> 24) & 0xFF;\n    const fgG = (fg.rgba >> 16) & 0xFF;\n    const fgB = (fg.rgba >> 8) & 0xFF;\n    const bgR = (bg.rgba >> 24) & 0xFF;\n    const bgG = (bg.rgba >> 16) & 0xFF;\n    const bgB = (bg.rgba >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    const css = channels.toCss($r, $g, $b);\n    const rgba = channels.toRgba($r, $g, $b);\n    return { css, rgba };\n  }\n\n  export function isOpaque(color: IColor): boolean {\n    return (color.rgba & 0xFF) === 0xFF;\n  }\n\n  export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n    const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n    if (!result) {\n      return undefined;\n    }\n    return rgba.toColor(\n      (result >> 24 & 0xFF),\n      (result >> 16 & 0xFF),\n      (result >> 8  & 0xFF)\n    );\n  }\n\n  export function opaque(color: IColor): IColor {\n    const rgbaColor = (color.rgba | 0xFF) >>> 0;\n    [$r, $g, $b] = rgba.toChannels(rgbaColor);\n    return {\n      css: channels.toCss($r, $g, $b),\n      rgba: rgbaColor\n    };\n  }\n\n  export function opacity(color: IColor, opacity: number): IColor {\n    $a = Math.round(opacity * 0xFF);\n    [$r, $g, $b] = rgba.toChannels(color.rgba);\n    return {\n      css: channels.toCss($r, $g, $b, $a),\n      rgba: channels.toRgba($r, $g, $b, $a)\n    };\n  }\n\n  export function multiplyOpacity(color: IColor, factor: number): IColor {\n    $a = color.rgba & 0xFF;\n    return opacity(color, ($a * factor) / 0xFF);\n  }\n\n  export function toColorRGB(color: IColor): IColorRGB {\n    return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n  }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  if (!isNode) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return rgba.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $a = parseInt(css.slice(4, 5).repeat(2), 16);\n          return rgba.toColor($r, $g, $b, $a);\n        }\n        case 7: // #rrggbb\n          return {\n            css,\n            rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n          };\n        case 9: // #rrggbbaa\n          return {\n            css,\n            rgba: parseInt(css.slice(1), 16) >>> 0\n          };\n      }\n    }\n\n    // Formats: rgb() or rgba()\n    const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n    if (rgbaMatch) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return rgba.toColor($r, $g, $b, $a);\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param rgb The color to use.\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance(rgb: number): number {\n    return relativeLuminance2(\n      (rgb >> 16) & 0xFF,\n      (rgb >> 8 ) & 0xFF,\n      (rgb      ) & 0xFF);\n  }\n\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param r The red channel (0x00 to 0xFF).\n   * @param g The green channel (0x00 to 0xFF).\n   * @param b The blue channel (0x00 to 0xFF).\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance2(r: number, g: number, b: number): number {\n    const rs = r / 255;\n    const gs = g / 255;\n    const bs = b / 255;\n    const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n    const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n    const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n    return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n  /**\n   * Given a foreground color and a background color, either increase or reduce the luminance of the\n   * foreground color until the specified contrast ratio is met. If pure white or black is hit\n   * without the contrast ratio being met, go the other direction using the background color as the\n   * foreground color and take either the first or second result depending on which has the higher\n   * contrast ratio.\n   *\n   * `undefined` will be returned if the contrast ratio is already met.\n   *\n   * @param bgRgba The background color in rgba format.\n   * @param fgRgba The foreground color in rgba format.\n   * @param ratio The contrast ratio to achieve.\n   */\n  export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n    const bgL = rgb.relativeLuminance(bgRgba >> 8);\n    const fgL = rgb.relativeLuminance(fgRgba >> 8);\n    const cr = contrastRatio(bgL, fgL);\n    if (cr < ratio) {\n      if (fgL < bgL) {\n        const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n        if (resultARatio < ratio) {\n          const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n          const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n          return resultARatio > resultBRatio ? resultA : resultB;\n        }\n        return resultA;\n      }\n      const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n      const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n      if (resultARatio < ratio) {\n        const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n        return resultARatio > resultBRatio ? resultA : resultB;\n      }\n      return resultA;\n    }\n    return undefined;\n  }\n\n  export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to reducing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n      // Reduce by 10% until the ratio is hit\n      fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n      fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n      fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to increasing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n      // Increase by 10% until the ratio is hit\n      fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n      fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n      fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  // FIXME: Move this to channels NS?\n  export function toChannels(value: number): [number, number, number, number] {\n    return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n  }\n\n  export function toColor(r: number, g: number, b: number, a?: number): IColor {\n    return {\n      css: channels.toCss(r, g, b, a),\n      rgba: channels.toRgba(r, g, b, a)\n    };\n  }\n}\n\nexport function toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n  if (l1 < l2) {\n    return (l2 + 0.05) / (l1 + 0.05);\n  }\n  return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n  (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n  (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n  event: IEvent<T, U>;\n  fire(arg1: T, arg2: U): void;\n  dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n  private _listeners: IListener<T, U>[] = [];\n  private _event?: IEvent<T, U>;\n  private _disposed: boolean = false;\n\n  public get event(): IEvent<T, U> {\n    if (!this._event) {\n      this._event = (listener: (arg1: T, arg2: U) => any) => {\n        this._listeners.push(listener);\n        const disposable = {\n          dispose: () => {\n            if (!this._disposed) {\n              for (let i = 0; i < this._listeners.length; i++) {\n                if (this._listeners[i] === listener) {\n                  this._listeners.splice(i, 1);\n                  return;\n                }\n              }\n            }\n          }\n        };\n        return disposable;\n      };\n    }\n    return this._event;\n  }\n\n  public fire(arg1: T, arg2: U): void {\n    const queue: IListener<T, U>[] = [];\n    for (let i = 0; i < this._listeners.length; i++) {\n      queue.push(this._listeners[i]);\n    }\n    for (let i = 0; i < queue.length; i++) {\n      queue[i].call(undefined, arg1, arg2);\n    }\n  }\n\n  public dispose(): void {\n    this.clearListeners();\n    this._disposed = true;\n  }\n\n  public clearListeners(): void {\n    if (this._listeners) {\n      this._listeners.length = 0;\n    }\n  }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n  return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n  protected _disposables: IDisposable[] = [];\n  protected _isDisposed: boolean = false;\n\n  /**\n   * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n   */\n  public dispose(): void {\n    this._isDisposed = true;\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.length = 0;\n  }\n\n  /**\n   * Registers a disposable object.\n   * @param d The disposable to register.\n   * @returns The disposable.\n   */\n  public register<T extends IDisposable>(d: T): T {\n    this._disposables.push(d);\n    return d;\n  }\n\n  /**\n   * Unregisters a disposable object if it has been registered, if not do\n   * nothing.\n   * @param d The disposable to unregister.\n   */\n  public unregister<T extends IDisposable>(d: T): void {\n    const index = this._disposables.indexOf(d);\n    if (index !== -1) {\n      this._disposables.splice(index, 1);\n    }\n  }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value?: T;\n  private _isDisposed = false;\n\n  /**\n   * Gets the value if it exists.\n   */\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  /**\n   * Sets the value, disposing of the old value if it exists.\n   */\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  /**\n   * Resets the stored value and disposes of the previously stored value.\n   */\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\n  }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n  return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n  for (const d of disposables) {\n    d.dispose();\n  }\n  disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n  return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n  private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n  public set(first: TFirst, second: TSecond, value: TValue): void {\n    if (!this._data[first]) {\n      this._data[first] = {};\n    }\n    this._data[first as string | number]![second] = value;\n  }\n\n  public get(first: TFirst, second: TSecond): TValue | undefined {\n    return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n  }\n\n  public clear(): void {\n    this._data = {};\n  }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n  private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n  public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n    if (!this._data.get(first, second)) {\n      this._data.set(first, second, new TwoKeyMap());\n    }\n    this._data.get(first, second)!.set(third, fourth, value);\n  }\n\n  public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n    return this._data.get(first, second)?.get(third, fourth);\n  }\n\n  public clear(): void {\n    this._data.clear();\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n  userAgent: string;\n  language: string;\n  platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nexport const isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = Date.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n      // this is not an issue here as a clock change during a short running task is very unlikely\n      // in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, Date.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = Date.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - Date.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor() {\n    this._queue = new IdleTaskQueue();\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  public static toColorRGB(value: number): IColorRGB {\n    return [\n      value >>> Attributes.RED_SHIFT & 255,\n      value >>> Attributes.GREEN_SHIFT & 255,\n      value & 255\n    ];\n  }\n\n  public static fromColorRGB(value: IColorRGB): number {\n    return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n  }\n\n  public clone(): IAttributeData {\n    const newObj = new AttributeData();\n    newObj.fg = this.fg;\n    newObj.bg = this.bg;\n    newObj.extended = this.extended.clone();\n    return newObj;\n  }\n\n  // data\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n\n  // flags\n  public isInverse(): number       { return this.fg & FgFlags.INVERSE; }\n  public isBold(): number          { return this.fg & FgFlags.BOLD; }\n  public isUnderline(): number     {\n    if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n      return 1;\n    }\n    return this.fg & FgFlags.UNDERLINE;\n  }\n  public isBlink(): number         { return this.fg & FgFlags.BLINK; }\n  public isInvisible(): number     { return this.fg & FgFlags.INVISIBLE; }\n  public isItalic(): number        { return this.bg & BgFlags.ITALIC; }\n  public isDim(): number           { return this.bg & BgFlags.DIM; }\n  public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n  public isProtected(): number     { return this.bg & BgFlags.PROTECTED; }\n  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\n\n  // color modes\n  public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n  public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n  public isFgRGB(): boolean       { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isBgRGB(): boolean       { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isFgPalette(): boolean   { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isBgPalette(): boolean   { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isFgDefault(): boolean   { return (this.fg & Attributes.CM_MASK) === 0; }\n  public isBgDefault(): boolean   { return (this.bg & Attributes.CM_MASK) === 0; }\n  public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n  // colors\n  public getFgColor(): number {\n    switch (this.fg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.fg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.fg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n  public getBgColor(): number {\n    switch (this.bg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.bg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.bg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n\n  // extended attrs\n  public hasExtendedAttrs(): number {\n    return this.bg & BgFlags.HAS_EXTENDED;\n  }\n  public updateExtended(): void {\n    if (this.extended.isEmpty()) {\n      this.bg &= ~BgFlags.HAS_EXTENDED;\n    } else {\n      this.bg |= BgFlags.HAS_EXTENDED;\n    }\n  }\n  public getUnderlineColor(): number {\n    if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n      switch (this.extended.underlineColor & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:  return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n        case Attributes.CM_RGB:   return this.extended.underlineColor & Attributes.RGB_MASK;\n        default:                  return this.getFgColor();\n      }\n    }\n    return this.getFgColor();\n  }\n  public getUnderlineColorMode(): number {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? this.extended.underlineColor & Attributes.CM_MASK\n      : this.getFgColorMode();\n  }\n  public isUnderlineColorRGB(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n      : this.isFgRGB();\n  }\n  public isUnderlineColorPalette(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n          || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n      : this.isFgPalette();\n  }\n  public isUnderlineColorDefault(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n      : this.isFgDefault();\n  }\n  public getUnderlineStyle(): UnderlineStyle {\n    return this.fg & FgFlags.UNDERLINE\n      ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n      : UnderlineStyle.NONE;\n  }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n  private _ext: number = 0;\n  public get ext(): number {\n    if (this._urlId) {\n      return (\n        (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n        (this.underlineStyle << 26)\n      );\n    }\n    return this._ext;\n  }\n  public set ext(value: number) { this._ext = value; }\n\n  public get underlineStyle(): UnderlineStyle {\n    // Always return the URL style if it has one\n    if (this._urlId) {\n      return UnderlineStyle.DASHED;\n    }\n    return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n  }\n  public set underlineStyle(value: UnderlineStyle) {\n    this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n    this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n  }\n\n  public get underlineColor(): number {\n    return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n  public set underlineColor(value: number) {\n    this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n\n  private _urlId: number = 0;\n  public get urlId(): number {\n    return this._urlId;\n  }\n  public set urlId(value: number) {\n    this._urlId = value;\n  }\n\n  constructor(\n    ext: number = 0,\n    urlId: number = 0\n  ) {\n    this._ext = ext;\n    this._urlId = urlId;\n  }\n\n  public clone(): IExtendedAttrs {\n    return new ExtendedAttrs(this._ext, this._urlId);\n  }\n\n  /**\n   * Convenient method to indicate whether the object holds no additional information,\n   * that needs to be persistant in the buffer.\n   */\n  public isEmpty(): boolean {\n    return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n  /** Helper to create CellData from CharData. */\n  public static fromCharData(value: CharData): CellData {\n    const obj = new CellData();\n    obj.setFromCharData(value);\n    return obj;\n  }\n  /** Primitives from terminal buffer. */\n  public content = 0;\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n  public combinedData = '';\n  /** Whether cell contains a combined string. */\n  public isCombined(): number {\n    return this.content & Content.IS_COMBINED_MASK;\n  }\n  /** Width of the cell. */\n  public getWidth(): number {\n    return this.content >> Content.WIDTH_SHIFT;\n  }\n  /** JS string of the content. */\n  public getChars(): string {\n    if (this.content & Content.IS_COMBINED_MASK) {\n      return this.combinedData;\n    }\n    if (this.content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n    }\n    return '';\n  }\n  /**\n   * Codepoint of cell\n   * Note this returns the UTF32 codepoint of single chars,\n   * if content is a combined string it returns the codepoint\n   * of the last char in string to be in line with code in CharData.\n   */\n  public getCode(): number {\n    return (this.isCombined())\n      ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n      : this.content & Content.CODEPOINT_MASK;\n  }\n  /** Set data from CharData */\n  public setFromCharData(value: CharData): void {\n    this.fg = value[CHAR_DATA_ATTR_INDEX];\n    this.bg = 0;\n    let combined = false;\n    // surrogates and combined strings need special treatment\n    if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n      combined = true;\n    }\n    else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n      const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n      // if the 2-char string is a surrogate create single codepoint\n      // everything else is combined\n      if (0xD800 <= code && code <= 0xDBFF) {\n        const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n        }\n        else {\n          combined = true;\n        }\n      }\n      else {\n        combined = true;\n      }\n    }\n    else {\n      this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n    if (combined) {\n      this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n      this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n  /** Get data as CharData. */\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n  /**\n   * bit 1..21    codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n   *              read:   `codepoint = content & Content.codepointMask;`\n   *              write:  `content |= codepoint & Content.codepointMask;`\n   *                      shortcut if precondition `codepoint <= 0x10FFFF` is met:\n   *                      `content |= codepoint;`\n   */\n  CODEPOINT_MASK = 0x1FFFFF,\n\n  /**\n   * bit 22       flag indication whether a cell contains combined content\n   *              read:   `isCombined = content & Content.isCombined;`\n   *              set:    `content |= Content.isCombined;`\n   *              clear:  `content &= ~Content.isCombined;`\n   */\n  IS_COMBINED_MASK = 0x200000,  // 1 << 21\n\n  /**\n   * bit 1..22    mask to check whether a cell contains any string data\n   *              we need to check for codepoint and isCombined bits to see\n   *              whether a cell contains anything\n   *              read:   `isEmpty = !(content & Content.hasContent)`\n   */\n  HAS_CONTENT_MASK = 0x3FFFFF,\n\n  /**\n   * bit 23..24   wcwidth value of cell, takes 2 bits (ranges from 0..2)\n   *              read:   `width = (content & Content.widthMask) >> Content.widthShift;`\n   *                      `hasWidth = content & Content.widthMask;`\n   *                      as long as wcwidth is highest value in `content`:\n   *                      `width = content >> Content.widthShift;`\n   *              write:  `content |= (width << Content.widthShift) & Content.widthMask;`\n   *                      shortcut if precondition `0 <= width <= 3` is met:\n   *                      `content |= width << Content.widthShift;`\n   */\n  WIDTH_MASK = 0xC00000,   // 3 << 22\n  WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n  /**\n   * bit 1..8     blue in RGB, color in P256 and P16\n   */\n  BLUE_MASK = 0xFF,\n  BLUE_SHIFT = 0,\n  PCOLOR_MASK = 0xFF,\n  PCOLOR_SHIFT = 0,\n\n  /**\n   * bit 9..16    green in RGB\n   */\n  GREEN_MASK = 0xFF00,\n  GREEN_SHIFT = 8,\n\n  /**\n   * bit 17..24   red in RGB\n   */\n  RED_MASK = 0xFF0000,\n  RED_SHIFT = 16,\n\n  /**\n   * bit 25..26   color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n   */\n  CM_MASK = 0x3000000,\n  CM_DEFAULT = 0,\n  CM_P16 = 0x1000000,\n  CM_P256 = 0x2000000,\n  CM_RGB = 0x3000000,\n\n  /**\n   * bit 1..24  RGB room\n   */\n  RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n  /**\n   * bit 27..32\n   */\n  INVERSE = 0x4000000,\n  BOLD = 0x8000000,\n  UNDERLINE = 0x10000000,\n  BLINK = 0x20000000,\n  INVISIBLE = 0x40000000,\n  STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n  /**\n   * bit 27..32 (upper 2 unused)\n   */\n  ITALIC = 0x4000000,\n  DIM = 0x8000000,\n  HAS_EXTENDED = 0x10000000,\n  PROTECTED = 0x20000000,\n  OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n  /**\n   * bit 27..32 (upper 3 unused)\n   */\n  UNDERLINE_STYLE = 0x1C000000\n}\n\nexport const enum UnderlineStyle {\n  NONE = 0,\n  SINGLE = 1,\n  DOUBLE = 2,\n  CURLY = 3,\n  DOTTED = 4,\n  DASHED = 5\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n *       due to additional sanity checks. We can avoid them since\n *       we always operate on legal UTF32 (granted by the input decoders)\n *       and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n  if (codePoint > 0xFFFF) {\n    codePoint -= 0x10000;\n    return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n  }\n  return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n  let result = '';\n  for (let i = start; i < end; ++i) {\n    let codepoint = data[i];\n    if (codepoint > 0xFFFF) {\n      // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n      // pair conversion rules:\n      //  - subtract 0x10000 from code point, leaving a 20 bit number\n      //  - add high 10 bits to 0xD800  --> first surrogate\n      //  - add low 10 bits to 0xDC00   --> second surrogate\n      codepoint -= 0x10000;\n      result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n    } else {\n      result += String.fromCharCode(codepoint);\n    }\n  }\n  return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n  private _interim: number = 0;\n\n  /**\n   * Clears interim and resets decoder to clean state.\n   */\n  public clear(): void {\n    this._interim = 0;\n  }\n\n  /**\n   * Decode JS string to UTF32 codepoints.\n   * The methods assumes stream input and will store partly transmitted\n   * surrogate pairs and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided input data does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: string, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let startPos = 0;\n\n    // handle leftover surrogate high\n    if (this._interim) {\n      const second = input.charCodeAt(startPos++);\n      if (0xDC00 <= second && second <= 0xDFFF) {\n        target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n      } else {\n        // illegal codepoint (USC2 handling)\n        target[size++] = this._interim;\n        target[size++] = second;\n      }\n      this._interim = 0;\n    }\n\n    for (let i = startPos; i < length; ++i) {\n      const code = input.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          this._interim = code;\n          return size;\n        }\n        const second = input.charCodeAt(i);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          // illegal codepoint (USC2 handling)\n          target[size++] = code;\n          target[size++] = second;\n        }\n        continue;\n      }\n      if (code === 0xFEFF) {\n        // BOM\n        continue;\n      }\n      target[size++] = code;\n    }\n    return size;\n  }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n  public interim: Uint8Array = new Uint8Array(3);\n\n  /**\n   * Clears interim bytes and resets decoder to clean state.\n   */\n  public clear(): void {\n    this.interim.fill(0);\n  }\n\n  /**\n   * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n   * The methods assumes stream input and will store partly transmitted bytes\n   * and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided data chunk does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: Uint8Array, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let byte1: number;\n    let byte2: number;\n    let byte3: number;\n    let byte4: number;\n    let codepoint = 0;\n    let startPos = 0;\n\n    // handle leftover bytes\n    if (this.interim[0]) {\n      let discardInterim = false;\n      let cp = this.interim[0];\n      cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n      let pos = 0;\n      let tmp: number;\n      while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n        cp <<= 6;\n        cp |= tmp;\n      }\n      // missing bytes - read ahead from input\n      const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n      const missing = type - pos;\n      while (startPos < missing) {\n        if (startPos >= length) {\n          return 0;\n        }\n        tmp = input[startPos++];\n        if ((tmp & 0xC0) !== 0x80) {\n          // wrong continuation, discard interim bytes completely\n          startPos--;\n          discardInterim = true;\n          break;\n        } else {\n          // need to save so we can continue short inputs in next call\n          this.interim[pos++] = tmp;\n          cp <<= 6;\n          cp |= tmp & 0x3F;\n        }\n      }\n      if (!discardInterim) {\n        // final test is type dependent\n        if (type === 2) {\n          if (cp < 0x80) {\n            // wrong starter byte\n            startPos--;\n          } else {\n            target[size++] = cp;\n          }\n        } else if (type === 3) {\n          if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n            // illegal codepoint or BOM\n          } else {\n            target[size++] = cp;\n          }\n        } else {\n          if (cp < 0x010000 || cp > 0x10FFFF) {\n            // illegal codepoint\n          } else {\n            target[size++] = cp;\n          }\n        }\n      }\n      this.interim.fill(0);\n    }\n\n    // loop through input\n    const fourStop = length - 4;\n    let i = startPos;\n    while (i < length) {\n      /**\n       * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n       * This is a compromise between speed gain for ASCII\n       * and penalty for non ASCII:\n       * For best ASCII performance the char should be stored directly into target,\n       * but even a single attempt to write to target and compare afterwards\n       * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n       * which reduces ASCII performance by ~15%.\n       * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n       * compared to the gains.\n       * Note that this optimization only takes place for 4 consecutive ASCII chars,\n       * for any shorter it bails out. Worst case - all 4 bytes being read but\n       * thrown away due to the last being a non ASCII char (-10% performance).\n       */\n      while (i < fourStop\n        && !((byte1 = input[i]) & 0x80)\n        && !((byte2 = input[i + 1]) & 0x80)\n        && !((byte3 = input[i + 2]) & 0x80)\n        && !((byte4 = input[i + 3]) & 0x80))\n      {\n        target[size++] = byte1;\n        target[size++] = byte2;\n        target[size++] = byte3;\n        target[size++] = byte4;\n        i += 4;\n      }\n\n      // reread byte1\n      byte1 = input[i++];\n\n      // 1 byte\n      if (byte1 < 0x80) {\n        target[size++] = byte1;\n\n        // 2 bytes\n      } else if ((byte1 & 0xE0) === 0xC0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n        if (codepoint < 0x80) {\n          // wrong starter byte\n          i--;\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 3 bytes\n      } else if ((byte1 & 0xF0) === 0xE0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n        if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n          // illegal codepoint or BOM, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 4 bytes\n      } else if ((byte1 & 0xF8) === 0xF0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          this.interim[2] = byte3;\n          return size;\n        }\n        byte4 = input[i++];\n        if ((byte4 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n        if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n          // illegal codepoint, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n      } else {\n        // illegal byte, just skip\n      }\n    }\n    return size;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n  log: LogType;\n  error: LogType;\n  info: LogType;\n  trace: LogType;\n  warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n  trace: LogLevelEnum.TRACE,\n  debug: LogLevelEnum.DEBUG,\n  info: LogLevelEnum.INFO,\n  warn: LogLevelEnum.WARN,\n  error: LogLevelEnum.ERROR,\n  off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n    // For trace logging, assume the latest created log service is valid\n    traceLogger = this;\n  }\n\n  private _updateLogLevel(): void {\n    this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n  }\n\n  private _evalLazyOptionalParams(optionalParams: any[]): void {\n    for (let i = 0; i < optionalParams.length; i++) {\n      if (typeof optionalParams[i] === 'function') {\n        optionalParams[i] = optionalParams[i]();\n      }\n    }\n  }\n\n  private _log(type: LogType, message: string, optionalParams: any[]): void {\n    this._evalLazyOptionalParams(optionalParams);\n    type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n  traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n  if (typeof descriptor.value !== 'function') {\n    throw new Error('not supported');\n  }\n  const fnKey = 'value';\n  const fn = descriptor.value;\n  descriptor[fnKey] = function (...args: any[]) {\n    // Early exit\n    if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n      return fn.apply(this, args);\n    }\n\n    traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n    const result = fn.apply(this, args);\n    traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n    return result;\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n  return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n  if (serviceRegistry.has(id)) {\n    return serviceRegistry.get(id)!;\n  }\n\n  const decorator: any = function (target: Function, key: string, index: number): any {\n    if (arguments.length !== 3) {\n      throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n    }\n\n    storeServiceDependency(decorator, target, index);\n  };\n\n  decorator.toString = () => id;\n\n  serviceRegistry.set(id, decorator);\n  return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n  if ((target as any)[DI_TARGET] === target) {\n    (target as any)[DI_DEPENDENCIES].push({ id, index });\n  } else {\n    (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n    (target as any)[DI_TARGET] = target;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: undefined;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n  isUserScrolling: boolean;\n  onResize: IEvent<{ cols: number, rows: number }>;\n  onScroll: IEvent<number>;\n  scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n  scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n  resize(cols: number, rows: number): void;\n  reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n  activeProtocol: string;\n  activeEncoding: string;\n  areMouseEventsActive: boolean;\n  addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n  addEncoding(name: string, encoding: CoreMouseEncoding): void;\n  reset(): void;\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n  /**\n   * Event to announce changes in mouse tracking.\n   */\n  onProtocolChange: IEvent<CoreMouseEventType>;\n\n  /**\n   * Human readable version of mouse events.\n   */\n  explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n  serviceBrand: undefined;\n\n  /**\n   * Initially the cursor will not be visible until the first time the terminal\n   * is focused.\n   */\n  isCursorInitialized: boolean;\n  isCursorHidden: boolean;\n\n  readonly modes: IModes;\n  readonly decPrivateModes: IDecPrivateModes;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\n  readonly onBinary: IEvent<string>;\n  readonly onRequestScrollToBottom: IEvent<void>;\n\n  reset(): void;\n\n  /**\n   * Triggers the onData event in the public API.\n   * @param data The data that is being emitted.\n   * @param wasUserInput Whether the data originated from the user (as opposed to\n   * resulting from parsing incoming data). When true this will also:\n   * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n   * - Fire the `onUserInput` event (so selection can be cleared).\n   */\n  triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n  /**\n   * Triggers the onBinary event in the public API.\n   * @param data The data that is being emitted.\n   */\n  triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n  serviceBrand: undefined;\n\n  charset: ICharset | undefined;\n  readonly glevel: number;\n\n  reset(): void;\n\n  /**\n   * Set the G level of the terminal.\n   * @param g\n   */\n  setgLevel(g: number): void;\n\n  /**\n   * Set the charset for the given G level of the terminal.\n   * @param g\n   * @param charset\n   */\n  setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n    : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  serviceBrand: undefined;\n\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n  getService<T>(id: IServiceIdentifier<T>): T | undefined;\n  createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\n  debug(message: any, ...optionalParams: any[]): void;\n  info(message: any, ...optionalParams: any[]): void;\n  warn(message: any, ...optionalParams: any[]): void;\n  error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n  serviceBrand: undefined;\n\n  /**\n   * Read only access to the raw options object, this is an internal-only fast path for accessing\n   * single options without any validation as we trust TypeScript to enforce correct usage\n   * internally.\n   */\n  readonly rawOptions: Required<ITerminalOptions>;\n\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n  allowProposedApi?: boolean;\n  allowTransparency?: boolean;\n  altClickMovesCursor?: boolean;\n  cols?: number;\n  convertEol?: boolean;\n  cursorBlink?: boolean;\n  cursorStyle?: CursorStyle;\n  cursorWidth?: number;\n  cursorInactiveStyle?: CursorInactiveStyle;\n  customGlyphs?: boolean;\n  disableStdin?: boolean;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsMode?: boolean;\n  windowsPty?: IWindowsPty;\n  windowOptions?: IWindowOptions;\n  wordSeparator?: string;\n  overviewRulerWidth?: number;\n\n  [key: string]: any;\n  cancelEvents: boolean;\n  termName: string;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selectionForeground?: string;\n  selectionBackground?: string;\n  selectionInactiveBackground?: string;\n  black?: string;\n  red?: string;\n  green?: string;\n  yellow?: string;\n  blue?: string;\n  magenta?: string;\n  cyan?: string;\n  white?: string;\n  brightBlack?: string;\n  brightRed?: string;\n  brightGreen?: string;\n  brightYellow?: string;\n  brightBlue?: string;\n  brightMagenta?: string;\n  brightCyan?: string;\n  brightWhite?: string;\n  extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n  serviceBrand: undefined;\n  /**\n   * Registers a link to the service, returning the link ID. The link data is managed by this\n   * service and will be freed when this current cursor position is trimmed off the buffer.\n   */\n  registerLink(linkData: IOscLinkData): number;\n  /**\n   * Adds a line to a link if needed.\n   */\n  addLineToLink(linkId: number, y: number): void;\n  /** Get the link data associated with a link ID. */\n  getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n  serviceBrand: undefined;\n  /** Register an Unicode version provider. */\n  register(provider: IUnicodeVersionProvider): void;\n  /** Registered Unicode versions. */\n  readonly versions: string[];\n  /** Currently active version. */\n  activeVersion: string;\n  /** Event triggered, when activate version changed. */\n  readonly onChange: IEvent<string>;\n\n  /**\n   * Unicode version dependent\n   */\n  wcwidth(codepoint: number): number;\n  getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n  readonly version: string;\n  wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n  serviceBrand: undefined;\n  readonly decorations: IterableIterator<IInternalDecoration>;\n  readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n  readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n  registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n  reset(): void;\n  /**\n   * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n   * instead of an iterator as it's typically used in hot code paths.\n   */\n  forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n  readonly options: IDecorationOptions;\n  readonly backgroundColorRGB: IColor | undefined;\n  readonly foregroundColorRGB: IColor | undefined;\n  readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { ITerminalAddon, Terminal } from 'xterm';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon {\n  private _terminal?: Terminal;\n  private _renderer?: WebglRenderer;\n\n  private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n  private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n  private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n  public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n  private readonly _onContextLoss = this.register(new EventEmitter<void>());\n  public readonly onContextLoss = this._onContextLoss.event;\n\n  constructor(\n    private _preserveDrawingBuffer?: boolean\n  ) {\n    if (isSafari && getSafariVersion() < 16) {\n      throw new Error('Webgl2 is only supported on Safari 16 and above');\n    }\n    super();\n  }\n\n  public activate(terminal: Terminal): void {\n    const core = (terminal as any)._core as ITerminal;\n    if (!terminal.element) {\n      this.register(core.onWillOpen(() => this.activate(terminal)));\n      return;\n    }\n\n    this._terminal = terminal;\n    const coreService: ICoreService = core.coreService;\n    const optionsService: IOptionsService = core.optionsService;\n\n    const unsafeCore = core as any;\n    const renderService: IRenderService = unsafeCore._renderService;\n    const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n    const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n    const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n    const decorationService: IDecorationService = unsafeCore._decorationService;\n    const logService: ILogService = unsafeCore._logService;\n    const themeService: IThemeService = unsafeCore._themeService;\n\n    // Set trace logger just in case it hasn't been yet which could happen when the addon is\n    // bundled separately to the core module\n    setTraceLogger(logService);\n\n    this._renderer = this.register(new WebglRenderer(\n      terminal,\n      characterJoinerService,\n      charSizeService,\n      coreBrowserService,\n      coreService,\n      decorationService,\n      optionsService,\n      themeService,\n      this._preserveDrawingBuffer\n    ));\n    this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss));\n    this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n    this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n    this.register(forwardEvent(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n    renderService.setRenderer(this._renderer);\n\n    this.register(toDisposable(() => {\n      const renderService: IRenderService = (this._terminal as any)._core._renderService;\n      renderService.setRenderer((this._terminal as any)._core._createRenderer());\n      renderService.handleResize(terminal.cols, terminal.rows);\n    }));\n  }\n\n  public get textureAtlas(): HTMLCanvasElement | undefined {\n    return this._renderer?.textureAtlas;\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderer?.clearTextureAtlas();\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","self","INDICES_PER_CELL","BYTES_PER_CELL","Float32Array","BYTES_PER_ELEMENT","$glyph","$i","$leftCellPadding","$clippedPixels","GlyphRenderer","Disposable","constructor","_terminal","_gl","_dimensions","super","_activeBuffer","_vertices","count","attributes","attributesBuffers","gl","this","undefined","TextureAtlas","maxAtlasPages","Math","min","throwIfFalsy","getParameter","MAX_TEXTURE_IMAGE_UNITS","maxTextureSize","MAX_TEXTURE_SIZE","_program","createProgram","maxFragmentShaderTextureUnits","textureConditionals","i","createFragmentShaderSource","register","toDisposable","deleteProgram","_projectionLocation","getUniformLocation","_resolutionLocation","_textureLocation","_vertexArrayObject","createVertexArray","bindVertexArray","unitQuadVertices","unitQuadVerticesBuffer","createBuffer","deleteBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","enableVertexAttribArray","vertexAttribPointer","FLOAT","unitQuadElementIndices","Uint8Array","elementIndicesBuffer","ELEMENT_ARRAY_BUFFER","_attributesBuffer","vertexAttribDivisor","useProgram","textureUnits","Int32Array","uniform1iv","uniformMatrix4fv","PROJECTION_MATRIX","_atlasTextures","glTexture","GLTexture","createTexture","deleteTexture","texture","activeTexture","TEXTURE0","bindTexture","TEXTURE_2D","texParameteri","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","RGBA","UNSIGNED_BYTE","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","handleResize","beginFrame","_atlas","updateCell","x","y","code","bg","fg","ext","chars","lastBg","_updateCell","array","cols","NULL_CELL_CODE","length","getRasterizedGlyphCombinedChar","getRasterizedGlyph","floor","device","cell","width","char","offset","left","top","size","canvas","height","texturePage","texturePositionClipSpace","pages","sizeClipSpace","fill","clear","terminal","newCount","rows","viewport","uniform2f","render","renderModel","activeBuffer","bufferLength","lineLengths","si","sub","subarray","set","STREAM_DRAW","version","_bindAtlasPageTexture","drawElementsInstanced","TRIANGLE_STRIP","setAtlas","atlas","generateMipmap","setDimensions","dimensions","traceCall","BYTES_PER_RECTANGLE","Vertices","$rgba","$x1","$y1","$r","$g","$b","$a","RectangleRenderer","_themeService","_verticesCursor","_updateCachedColors","colors","onChangeColors","e","_updateViewportRectangle","renderBackgrounds","_renderVertices","renderCursor","vertices","DYNAMIC_DRAW","_bgFloat","_colorToFloat32Array","background","_cursorFloat","cursor","_addRectangleFloat","updateBackgrounds","model","currentStartX","currentBg","currentFg","currentInverse","modelIndex","inverse","rectangleCount","RENDER_MODEL_INDICIES_PER_CELL","cells","RENDER_MODEL_BG_OFFSET","RENDER_MODEL_FG_OFFSET","_updateRectangle","updateCursor","style","dpr","cursorWidth","startX","endX","ansi","rgba","foreground","expandFloat32Array","_addRectangle","x1","y1","r","g","b","a","color","RENDER_MODEL_EXT_OFFSET","COMBINED_CHAR_BIT_MASK","Uint32Array","selection","createSelectionRenderModel","resize","indexCount","WebglRenderer","_characterJoinerService","_charSizeService","_coreBrowserService","_coreService","_decorationService","_optionsService","preserveDrawingBuffer","_cursorBlinkStateManager","MutableDisposable","_charAtlasDisposable","_model","RenderModel","_workCell","CellData","_rectangleRenderer","_glyphRenderer","_onChangeTextureAtlas","EventEmitter","onChangeTextureAtlas","event","_onAddTextureAtlasCanvas","onAddTextureAtlasCanvas","_onRemoveTextureAtlasCanvas","onRemoveTextureAtlasCanvas","_onRequestRedraw","onRequestRedraw","_onContextLoss","onContextLoss","_handleColorChange","_cellColorResolver","CellColorResolver","_core","_renderLayers","LinkRenderLayer","screenElement","linkifier2","createRenderDimensions","_devicePixelRatio","_updateDimensions","_updateCursorBlink","onOptionChange","_handleOptionsChanged","_canvas","document","createElement","contextAttributes","antialias","depth","getContext","Error","addDisposableDomListener","console","log","preventDefault","_contextRestorationTimeout","setTimeout","warn","fire","clearTimeout","removeTerminalFromCache","_initializeWebGLState","_requestRedrawViewport","observeDevicePixelDimensions","window","w","h","_setCanvasDevicePixelDimensions","appendChild","value","_isAttached","body","contains","l","dispose","parentElement","removeChild","textureAtlas","_charAtlas","_refreshCharAtlas","_clearModel","handleDevicePixelRatioChange","css","handleCharSizeChanged","handleBlur","pause","handleFocus","resume","handleSelectionChanged","start","end","columnSelectMode","update","handleCursorMove","restartBlinkAnimation","acquireTextureAtlas","rawOptions","getDisposeArrayDisposable","forwardEvent","warmUp","clearGlyphRenderer","clearTextureAtlas","clearTexture","reset","registerCharacterJoiner","handler","deregisterCharacterJoiner","joinerId","renderRows","handleGridChanged","_updateModel","isCursorVisible","options","cursorBlink","CursorBlinkStateManager","_requestRedrawCursor","row","line","joinedRanges","isJoined","lastCharX","range","j","clamp","cursorY","buffer","active","baseY","cursorX","lastCursorX","isCursorInitialized","isCursorHidden","modelUpdated","ydisp","lines","get","getJoinedCharacters","result","loadCell","shift","JoinedCellData","translateToString","getChars","getCode","resolve","getWidth","isFocused","cursorStyle","cursorInactiveStyle","cursorAccent","NULL_CELL_CHAR","ceil","lineHeight","round","letterSpacing","AttributeData","firstCell","content","combinedData","_width","isCombined","setFromCharData","getAsCharData","max","createShader","type","source","shader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","error","getShaderInfoLog","deleteShader","vertexSource","fragmentSource","program","attachShader","VERTEX_SHADER","FRAGMENT_SHADER","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","newLength","newArray","BaseRenderLayer","_container","id","zIndex","_alpha","_deviceCharWidth","_deviceCharHeight","_deviceCellWidth","_deviceCellHeight","_deviceCharLeft","_deviceCharTop","classList","add","toString","_initCanvas","remove","_ctx","alpha","_clearAll","startRow","endRow","_setTransparency","oldCanvas","cloneNode","replaceChild","colorSet","dim","_fillBottomLineAtCells","fillRect","clearRect","fillStyle","_clearCells","_fillCharTrueColor","font","_getFont","textBaseline","TEXT_BASELINE","_clipCell","fillText","beginPath","rect","clip","isBold","isItalic","fontWeightBold","fontWeight","fontSize","fontFamily","container","coreBrowserService","optionsService","themeService","onShowLinkUnderline","_handleShowLinkUnderline","onHideLinkUnderline","_handleHideLinkUnderline","_state","_clearCurrentLink","middleRowCount","y2","x2","INVERTED_DEFAULT_COLOR","is256Color","node","addEventListener","disposed","removeEventListener","$colors","$fg","$bg","$hasFg","$hasBg","$isSelected","_selectionRenderModel","extended","forEachDecorationAtCell","d","backgroundColorRGB","foregroundColorRGB","isCellSelected","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","selectionForeground","charAtlasCache","deviceCellWidth","deviceCellHeight","deviceCharWidth","deviceCharHeight","devicePixelRatio","newConfig","generateConfig","entry","ownedByIndex","ownedBy","indexOf","configEquals","config","splice","push","core","newEntry","unicodeService","index","clonedColors","NULL_COLOR","selectionBackgroundTransparent","selectionInactiveBackgroundTransparent","slice","contrastCache","halfContrastCache","customGlyphs","allowTransparency","drawBoldTextInBrightColors","minimumContrastRatio","colorCode","DIM_OPACITY","isFirefox","isLegacyEdge","_renderCallback","_restartInterval","isPaused","_blinkStartTimeout","_blinkInterval","clearInterval","_animationFrame","cancelAnimationFrame","_animationTimeRestarted","Date","now","requestAnimationFrame","timeToStart","BLINK_INTERVAL","time","setInterval","blockElementDefinitions","patternCharacterDefinitions","boxDrawingDefinitions","xp","yp","powerlineDefinitions","rightPadding","leftPadding","ctx","c","xOffset","yOffset","blockElementDefinition","charDefinition","box","xEighth","yEighth","drawBlockElementChar","patternDefinition","patternSet","cachedPatterns","Map","pattern","tmpCanvas","tmpCtx","imageData","ImageData","startsWith","parseInt","substring","split","map","parseFloat","data","putImageData","createPattern","drawPatternChar","boxDrawingDefinition","strokeStyle","instructions","Object","entries","actualInstructions","lineWidth","Number","instruction","f","svgToCanvasInstructionMap","args","translateArgs","stroke","closePath","drawBoxDrawingChar","powerlineDefinition","clipRegion","Path2D","cssLineWidth","drawPowerlineChar","bezierCurveTo","lineTo","moveTo","cellWidth","cellHeight","doClamp","element","parentWindow","callback","observer","ResizeObserver","find","target","disconnect","devicePixelContentBoxSize","inlineSize","blockSize","observe","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","SelectionRenderModel","hasSelection","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startCol","endCol","selectionStart","selectionEnd","viewportY","NULL_RASTERIZED_GLYPH","texturePosition","_pages","_document","_config","_unicodeService","_didWarmUp","_cacheMap","FourKeyMap","_cacheMapCombined","_activePages","_workBoundingBox","bottom","right","_workAttributeData","_textureSize","_requestClearModel","_createNewPage","_tmpCanvas","createCanvas","TMP_CANVAS_GLYPH_PADDING","_tmpCtx","willReadFrequently","page","_doWarmUp","queue","IdleTaskQueue","enqueue","DEFAULT_COLOR","DEFAULT_EXT","rasterizedGlyph","_drawToCache","currentRow","pagesBySize","filter","sort","percentageUsed","sameSizeI","mergingPages","sortedMergingPagesIndexes","glyphs","mergedPageIndex","mergedPage","_mergePages","_deletePage","newPage","AtlasPage","mergedSize","p","drawImage","pageIndex","adjustingPage","restrictToCellHeight","_getFromCacheMap","cacheMap","key","_getColorFromAnsiIndex","idx","_getBackgroundColor","bgColorMode","bgColor","arr","toColorRGB","toColor","opaque","_getForegroundColor","fgColorMode","fgColor","bold","excludeFromContrastRatioDemands","minimumContrastColor","_getMinimumContrastColor","multiplyOpacity","_resolveBackgroundRgba","_resolveForegroundRgba","cache","_getContrastCache","adjustedColor","getColor","bgRgba","fgRgba","ensureContrastRatio","setColor","codeOrChars","String","fromCharCode","allowedWidth","allowedHeight","save","isInvisible","isInverse","isDim","italic","underline","isUnderline","strikethrough","isStrikethrough","overline","isOverline","getFgColor","getFgColorMode","getBgColor","getBgColorMode","temp","temp2","backgroundColor","globalCompositeOperation","fontStyle","powerlineGlyph","charCodeAt","restrictedPowerlineGlyph","isRestrictedPowerlineGlyph","foregroundColor","padding","customGlyph","tryDrawCustomChar","chWidth","enableClearThresholdCheck","wcwidth","getStringCellWidth","isUnderlineColorDefault","isUnderlineColorRGB","getUnderlineColor","join","xLeft","yTop","yMid","yBot","xChLeft","xChRight","xChMid","underlineStyle","yCurlyBot","yCurlyTop","setLineDash","restore","metrics","measureText","actualBoundingBoxDescent","strokeText","isBeyondCellBounds","clearColor","getImageData","isEmpty","checkCompletelyTransparent","_findGlyphBoundingBox","activePage","activeRow","fixedRows","wasPageAndRowFound","candidatePage","addGlyph","boundingBox","restrictedGlyph","found","alphaOffset","_usedPixels","_glyphs","glyph","sourcePages","enableThresholdCheck","fgR","fgG","fgB","threshold","abs","channels","rgb","toPaddedHex","s","contrastRatio","l1","l2","toCss","toRgba","opacity","toChannels","blend","bgR","bgG","bgB","isOpaque","ratio","rgbaColor","factor","$ctx","$litmusColor","isNode","createLinearGradient","match","repeat","rgbaMatch","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","_listeners","_disposed","_event","listener","arg1","arg2","call","clearListeners","from","to","disposeArray","disposables","_disposables","_isDisposed","unregister","_value","TwoKeyMap","_data","first","second","third","fourth","navigator","userAgent","platform","includes","isSafari","test","majorVersion","isMac","isIpad","isIphone","isWindows","isLinux","isChromeOS","TaskQueue","_tasks","_i","task","_start","flush","_idleCallback","_cancelCallback","_requestCallback","_process","bind","deadline","taskDuration","longestTask","lastDeadlineRemaining","timeRemaining","deadlineRemaining","PriorityTaskQueue","_createDeadline","identifier","duration","requestIdleCallback","cancelIdleCallback","_queue","ExtendedAttrs","fromColorRGB","clone","newObj","hasExtendedAttrs","isBlink","isProtected","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","updateExtended","underlineColor","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","_urlId","_ext","urlId","fromCharData","obj","stringFromCodePoint","CHAR_DATA_ATTR_INDEX","combined","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","DEFAULT_ATTR","CHAR_DATA_CODE_INDEX","NULL_CELL_WIDTH","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","codePoint","_interim","decode","input","startPos","interim","byte1","byte2","byte3","byte4","discardInterim","cp","tmp","pos","missing","fourStop","optionsKeyToLogLevel","trace","LogLevelEnum","TRACE","debug","DEBUG","info","INFO","WARN","ERROR","off","OFF","traceLogger","LogService","logLevel","_logLevel","_updateLogLevel","onSpecificOptionChange","_evalLazyOptionalParams","optionalParams","_log","message","logger","IOptionsService","_target","descriptor","fn","apply","name","JSON","stringify","DI_TARGET","DI_DEPENDENCIES","serviceRegistry","ctor","has","decorator","arguments","storeServiceDependency","IBufferService","createDecorator","ICoreMouseService","ICoreService","ICharsetService","IInstantiationService","ILogService","IOscLinkService","IUnicodeService","IDecorationService","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","WebglAddon","_preserveDrawingBuffer","getSafariVersion","activate","onWillOpen","coreService","unsafeCore","renderService","_renderService","characterJoinerService","charSizeService","decorationService","logService","_logService","setTraceLogger","_renderer","setRenderer","_createRenderer"],"sourceRoot":""}
\ No newline at end of file
diff --git a/xterm.js/src/xterm.css b/xterm.js/src/xterm.css
new file mode 100644 (file)
index 0000000..74acc26
--- /dev/null
@@ -0,0 +1,209 @@
+/**
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
+ * https://github.com/chjj/term.js
+ * @license MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * Originally forked from (with the author's permission):
+ *   Fabrice Bellard's javascript vt100 for jslinux:
+ *   http://bellard.org/jslinux/
+ *   Copyright (c) 2011 Fabrice Bellard
+ *   The original design remains. The terminal itself
+ *   has been extended to include xterm CSI codes, among
+ *   other features.
+ */
+
+/**
+ *  Default styles for xterm.js
+ */
+
+.xterm {
+    cursor: text;
+    position: relative;
+    user-select: none;
+    -ms-user-select: none;
+    -webkit-user-select: none;
+}
+
+.xterm.focus,
+.xterm:focus {
+    outline: none;
+}
+
+.xterm .xterm-helpers {
+    position: absolute;
+    top: 0;
+    /**
+     * The z-index of the helpers must be higher than the canvases in order for
+     * IMEs to appear on top.
+     */
+    z-index: 5;
+}
+
+.xterm .xterm-helper-textarea {
+    padding: 0;
+    border: 0;
+    margin: 0;
+    /* Move textarea out of the screen to the far left, so that the cursor is not visible */
+    position: absolute;
+    opacity: 0;
+    left: -9999em;
+    top: 0;
+    width: 0;
+    height: 0;
+    z-index: -5;
+    /** Prevent wrapping so the IME appears against the textarea at the correct position */
+    white-space: nowrap;
+    overflow: hidden;
+    resize: none;
+}
+
+.xterm .composition-view {
+    /* TODO: Composition position got messed up somewhere */
+    background: #000;
+    color: #FFF;
+    display: none;
+    position: absolute;
+    white-space: nowrap;
+    z-index: 1;
+}
+
+.xterm .composition-view.active {
+    display: block;
+}
+
+.xterm .xterm-viewport {
+    /* On OS X this is required in order for the scroll bar to appear fully opaque */
+    background-color: #000;
+    overflow-y: scroll;
+    cursor: default;
+    position: absolute;
+    right: 0;
+    left: 0;
+    top: 0;
+    bottom: 0;
+}
+
+.xterm .xterm-screen {
+    position: relative;
+}
+
+.xterm .xterm-screen canvas {
+    position: absolute;
+    left: 0;
+    top: 0;
+}
+
+.xterm .xterm-scroll-area {
+    visibility: hidden;
+}
+
+.xterm-char-measure-element {
+    display: inline-block;
+    visibility: hidden;
+    position: absolute;
+    top: 0;
+    left: -9999em;
+    line-height: normal;
+}
+
+.xterm.enable-mouse-events {
+    /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */
+    cursor: default;
+}
+
+.xterm.xterm-cursor-pointer,
+.xterm .xterm-cursor-pointer {
+    cursor: pointer;
+}
+
+.xterm.column-select.focus {
+    /* Column selection mode */
+    cursor: crosshair;
+}
+
+.xterm .xterm-accessibility,
+.xterm .xterm-message {
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 10;
+    color: transparent;
+    pointer-events: none;
+}
+
+.xterm .live-region {
+    position: absolute;
+    left: -9999px;
+    width: 1px;
+    height: 1px;
+    overflow: hidden;
+}
+
+.xterm-dim {
+    /* Dim should not apply to background, so the opacity of the foreground color is applied
+     * explicitly in the generated class and reset to 1 here */
+    opacity: 1 !important;
+}
+
+.xterm-underline-1 { text-decoration: underline; }
+.xterm-underline-2 { text-decoration: double underline; }
+.xterm-underline-3 { text-decoration: wavy underline; }
+.xterm-underline-4 { text-decoration: dotted underline; }
+.xterm-underline-5 { text-decoration: dashed underline; }
+
+.xterm-overline {
+    text-decoration: overline;
+}
+
+.xterm-overline.xterm-underline-1 { text-decoration: overline underline; }
+.xterm-overline.xterm-underline-2 { text-decoration: overline double underline; }
+.xterm-overline.xterm-underline-3 { text-decoration: overline wavy underline; }
+.xterm-overline.xterm-underline-4 { text-decoration: overline dotted underline; }
+.xterm-overline.xterm-underline-5 { text-decoration: overline dashed underline; }
+
+.xterm-strikethrough {
+    text-decoration: line-through;
+}
+
+.xterm-screen .xterm-decoration-container .xterm-decoration {
+       z-index: 6;
+       position: absolute;
+}
+
+.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer {
+       z-index: 7;
+}
+
+.xterm-decoration-overview-ruler {
+    z-index: 8;
+    position: absolute;
+    top: 0;
+    right: 0;
+    pointer-events: none;
+}
+
+.xterm-decoration-top {
+    z-index: 2;
+    position: relative;
+}
diff --git a/xterm.js/src/xterm.js b/xterm.js/src/xterm.js
new file mode 100644 (file)
index 0000000..a68eae6
--- /dev/null
@@ -0,0 +1,2 @@
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(self,(()=>(()=>{"use strict";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(6114),a=i(9924),h=i(844),c=i(5596),l=i(4725),d=i(3656);let _=t.AccessibilityManager=class extends h.Disposable{constructor(e,t){super(),this._terminal=e,this._renderService=t,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=document.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=document.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);if(this._topBoundaryFocusListener=e=>this._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=document.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new a.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar("\n")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this._screenDprMonitor=new c.ScreenDprMonitor(window),this.register(this._screenDprMonitor),this._screenDprMonitor.setListener((()=>this._refreshRowsDimensions())),this.register((0,d.addDisposableDomListener)(window,"resize",(()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,h.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t<e;t++)this._handleChar(" ")}_handleChar(e){this._liveRegionLineCount<21&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)),o.isMac&&this._liveRegion.textContent&&this._liveRegion.textContent.length>0&&!this._liveRegion.parentNode&&setTimeout((()=>{this._accessibilityContainer.appendChild(this._liveRegion)}),0))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0,o.isMac&&this._liveRegion.remove()}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.translateBufferLineToString(i.ydisp+r,!0),t=(i.ydisp+r+1).toString(),n=this._rowElements[r];n&&(0===e.length?n.innerText=" ":n.textContent=e,n.setAttribute("aria-posinset",t),n.setAttribute("aria-setsize",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute("aria-posinset")===(0===t?"1":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),n.removeEventListener("focus",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement("afterbegin",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=document.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e])}}_refreshRowDimensions(e){e.style.height=`${this._renderService.dimensions.css.cell.height}px`}};t.AccessibilityManager=_=s([r(1,l.IRenderService)],_)},3614:(e,t)=>{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"\e[200~"+e+"\e[201~":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=""}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}Object.defineProperty(t,"__esModule",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData("text/plain"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},6465:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier2=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585);let c=t.Linkifier2=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e){super(),this._bufferService=e,this._linkProviders=[],this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0})))}registerLinkProvider(e){return this._linkProviders.push(e),{dispose:()=>{const t=this._linkProviders.indexOf(e);-1!==t&&this._linkProviders.splice(t,1)}}}attachToDom(e,t,i){this._element=e,this._mouseService=t,this._renderService=i,this.register((0,n.addDisposableDomListener)(this._element,"mouseleave",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){if(this._lastMouseEvent=e,!this._element||!this._mouseService)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e<i.length;e++){const t=i[e];if(t.classList.contains("xterm"))break;if(t.classList.contains("xterm-hover"))return}this._lastBufferCell&&t.x===this._lastBufferCell.x&&t.y===this._lastBufferCell.y||(this._handleHover(t),this._lastBufferCell=t)}_handleHover(e){if(this._activeLine!==e.y||this._wasResized)return this._clearCurrentLink(),this._askForLink(e,!1),void(this._wasResized=!1);this._currentLink&&this._linkAtPosition(this._currentLink.link,e)||(this._clearCurrentLink(),this._askForLink(e,!0))}_askForLink(e,t){var i,s;this._activeProviderReplies&&t||(null===(i=this._activeProviderReplies)||void 0===i||i.forEach((e=>{null==e||e.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let r=!1;for(const[i,n]of this._linkProviders.entries())t?(null===(s=this._activeProviderReplies)||void 0===s?void 0:s.get(i))&&(r=this._checkLinkProviderResult(i,e,r)):n.provideLinks(e.y,(t=>{var s,n;if(this._isMouseOut)return;const o=null==t?void 0:t.map((e=>({link:e})));null===(s=this._activeProviderReplies)||void 0===s||s.set(i,o),r=this._checkLinkProviderResult(i,e,r),(null===(n=this._activeProviderReplies)||void 0===n?void 0:n.size)===this._linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;s<t.size;s++){const r=t.get(s);if(r)for(let t=0;t<r.length;t++){const s=r[t],n=s.link.range.start.y<e?0:s.link.range.start.x,o=s.link.range.end.y>e?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){var s;if(!this._activeProviderReplies)return i;const r=this._activeProviderReplies.get(e);let n=!1;for(let t=0;t<e;t++)this._activeProviderReplies.has(t)&&!this._activeProviderReplies.get(t)||(n=!0);if(!n&&r){const e=r.find((e=>this._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviders.length&&!i)for(let e=0;e<this._activeProviderReplies.size;e++){const r=null===(s=this._activeProviderReplies.get(e))||void 0===s?void 0:s.find((e=>this._linkAtPosition(e.link,t)));if(r){i=!0,this._handleNewLink(r);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._element||!this._mouseService||!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._element&&this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._element||!this._lastMouseEvent||!this._mouseService)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.pointerCursor},set:e=>{var t,i;(null===(t=this._currentLink)||void 0===t?void 0:t.state)&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&(null===(i=this._element)||void 0===i||i.classList.toggle("xterm-cursor-pointer",e)))}},underline:{get:()=>{var e,t;return null===(t=null===(e=this._currentLink)||void 0===e?void 0:e.state)||void 0===t?void 0:t.decorations.underline},set:t=>{var i,s,r;(null===(i=this._currentLink)||void 0===i?void 0:i.state)&&(null===(r=null===(s=this._currentLink)||void 0===s?void 0:s.state)||void 0===r?void 0:r.decorations.underline)!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._renderService&&this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent&&this._element)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){var s;(null===(s=this._currentLink)||void 0===s?void 0:s.state)&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier2=c=s([r(0,h.IBufferService)],c)},9042:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel="Terminal input",t.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){var i;const s=this._bufferService.buffer.lines.get(e-1);if(!s)return void t(void 0);const r=[],o=this._optionsService.rawOptions.linkHandler,a=new n.CellData,c=s.getTrimmedLength();let l=-1,d=-1,_=!1;for(let t=0;t<c;t++)if(-1!==d||s.hasContent(t)){if(s.loadCell(t,a),a.hasExtendedAttrs()&&a.extended.urlId){if(-1===d){d=t,l=a.extended.urlId;continue}_=a.extended.urlId!==l}else-1!==d&&(_=!0);if(_||-1!==d&&t===c-1){const s=null===(i=this._oscLinkService.getLinkData(l))||void 0===i?void 0:i.uri;if(s){const i={start:{x:d+1,y:e},end:{x:t+(_||t!==c-1?0:1),y:e}};let n=!1;if(!(null==o?void 0:o.allowNonHttpProtocols))try{const e=new URL(s);["http:","https:"].includes(e.protocol)||(n=!0)}catch(e){n=!0}n||r.push({text:s,range:i,activate:(e,t)=>o?o.activate(e,t,i):h(0,t),hover:(e,t)=>{var s;return null===(s=null==o?void 0:o.hover)||void 0===s?void 0:s.call(o,e,t,i)},leave:(e,t)=>{var s;return null===(s=null==o?void 0:o.leave)||void 0===s?void 0:s.call(o,e,t,i)}})}_=!1,a.hasExtendedAttrs()&&a.extended.urlId?(d=t,l=a.extended.urlId):(d=-1,l=-1)}}t(r)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\n\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch(e){}e.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._parentWindow=e,this._renderCallback=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._parentWindow.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._parentWindow.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},5596:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ScreenDprMonitor=void 0;const s=i(844);class r extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this.register((0,s.toDisposable)((()=>{this.clearListener()})))}setListener(e){this._listener&&this.clearListener(),this._listener=e,this._outerListener=()=>{this._listener&&(this._listener(this._parentWindow.devicePixelRatio,this._currentDevicePixelRatio),this._updateDpr())},this._updateDpr()}_updateDpr(){var e;this._outerListener&&(null===(e=this._resolutionMediaMatchList)||void 0===e||e.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._listener&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._listener=void 0,this._outerListener=void 0)}}t.ScreenDprMonitor=r},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(6465),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),y=i(8969),w=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O="undefined"!=typeof window?window.document:null;class P extends y.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new w.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new w.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new w.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new w.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new w.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new w.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new w.EventEmitter),this._onBlur=this.register(new w.EventEmitter),this._onA11yCharEmitter=this.register(new w.EventEmitter),this._onA11yTabEmitter=this.register(new w.EventEmitter),this._onWillOpen=this.register(new w.EventEmitter),this._setup(),this.linkifier2=this.register(this._instantiationService.createInstance(n.Linkifier2)),this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,w.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,w.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,w.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{var e,t;this._customKeyEventHandler=void 0,null===(t=null===(e=this.element)||void 0===e?void 0:e.parentNode)||void 0===t||t.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i="";switch(t.index){case 256:e="foreground",i="10";break;case 257:e="background",i="11";break;case 258:e="cursor",i="12";break;default:e="ansi",i="4;"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if("ansi"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.rgba.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.rgba.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[I"),this.updateCursorStyle(e),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){var e;return null===(e=this.textarea)||void 0===e?void 0:e.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+"px",this.textarea.style.top=o+"px",this.textarea.style.width=n+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,"copy",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,"paste",e)),this.register((0,r.addDisposableDomListener)(this.element,"paste",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,"contextmenu",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,"auxclick",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,"keyup",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keydown",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keypress",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionstart",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionupdate",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionend",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,"input",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){var t;if(!e)throw new Error("Terminal requires a parent element.");e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this._document=e.ownerDocument,this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),e.appendChild(this.element);const i=O.createDocumentFragment();this._viewportElement=O.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),i.appendChild(this._viewportElement),this._viewportScrollArea=O.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=O.createElement("div"),this.screenElement.classList.add("xterm-screen"),this._helperContainer=O.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),i.appendChild(this.screenElement),this.textarea=O.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",o.promptLabel),k.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,null!==(t=this._document.defaultView)&&void 0!==t?t:window),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,"focus",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"blur",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=O.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this.element.appendChild(i);try{this._onWillOpen.fire(this.element)}catch(e){}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier2)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,"scroll",(()=>this._selectionService.refresh()))),this.linkifier2.attachToDom(this.screenElement,this._mouseService,this._renderService),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this.element,this.screenElement,this._viewportElement,this.linkifier2)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case"mousemove":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case"mouseup":r=0,s=t.button<3?t.button:3;break;case"mousedown":r=1,s=t.button<3?t.button:3;break;case"wheel":if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.removeEventListener("mousemove",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?("debug"===this.optionsService.rawOptions.logLevel&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(e)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener("mousemove",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener("mousemove",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener("wheel",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener("wheel",s.wheel),s.wheel=null),2&e?s.mouseup||(t.addEventListener("mouseup",n.mouseup),s.mouseup=n.mouseup):(this._document.removeEventListener("mouseup",s.mouseup),t.removeEventListener("mouseup",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener("mousemove",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,"mousedown",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.addEventListener("mousemove",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,"wheel",(e=>{if(!s.wheel){if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");let s="";for(let e=0;e<Math.abs(t);e++)s+=i;return this.coreService.triggerDataEvent(s,!0),this.cancel(e,!0)}return this.viewport.handleWheel(e)?this.cancel(e):void 0}}),{passive:!1})),this.register((0,r.addDisposableDomListener)(t,"touchstart",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,"touchmove",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){var i;null===(i=this._renderService)||void 0===i||i.refreshRows(e,t)}updateCursorStyle(e){var t;(null===(t=this._selectionService)||void 0===t?void 0:t.shouldColumnSelect(e))?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){var s;1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):null===(s=this.viewport)||void 0===s||s.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}registerLinkProvider(e){return this.linkifier2.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){var e;null===(e=this._selectionService)||void 0===e||e.clearSelection()}selectAll(){var e;null===(e=this._selectionService)||void 0===e||e.selectAll()}selectLines(e,t){var i;null===(i=this._selectionService)||void 0===i||i.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=""),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState("AltGraph");return"keypress"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){var i,s;null===(i=this._charSizeService)||void 0===i||i.measure(),null===(s=this.viewport)||void 0===s||s.syncScrollArea(!0)}clear(){var e;if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e<this.rows;e++)this.buffer.lines.push(this.buffer.getBlankLine(L.DEFAULT_ATTR_DATA));this._onScroll.fire({position:this.buffer.ydisp,source:0}),null===(e=this.viewport)||void 0===e||e.reset(),this.refresh(0,this.rows-1)}}reset(){var e,t;this.options.rows=this.rows,this.options.cols=this.cols;const i=this._customKeyEventHandler;this._setup(),super.reset(),null===(e=this._selectionService)||void 0===e||e.reset(),this._decorationService.reset(),null===(t=this.viewport)||void 0===t||t.reset(),this._customKeyEventHandler=i,this.refresh(0,this.rows-1)}clearTextureAtlas(){var e;null===(e=this._renderService)||void 0===e||e.clearTextureAtlas()}_reportFocus(){var e;(null===(e=this.element)||void 0===e?void 0:e.classList.contains("focus"))?this.coreService.triggerDataEvent(D.C0.ESC+"[I"):this.coreService.triggerDataEvent(D.C0.ESC+"[O")}_reportWindowsOptions(e){if(this._renderService)switch(e){case T.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:const e=this._renderService.dimensions.css.canvas.width.toFixed(0),t=this._renderService.dimensions.css.canvas.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[4;${t};${e}t`);break;case T.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:const i=this._renderService.dimensions.css.cell.width.toFixed(0),s=this._renderService.dimensions.css.cell.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[6;${s};${i}t`)}}cancel(e,t){if(this.options.cancelEvents||t)return e.preventDefault(),e.stopPropagation(),!1}}t.Terminal=P},9924:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderService.dimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderService.dimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderService.dimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i<this._lastRecordedBufferHeight)||(e.cancelable&&e.preventDefault(),!1)}handleWheel(e){const t=this._getPixelsScrolled(e);return 0!==t&&(this._optionsService.rawOptions.smoothScrollDuration?(this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,-1===this._smoothScrollState.target?this._smoothScrollState.target=this._viewportElement.scrollTop+t:this._smoothScrollState.target+=t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()):this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}scrollLines(e){if(0!==e)if(this._optionsService.rawOptions.smoothScrollDuration){const t=e*this._currentRowHeight;this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,this._smoothScrollState.target=this._smoothScrollState.origin+t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()}else this._onRequestScrollLines.fire({amount:e,suppressScrollEvent:!1})}_getPixelsScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_LINE?t*=this._currentRowHeight:e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._currentRowHeight*this._bufferService.rows),t}getBufferElements(e,t){var i;let s,r="";const n=[],o=null!=t?t:this._bufferService.buffer.lines.length,a=this._bufferService.buffer.lines;for(let t=e;t<o;t++){const e=a.get(t);if(!e)continue;const o=null===(i=a.get(t+1))||void 0===i?void 0:i.isWrapped;if(r+=e.translateToString(!o),!o||t===a.length-1){const e=document.createElement("div");e.textContent=r,n.push(e),r.length>0&&(s=e),r=""}}return{bufferElements:n,cursorElement:s}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return"alt"===i&&t.altKey||"ctrl"===i&&t.ctrlKey||"shift"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(3656),o=i(4725),a=i(844),h=i(2585);let c=t.BufferDecorationRenderer=class extends a.Disposable{constructor(e,t,i,s){super(),this._screenElement=e,this._bufferService=t,this._decorationService=i,this._renderService=s,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register((0,n.addDisposableDomListener)(window,"resize",(()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,a.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){var t,i;const s=document.createElement("div");s.classList.add("xterm-decoration"),s.classList.toggle("xterm-decoration-top-layer","top"===(null===(t=null==e?void 0:e.options)||void 0===t?void 0:t.layer)),s.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,s.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",s.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",s.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const r=null!==(i=e.options.x)&&void 0!==i?i:0;return r&&r>this._bufferService.cols&&(s.style.display="none"),this._refreshXPosition(e,s),s}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.display=this._altBufferIsActive?"none":"block",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){var i;if(!t)return;const s=null!==(i=e.options.x)&&void 0!==i?i:0;"right"===(e.options.anchor||"left")?t.style.right=s?s*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=s?s*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){var t;null===(t=this._decorationElements.get(e))||void 0===t||t.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=c=s([r(1,h.IBufferService),r(2,h.IDecorationService),r(3,o.IRenderService)],c)},5871:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex<this._zonePool.length)return this._zonePool[this._zonePoolIndex].color=e.options.overviewRulerOptions.color,this._zonePool[this._zonePoolIndex].position=e.options.overviewRulerOptions.position,this._zonePool[this._zonePoolIndex].startBufferLine=e.marker.line,this._zonePool[this._zonePoolIndex].endBufferLine=e.marker.line,void this._zones.push(this._zonePool[this._zonePoolIndex++]);this._zones.push({color:e.options.overviewRulerOptions.color,position:e.options.overviewRulerOptions.position,startBufferLine:e.marker.line,endBufferLine:e.marker.line}),this._zonePool.push(this._zones[this._zones.length-1]),this._zonePoolIndex++}}setPadding(e){this._linePadding=e}_lineIntersectsZone(e,t){return t>=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||"full"]&&t<=e.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(3656),a=i(4725),h=i(844),c=i(2585),l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0},_={full:0,left:0,center:0,right:0};let u=t.OverviewRulerRenderer=class extends h.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,a){var c;super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowseService=a,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=document.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),null===(c=this._viewportElement.parentElement)||void 0===c||c.insertBefore(this._canvas,this._viewportElement);const l=this._canvas.getContext("2d");if(!l)throw new Error("Ctx cannot be null");this._ctx=l,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,h.toDisposable)((()=>{var e;null===(e=this._canvas)||void 0===e||e.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",(()=>this._queueRefresh(!0)))),this.register((0,o.addDisposableDomListener)(this._coreBrowseService.window,"resize",(()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);d.full=this._canvas.width,d.left=e,d.center=t,d.right=e,this._refreshDrawHeightConstants(),_.full=0,_.left=0,_.center=d.left,_.right=d.left+d.center}_refreshDrawHeightConstants(){l.full=Math.round(2*this._coreBrowseService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowseService.dpr);l.left=t,l.center=t,l.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*l.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowseService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowseService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)"full"!==t.position&&this._renderColorZone(t);for(const t of e)"full"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(_[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-l[e.position||"full"]/2),d[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+l[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowseService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=u=s([r(2,c.IBufferService),r(3,c.IDecorationService),r(4,a.IRenderService),r(5,c.IOptionsService),r(6,a.ICoreBrowserService)],u)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.length<e.length?this._coreService.triggerDataEvent(`${a.C0.DEL}`,!0):t.length===e.length&&t!==e&&this._coreService.triggerDataEvent(t,!0)}}),0)}updateCompositionElements(e){if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){const e=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),t=this._renderService.dimensions.css.cell.height,i=this._bufferService.buffer.y*this._renderService.dimensions.css.cell.height,s=e*this._renderService.dimensions.css.cell.width;this._compositionView.style.left=s+"px",this._compositionView.style.top=i+"px",this._compositionView.style.height=t+"px",this._compositionView.style.lineHeight=t+"px",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+"px";const r=this._compositionView.getBoundingClientRect();this._textarea.style.left=s+"px",this._textarea.style.top=i+"px",this._textarea.style.width=Math.max(r.width,1)+"px",this._textarea.style.height=Math.max(r.height,1)+"px",this._textarea.style.lineHeight=r.height+"px"}e||setTimeout((()=>this.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue("padding-left")),o=parseInt(r.getPropertyValue("padding-top"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n<Math.abs(r-a);n++){const a="A"===o(e,t)?-1:1,h=i.buffer.lines.get(r+a*n);(null==h?void 0:h.isWrapped)&&s++}return s}(e,t,i);return c(l,h(o(e,t),s))}function n(e,t){let i=0,s=t.buffer.lines.get(e),r=null==s?void 0:s.isWrapped;for(;r&&e>=0&&e<t.rows;)i++,s=t.buffer.lines.get(--e),r=null==s?void 0:s.isWrapped;return i}function o(e,t){return e>t?"A":"B"}function a(e,t,i,s,r,n){let o=e,a=t,h="";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?"O":"[";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i="";for(let s=0;s<e;s++)i+=t;return i}t.moveToCellSequence=function(e,t,i,s){const o=i.buffer.x,l=i.buffer.y;if(!i.buffer.hasScrollback)return function(e,t,i,s,o,l){return 0===r(t,s,o,l).length?"":c(a(e,t,e,t-n(t,o),!1,o).length,h("D",l))}(o,l,0,t,i,s)+r(l,t,i,s)+function(e,t,i,s,o,l){let d;d=r(t,s,o,l).length>0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e<i&&h<=s||e>=i&&h<s?"C":"D"}(e,t,i,s,o,l);return c(a(e,d,i,_,"C"===u,o).length,h(u,l))}(o,l,e,t,i,s);let d;if(l===t)return d=o>e?"D":"C",c(Math.abs(o-e),h(d,s));d=l>t?"D":"C";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(4725),l=i(8055),d=i(8460),_=i(844),u=i(2585),f="xterm-dom-renderer-owner-",v="xterm-rows",p="xterm-fg-",g="xterm-bg-",m="xterm-focus",S="xterm-selection";let C=1,b=t.DomRenderer=class extends _.Disposable{constructor(e,t,i,s,r,a,c,l,u,p){super(),this._element=e,this._screenElement=t,this._viewportElement=i,this._linkifier2=s,this._charSizeService=a,this._optionsService=c,this._bufferService=l,this._coreBrowserService=u,this._themeService=p,this._terminalClass=C++,this._rowElements=[],this.onRequestRedraw=this.register(new d.EventEmitter).event,this._rowContainer=document.createElement("div"),this._rowContainer.classList.add(v),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=document.createElement("div"),this._selectionContainer.classList.add(S),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=r.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(f+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,_.toDisposable)((()=>{this._element.classList.remove(f+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(document),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${v} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${v} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${v} .xterm-dim { color: ${l.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`,t+="@keyframes blink_box_shadow_"+this._terminalClass+" { 50% {  border-bottom-style: hidden; }}",t+="@keyframes blink_block_"+this._terminalClass+" { 0% {"+`  background-color: ${e.cursor.css};`+`  color: ${e.cursorAccent.css}; } 50% {  background-color: inherit;`+`  color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink:not(.xterm-cursor-block) { animation: blink_box_shadow_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v}.${m} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: blink_block_`+this._terminalClass+" 1s step-end infinite;}"+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-block {`+` background-color: ${e.cursor.css};`+` color: ${e.cursorAccent.css};}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-outline {`+` outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-bar {`+` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}`+`${this._terminalSelector} .${v} .xterm-cursor.xterm-cursor-underline {`+` border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${S} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${S} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${S} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${p}${i} { color: ${s.css}; }${this._terminalSelector} .${p}${i}.xterm-dim { color: ${l.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${g}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR} { color: ${l.color.opaque(e.background).css}; }${this._terminalSelector} .${p}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${l.color.multiplyOpacity(l.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=document.createElement("div");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions()}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(m)}handleFocus(){this._rowContainer.classList.add(m),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;const s=e[1]-this._bufferService.buffer.ydisp,r=t[1]-this._bufferService.buffer.ydisp,n=Math.max(s,0),o=Math.min(r,this._bufferService.rows-1);if(n>=this._bufferService.rows||o<0)return;const a=document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=document.createElement("div");return r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=t*this.dimensions.css.cell.width+"px",r.style.width=this.dimensions.css.cell.width*(i-t)+"px",r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${f}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=b=s([r(4,u.IInstantiationService),r(5,c.ICharSizeService),r(6,u.IOptionsService),r(7,u.IBufferService),r(8,c.ICoreBrowserService),r(9,c.IThemeService)],b)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b<a+1&&(b=a+1);let y=0,w="",E=0,k=0,L=0,D=!1,R=0,x=!1,A=0;const B=[],T=-1!==f&&-1!==p;for(let M=0;M<b;M++){e.loadCell(M,this._workCell);let b=this._workCell.getWidth();if(0===b)continue;let O=!1,P=M,I=this._workCell;if(m.length>0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(" "===N&&(I.isUnderline()||I.isOverline())&&(N=" "),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(y&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){w+=N,y++;continue}y&&(C.textContent=w),C=this._document.createElement("span"),y=0,w=""}else C=this._document.createElement("span");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F)if(B.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&B.push("xterm-cursor-blink"),B.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":B.push("xterm-cursor-outline");break;case"block":B.push("xterm-cursor-block");break;case"bar":B.push("xterm-cursor-bar");break;case"underline":B.push("xterm-cursor-underline")}if(I.isBold()&&B.push("xterm-bold"),I.isItalic()&&B.push("xterm-italic"),I.isDim()&&B.push("xterm-dim"),w=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===w&&(w=" "),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push("xterm-overline")," "===w&&(w=" ")),I.isStrikethrough()&&B.push("xterm-strikethrough"),W&&(C.style.textDecoration="underline");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{"top"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J="top"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push("xterm-decoration-top"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.rgba.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),"0",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.rgba.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,void 0)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=w:y++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&y&&(C.textContent=w),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.excludeFromContrastRatioDemands)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,null!=a?a:null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute("style",`${e.getAttribute("style")||""}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e<s[0]&&t<=s[1]:e<i[0]&&t>=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t<s[1]||i[1]===s[1]&&t===i[1]&&e>=i[0]&&e<s[0]||i[1]<s[1]&&t===s[1]&&e<s[0]||i[1]<s[1]&&t===i[1]&&e>=i[0])}};function v(e,t,i){for(;e.length<i;)e=t+e;return e}t.DomRendererRowFactory=f=s([r(1,l.ICharacterJoinerService),r(2,h.IOptionsService),r(3,l.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,l.IThemeService)],f)},2550:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=e.createElement("div"),this._container.style.position="absolute",this._container.style.top="-50000px",this._container.style.width="50000px",this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const t=e.createElement("span"),i=e.createElement("span");i.style.fontWeight="bold";const s=e.createElement("span");s.style.fontStyle="italic";const r=e.createElement("span");r.style.fontWeight="bold",r.style.fontStyle="italic",this._measureElements=[t,i,s,r],this._container.appendChild(t),this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),e.body.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256)return-9999!==this._flat[s]?this._flat[s]:this._flat[s]=this._measure(e,0);let r=e;t&&(r+="B"),i&&(r+="I");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}Object.defineProperty(t,"__esModule",{value:!0}),t.createRenderDimensions=t.excludeFromContrastRatioDemands=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.excludeFromContrastRatioDemands=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}}},456:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event,this._measureStrategy=new c(e,t,this._optionsService),this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c{constructor(e,t,i){this._document=e,this._parentElement=t,this._optionsService=i,this._result={width:0,height:0},this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`;const e={height:Number(this._measureElement.offsetHeight),width:Number(this._measureElement.offsetWidth)};return 0!==e.width&&0!==e.height&&(this._result.width=e.width/32,this._result.height=Math.ceil(e.height)),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t<this._characterJoiners.length;t++)if(this._characterJoiners[t].id===e)return this._characterJoiners.splice(t,1),!0;return!1}getJoinedCharacters(e){if(0===this._characterJoiners.length)return[];const t=this._bufferService.buffer.lines.get(e);if(!t||0===t.length)return[];const i=[],s=t.translateToString(!0);let r=0,n=0,a=0,h=t.getFg(0),c=t.getBg(0);for(let e=0;e<t.getTrimmedLength();e++)if(t.loadCell(e,this._workCell),0!==this._workCell.getWidth()){if(this._workCell.fg!==h||this._workCell.bg!==c){if(e-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}r=e,a=n,h=this._workCell.fg,c=this._workCell.bg}n+=this._workCell.getChars().length||o.WHITESPACE_CELL_CHAR.length}if(this._bufferService.cols-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}return i}_getJoinedRanges(t,i,s,r,n){const o=t.substring(i,s);let a=[];try{a=this._characterJoiners[0].handler(o)}catch(e){console.error(e)}for(let t=1;t<this._characterJoiners.length;t++)try{const i=this._characterJoiners[t].handler(o);for(let t=0;t<i.length;t++)e._mergeRanges(a,i[t])}catch(e){console.error(e)}return this._stringRangesToCellRanges(a,r,n),a}_stringRangesToCellRanges(e,t,i){let s=0,r=!1,n=0,a=e[s];if(a){for(let h=i;h<this._bufferService.cols;h++){const i=t.getWidth(h),c=t.getString(h).length||o.WHITESPACE_CELL_CHAR.length;if(0!==i){if(!r&&a[0]<=n&&(a[0]=h,r=!0),a[1]<=n){if(a[1]=h,a=e[++s],!a)break;a[0]<=n?(a[0]=h,r=!0):r=!1}n+=c}}a&&(a[1]=this._bufferService.cols)}}static _mergeRanges(e,t){let i=!1;for(let s=0;s<e.length;s++){const r=e[s];if(i){if(t[1]<=r[0])return e[s-1][1]=t[1],e;if(t[1]<=r[1])return e[s-1][1]=Math.max(t[1],r[1]),e.splice(s,1),e;e.splice(s,1),s--}else{if(t[1]<=r[0])return e.splice(s,0,t),e;if(t[1]<=r[1])return r[0]=Math.min(t[0],r[0]),e;t[0]<r[1]&&(r[0]=Math.min(t[0],r[0]),i=!0)}}return i?e[e.length-1][1]=t[1]:e.push(t),e}};t.CharacterJoinerService=l=s([r(0,h.IBufferService)],l)},5114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0,t.CoreBrowserService=class{constructor(e,t){this._textarea=e,this.window=t,this._isFocused=!1,this._cachedIsFocused=void 0,this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const n=i(3656),o=i(6193),a=i(5596),h=i(4725),c=i(8460),l=i(844),d=i(7226),_=i(2585);let u=t.RenderService=class extends l.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,h,_,u){if(super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new l.MutableDisposable),this._pausedResizeTask=new d.DebouncedIdleTask,this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new c.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new c.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new c.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new c.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new o.RenderDebouncer(_.window,((e,t)=>this._renderRows(e,t))),this.register(this._renderDebouncer),this._screenDprMonitor=new a.ScreenDprMonitor(_.window),this._screenDprMonitor.setListener((()=>this.handleDevicePixelRatioChange())),this.register(this._screenDprMonitor),this.register(h.onResize((()=>this._fullRefresh()))),this.register(h.buffers.onBufferActivate((()=>{var e;return null===(e=this._renderer.value)||void 0===e?void 0:e.clear()}))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio"],(()=>{this.clear(),this.handleResize(h.cols,h.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(h.buffer.y,h.buffer.y,!0)))),this.register((0,n.addDisposableDomListener)(_.window,"resize",(()=>this.handleDevicePixelRatioChange()))),this.register(u.onChangeColors((()=>this._fullRefresh()))),"IntersectionObserver"in _.window){const e=new _.window.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});e.observe(t),this.register({dispose:()=>e.disconnect()})}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh()}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){var e,t;this._renderer.value&&(null===(t=(e=this._renderer.value).clearTextureAtlas)||void 0===t||t.call(e),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCharSizeChanged()}handleBlur(){var e;null===(e=this._renderer.value)||void 0===e||e.handleBlur()}handleFocus(){var e;null===(e=this._renderer.value)||void 0===e||e.handleFocus()}handleSelectionChanged(e,t,i){var s;this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,null===(s=this._renderer.value)||void 0===s||s.handleSelectionChanged(e,t,i)}handleCursorMove(){var e;null===(e=this._renderer.value)||void 0===e||e.handleCursorMove()}clear(){var e;null===(e=this._renderer.value)||void 0===e||e.clear()}};t.RenderService=u=s([r(2,_.IOptionsService),r(3,h.ICharSizeService),r(4,_.IDecorationService),r(5,_.IBufferService),r(6,h.ICoreBrowserService),r(7,h.IThemeService)],u)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,"g");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return"";const r=e[0]<t[0]?e[0]:t[0],n=e[0]<t[0]?t[0]:e[0];for(let o=e[1];o<=t[1];o++){const e=i.translateBufferLineToString(o,!0,r,n);s.push(e)}}else{const r=e[1]===t[1]?t[0]:void 0;s.push(i.translateBufferLineToString(e[1],!0,e[0],r));for(let r=e[1]+1;r<=t[1]-1;r++){const e=i.lines.get(r),t=i.translateBufferLineToString(r,!0);(null==e?void 0:e.isWrapped)?s[s.length-1]+=t:s.push(t)}if(e[1]!==t[1]){const e=i.lines.get(t[1]),r=i.translateBufferLineToString(t[1],!0,0,t[0]);e&&e.isWrapped?s[s.length-1]+=r:s.push(r)}}return s.map((e=>e.replace(p," "))).join(d.isWindows?"\r\n":"\n")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]<i[1]||t[1]===i[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<i[0]||t[1]<i[1]&&e[1]===i[1]&&e[0]<i[0]||t[1]<i[1]&&e[1]===t[1]&&e[0]>=t[0]}_selectWordAtCursor(e,t){var i,s;const r=null===(s=null===(i=this._linkifier.currentLink)||void 0===i?void 0:i.link)||void 0===s?void 0:s.range;if(r)return this._model.selectionStart=[r.start.x-1,r.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(r,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const n=this._getMouseBufferCoords(e);return!!n&&(this._selectWordAt(n,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:1===this._activeSelectionMode&&this._selectToWordAt(this._model.selectionEnd),this._dragScrollAmount=this._getMouseEventScrollAmount(e),3!==this._activeSelectionMode&&(this._dragScrollAmount>0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]<i.lines.length){const e=i.lines.get(this._model.selectionEnd[1]);e&&0===e.hasWidth(this._model.selectionEnd[0])&&this._model.selectionEnd[0]++}t&&t[0]===this._model.selectionEnd[0]&&t[1]===this._model.selectionEnd[1]||this.refresh(!0)}_dragScroll(){if(this._model.selectionEnd&&this._model.selectionStart&&this._dragScrollAmount){this._onRequestScrollLines.fire({amount:this._dragScrollAmount,suppressScrollEvent:!1});const e=this._bufferService.buffer;this._dragScrollAmount>0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(" "===o.charAt(a)){for(;a>0&&" "===o.charAt(a-1);)a--;for(;h<o.length&&" "===o.charAt(h+1);)h++}else{let t=e[0],i=e[0];0===n.getWidth(t)&&(l++,t--),2===n.getWidth(i)&&(d++,i++);const s=n.getString(i).length;for(s>1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i<n.length&&h+1<o.length&&!this._isCharWordSeparator(n.loadCell(i+1,this._workCell));){n.loadCell(i+1,this._workCell);const e=this._workCell.getChars().length;2===this._workCell.getWidth()?(d++,i++):e>1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||""!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if((null==t?void 0:t.isWrapped)&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseService=(0,s.createDecorator)("MouseService"),t.IRenderService=(0,s.createDecorator)("RenderService"),t.ISelectionService=(0,s.createDecorator)("SelectionService"),t.ICharacterJoinerService=(0,s.createDecorator)("CharacterJoinerService"),t.IThemeService=(0,s.createDecorator)("ThemeService")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor("#ffffff"),d=o.css.toColor("#000000"),_=o.css.toColor("#ffffff"),u=o.css.toColor("#000000"),f={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor("#2e3436"),o.css.toColor("#cc0000"),o.css.toColor("#4e9a06"),o.css.toColor("#c4a000"),o.css.toColor("#3465a4"),o.css.toColor("#75507b"),o.css.toColor("#06989a"),o.css.toColor("#d3d7cf"),o.css.toColor("#555753"),o.css.toColor("#ef2929"),o.css.toColor("#8ae234"),o.css.toColor("#fce94f"),o.css.toColor("#729fcf"),o.css.toColor("#ad7fa8"),o.css.toColor("#34e2e2"),o.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r<s;r++)i.ansi[r+16]=p(e.extendedAnsi[r],t.DEFAULT_ANSI_COLORS[r+16])}this._contrastCache.clear(),this._halfContrastCache.clear(),this._updateRestoreColors(),this._onChangeColors.fire(this.colors)}restoreColor(e){this._restoreColor(e),this._onChangeColors.fire(this.colors)}_restoreColor(e){if(void 0!==e)switch(e){case 256:this._colors.foreground=this._restoreColors.foreground;break;case 257:this._colors.background=this._restoreColors.background;break;case 258:this._colors.cursor=this._restoreColors.cursor;break;default:this._colors.ansi[e]=this._restoreColors.ansi[e]}else for(let e=0;e<this._restoreColors.ansi.length;++e)this._colors.ansi[e]=this._restoreColors.ansi[e]}modifyColors(e){e(this._colors),this._onChangeColors.fire(this.colors)}_updateRestoreColors(){this._restoreColors={foreground:this._colors.foreground,background:this._colors.background,cursor:this._colors.cursor,ansi:this._colors.ansi.slice()}}};function p(e,t){if(void 0!==e)try{return o.css.toColor(e)}catch(e){}return t}t.ThemeService=v=s([r(0,c.IOptionsService)],v)},6349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;i<Math.min(e,this.length);i++)t[i]=this._array[this._getCyclicIndex(i)];this._array=t,this._maxLength=e,this._startIndex=0}get length(){return this._length}set length(e){if(e>this._length)for(let t=this._length;t<e;t++)this._array[t]=void 0;this._length=e}get(e){return this._array[this._getCyclicIndex(e)]}set(e,t){this._array[this._getCyclicIndex(e)]=t}push(e){this._array[this._getCyclicIndex(this._length)]=e,this._length===this._maxLength?(this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1)):this._length++}recycle(){if(this._length!==this._maxLength)throw new Error("Can only recycle when the buffer is full");return this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1),this._array[this._getCyclicIndex(this._length-1)]}get isFull(){return this._length===this._maxLength}pop(){return this._array[this._getCyclicIndex(this._length---1)]}splice(e,t,...i){if(t){for(let i=e;i<this._length-t;i++)this._array[this._getCyclicIndex(i)]=this._array[this._getCyclicIndex(i+t)];this._length-=t,this.onDeleteEmitter.fire({index:e,amount:t})}for(let t=this._length-1;t>=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;t<i.length;t++)this._array[this._getCyclicIndex(e+t)]=i[t];if(i.length&&this.onInsertEmitter.fire({index:e,amount:i.length}),this._length+i.length>this._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+i<0)throw new Error("Cannot shift elements in list beyond index 0");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s<t;s++)this.set(e+s+i,this.get(e+s))}}_getCyclicIndex(e){return(this._startIndex+e)%this._maxLength}}t.CircularList=n},1439:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if("object"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;const s=i(6114);let r=0,n=0,o=0,a=0;var h,c,l,d,_;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function f(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${u(e)}${u(t)}${u(i)}${u(s)}`:`#${u(e)}${u(t)}${u(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0}}(h||(t.channels=h={})),function(e){function t(e,t){return a=Math.round(255*t),[r,n,o]=_.toChannels(e.rgba),{css:h.toCss(r,n,o,a),rgba:h.toRgba(r,n,o,a)}}e.blend=function(e,t){if(a=(255&t.rgba)/255,1===a)return{css:t.css,rgba:t.rgba};const i=t.rgba>>24&255,s=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return r=l+Math.round((i-l)*a),n=d+Math.round((s-d)*a),o=_+Math.round((c-_)*a),{css:h.toCss(r,n,o),rgba:h.toRgba(r,n,o)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=_.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return _.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[r,n,o]=_.toChannels(t),{css:h.toCss(r,n,o),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return a=255&e.rgba,t(e,a*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(c||(t.color=c={})),function(e){let t,i;if(!s.isNode){const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",i=t.createLinearGradient(0,0,1,1))}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),_.toColor(r,n,o);case 5:return r=parseInt(e.slice(1,2).repeat(2),16),n=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),a=parseInt(e.slice(4,5).repeat(2),16),_.toColor(r,n,o,a);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const s=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(s)return r=parseInt(s[1]),n=parseInt(s[2]),o=parseInt(s[3]),a=Math.round(255*(void 0===s[5]?1:parseFloat(s[5]))),_.toColor(r,n,o,a);if(!t||!i)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=i,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[r,n,o,a]=t.getImageData(0,0,1,1).data,255!==a)throw new Error("css.toColor: Unsupported css format");return{rgba:h.toRgba(r,n,o,a),css:e}}}(l||(t.css=l={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(d||(t.rgb=d={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c<i&&(o>0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function i(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));for(;c<i&&(o<255||a<255||h<255);)o=Math.min(255,o+Math.ceil(.1*(255-o))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),c=f(d.relativeLuminance2(o,a,h),d.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,s,r){const n=d.relativeLuminance(e>>8),o=d.relativeLuminance(s>>8);if(f(n,o)<r){if(o<n){const o=t(e,s,r),a=f(n,d.relativeLuminance(o>>8));if(a<r){const t=i(e,s,r);return a>f(n,d.relativeLuminance(t>>8))?o:t}return o}const a=i(e,s,r),h=f(n,d.relativeLuminance(a>>8));if(h<r){const i=t(e,s,r);return h>f(n,d.relativeLuminance(i>>8))?a:i}return a}},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i,s){return{css:h.toCss(e,t,i,s),rgba:h.toRgba(e,t,i,s)}}}(_||(t.rgba=_={})),t.toPaddedHex=u,t.contrastRatio=f},8969:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{var t;null===(t=this._onScrollApi)||void 0===t||t.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn("writeSync is unreliable and will be removed soon."),m=!0),this._writeBuffer.writeSync(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!("conpty"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(6242),g=i(6351),m=i(5941),S={"(":0,")":1,"*":2,"+":3,"-":1,".":2},C=131072;function b(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(y||(t.WindowsOptionsReportType=y={}));let w=0;class E extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new k(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug("Unknown EXECUTE code: ",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug("Unknown OSC code: ",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{"HOOK"===t&&(i=i.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:"@"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:" ",final:"@"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:"A"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:" ",final:"A"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:"B"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:"C"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:"D"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:"E"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:"F"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:"G"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:"H"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:"I"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:"J"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"J"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:"K"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"K"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:"L"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:"M"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:"P"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:"S"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:"T"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:"X"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:"Z"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:"`"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:"a"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:"b"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:"c"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:">",final:"c"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:"d"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:"e"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:"f"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:"g"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:"h"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"h"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:"l"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"l"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:"m"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:"n"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:"?",final:"n"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:"!",final:"p"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:" ",final:"q"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:"r"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:"s"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:"t"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:"u"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:"'",final:"}"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:"'",final:"~"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'"',final:"q"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:"$",final:"p"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new p.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new p.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new p.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new p.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new p.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new p.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new p.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new p.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new p.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new p.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new p.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new p.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:"7"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:"8"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:"D"},(()=>this.index())),this._parser.registerEscHandler({final:"E"},(()=>this.nextLine())),this._parser.registerEscHandler({final:"H"},(()=>this.tabSet())),this._parser.registerEscHandler({final:"M"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:"="},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:">"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:"c"},(()=>this.fullReset())),this._parser.registerEscHandler({final:"n"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"o"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"|"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"}"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"~"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:"%",final:"@"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:"%",final:"G"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},(()=>this.selectCharset("("+e))),this._parser.registerEscHandler({intermediates:")",final:e},(()=>this.selectCharset(")"+e))),this._parser.registerEscHandler({intermediates:"*",final:e},(()=>this.selectCharset("*"+e))),this._parser.registerEscHandler({intermediates:"+",final:e},(()=>this.selectCharset("+"+e))),this._parser.registerEscHandler({intermediates:"-",final:e},(()=>this.selectCharset("-"+e))),this._parser.registerEscHandler({intermediates:".",final:e},(()=>this.selectCharset("."+e))),this._parser.registerEscHandler({intermediates:"/",final:e},(()=>this.selectCharset("/"+e)));this._parser.registerEscHandler({intermediates:"#",final:"8"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error("Parsing error: ",e),e))),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new g.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("#SLOW_TIMEOUT")),5e3)))]).catch((e=>{if("#SLOW_TIMEOUT"!==e)throw e;console.warn("async parser handler taking longer than 5000 ms")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>C&&(n=this._parseStack.position+C)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join("")}"`),"string"==typeof e?e.split("").map((e=>e.charCodeAt(0))):e),this._parseBuffer.length<e.length&&this._parseBuffer.length<C&&(this._parseBuffer=new Uint32Array(Math.min(e.length,C))),o||this._dirtyRowTracker.clearRange(),e.length>C)for(let t=n;t<e.length;t+=C){const n=t+C<e.length?t+C:e.length,o="string"==typeof e?this._stringDecoder.decode(e.substring(t,n),this._parseBuffer):this._utf8Decoder.decode(e.subarray(t,n),this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,o))return this._preserveStack(s,r,o,t),this._logSlowResolvingAsync(i),i}else if(!o){const t="string"==typeof e?this._stringDecoder.decode(e,this._parseBuffer):this._utf8Decoder.decode(e,this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,t))return this._preserveStack(s,r,t,0),this._logSlowResolvingAsync(i),i}this._activeBuffer.x===s&&this._activeBuffer.y===r||this._onCursorMove.fire(),this._onRequestRefreshRows.fire(this._dirtyRowTracker.start,this._dirtyRowTracker.end)}print(e,t,i){let s,r;const n=this._charsetService.charset,o=this._optionsService.rawOptions.screenReaderMode,a=this._bufferService.cols,h=this._coreService.decPrivateModes.wraparound,l=this._coreService.modes.insertMode,d=this._curAttrData;let u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._activeBuffer.x&&i-t>0&&2===u.getWidth(this._activeBuffer.x-1)&&u.setCellFromCodePoint(this._activeBuffer.x-1,0,1,d.fg,d.bg,d.extended);for(let f=t;f<i;++f){if(s=e[f],r=this._unicodeService.wcwidth(s),s<127&&n){const e=n[String.fromCharCode(s)];e&&(s=e.charCodeAt(0))}if(o&&this._onA11yChar.fire((0,c.stringFromCodePoint)(s)),this._getCurrentLinkId()&&this._oscLinkService.addLineToLink(this._getCurrentLinkId(),this._activeBuffer.ybase+this._activeBuffer.y),r||!this._activeBuffer.x){if(this._activeBuffer.x+r-1>=a)if(h){for(;this._activeBuffer.x<a;)u.setCellFromCodePoint(this._activeBuffer.x++,0,1,d.fg,d.bg,d.extended);this._activeBuffer.x=0,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),u=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)}else if(this._activeBuffer.x=a-1,2===r)continue;if(l&&(u.insertCells(this._activeBuffer.x,r,this._activeBuffer.getNullCell(d),d),2===u.getWidth(a-1)&&u.setCellFromCodePoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,d.fg,d.bg,d.extended)),u.setCellFromCodePoint(this._activeBuffer.x++,s,r,d.fg,d.bg,d.extended),r>0)for(;--r;)u.setCellFromCodePoint(this._activeBuffer.x++,0,0,d.fg,d.bg,d.extended)}else u.getWidth(this._activeBuffer.x-1)?u.addCodepointToCell(this._activeBuffer.x-1,s):u.addCodepointToCell(this._activeBuffer.x-2,s)}i-t>0&&(u.loadCell(this._activeBuffer.x-1,this._workCell),2===this._workCell.getWidth()||this._workCell.getCode()>65535?this._parser.precedingCodepoint=0:this._workCell.isCombined()?this._parser.precedingCodepoint=this._workCell.getChars().charCodeAt(0):this._parser.precedingCodepoint=this._workCell.content),this._activeBuffer.x<a&&i-t>0&&0===u.getWidth(this._activeBuffer.x)&&!u.hasContent(this._activeBuffer.x)&&u.setCellFromCodePoint(this._activeBuffer.x,0,1,d.fg,d.bg,d.extended),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return"t"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!b(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new g.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new p.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){var e;if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&(null===(e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y))||void 0===e?void 0:e.isWrapped)){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData(),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i<this._bufferService.rows;i++)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(i);break;case 1:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i,0,this._activeBuffer.x+1,!0,t),this._activeBuffer.x+1>=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y,s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,r=this._bufferService.rows-1+this._activeBuffer.ybase-s+1;for(;t--;)this._activeBuffer.lines.splice(r-1,1),this._activeBuffer.lines.splice(i,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}deleteLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y;let s;for(s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,s=this._bufferService.rows-1+this._activeBuffer.ybase-s;t--;)this._activeBuffer.lines.splice(i,1),this._activeBuffer.lines.splice(s,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}insertChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.insertCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}deleteChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.deleteCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}scrollUp(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollDown(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,0,this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollLeft(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollRight(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}insertColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}deleteColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}eraseChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.replaceCells(this._activeBuffer.x,this._activeBuffer.x+(e.params[0]||1),this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}repeatPrecedingCharacter(e){if(!this._parser.precedingCodepoint)return!0;const t=e.params[0]||1,i=new Uint32Array(t);for(let e=0;e<t;++e)i[e]=this._parser.precedingCodepoint;return this.print(i,0,i.length),!0}sendDeviceAttributesPrimary(e){return e.params[0]>0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(n.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(n.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(n.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(n.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(n.C0.ESC+"[>83;40003;0c")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+"").indexOf(e)}setMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!0;break;case 20:this._optionsService.options.convertEol=!0}return!0}setModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!0;break;case 2:this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),this._charsetService.setgCharset(1,o.DEFAULT_CHARSET),this._charsetService.setgCharset(2,o.DEFAULT_CHARSET),this._charsetService.setgCharset(3,o.DEFAULT_CHARSET);break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(132,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!0,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!0;break;case 12:this._optionsService.options.cursorBlink=!0;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!0;break;case 66:this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire();break;case 9:this._coreMouseService.activeProtocol="X10";break;case 1e3:this._coreMouseService.activeProtocol="VT200";break;case 1002:this._coreMouseService.activeProtocol="DRAG";break;case 1003:this._coreMouseService.activeProtocol="ANY";break;case 1004:this._coreService.decPrivateModes.sendFocus=!0,this._onRequestSendFocus.fire();break;case 1005:this._logService.debug("DECSET 1005 not supported (see #2507)");break;case 1006:this._coreMouseService.activeEncoding="SGR";break;case 1015:this._logService.debug("DECSET 1015 not supported (see #2507)");break;case 1016:this._coreMouseService.activeEncoding="SGR_PIXELS";break;case 25:this._coreService.isCursorHidden=!1;break;case 1048:this.saveCursor();break;case 1049:this.saveCursor();case 47:case 1047:this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!0}return!0}resetMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!1;break;case 20:this._optionsService.options.convertEol=!1}return!0}resetModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!1;break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(80,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!1,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!1;break;case 12:this._optionsService.options.cursorBlink=!1;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!1;break;case 66:this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire();break;case 9:case 1e3:case 1002:case 1003:this._coreMouseService.activeProtocol="NONE";break;case 1004:this._coreService.decPrivateModes.sendFocus=!1;break;case 1005:this._logService.debug("DECRST 1005 not supported (see #2507)");break;case 1006:case 1016:this._coreMouseService.activeEncoding="DEFAULT";break;case 1015:this._logService.debug("DECRST 1015 not supported (see #2507)");break;case 25:this._coreService.isCursorHidden=!0;break;case 1048:this.restoreCursor();break;case 1049:case 47:case 1047:this._bufferService.buffers.activateNormalBuffer(),1049===e.params[t]&&this.restoreCursor(),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!1}return!0}requestMode(e,t){const i=this._coreService.decPrivateModes,{activeProtocol:s,activeEncoding:r}=this._coreMouseService,o=this._coreService,{buffers:a,cols:h}=this._bufferService,{active:c,alt:l}=a,d=this._optionsService.rawOptions,_=e=>e?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_("X10"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_("VT200"===s):1002===u?_("DRAG"===s):1003===u?_("ANY"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_("SGR"===r):1015===u?4:1016===u?_("SGR_PIXELS"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?"":"?"}${f};${v}$y`),!0;var f,v}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o<i.length&&o+n+1+r<s.length);break}if(5===s[1]&&n+r>=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t<e.length&&n+r<s.length);for(let e=2;e<s.length;++e)-1===s[e]&&(s[e]=0);switch(s[0]){case 38:i.fg=this._updateAttrColor(i.fg,s[1],s[3],s[4],s[5]);break;case 48:i.bg=this._updateAttrColor(i.bg,s[1],s[3],s[4],s[5]);break;case 58:i.extended=i.extended.clone(),i.extended.underlineColor=this._updateAttrColor(i.extended.underlineColor,s[1],s[3],s[4],s[5])}return n}_processUnderline(e,t){t.extended=t.extended.clone(),(!~e||e>5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r<t;r++)i=e.params[r],i>=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!b(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(";");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e);if(L(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,m.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(";");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(":");let s;const r=i.findIndex((e=>e.startsWith("id=")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(";");for(let e=0;e<i.length&&!(t>=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,m.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e<i.length;++e)if(/^\d+$/.exec(i[e])){const s=parseInt(i[e]);L(s)&&t.push({type:2,index:s})}return t.length&&this._onColor.fire(t),!0}restoreFgColor(e){return this._onColor.fire([{type:2,index:256}]),!0}restoreBgColor(e){return this._onColor.fire([{type:2,index:257}]),!0}restoreCursorColor(e){return this._onColor.fire([{type:2,index:258}]),!0}nextLine(){return this._activeBuffer.x=0,this.index(),!0}keypadApplicationMode(){return this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire(),!0}keypadNumericMode(){return this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire(),!0}selectDefaultCharset(){return this._charsetService.setgLevel(0),this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),!0}selectCharset(e){return 2!==e.length?(this.selectDefaultCharset(),!0):("/"===e[0]||this._charsetService.setgCharset(S[e[0]],o.CHARSETS[e[1]]||o.DEFAULT_CHARSET),!0)}index(){return this._restrictCursor(),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|"E".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t<this._bufferService.rows;++t){const i=this._activeBuffer.ybase+this._activeBuffer.y+t,s=this._activeBuffer.lines.get(i);s&&(s.fill(e),s.isWrapped=!1)}return this._dirtyRowTracker.markAllDirty(),this._setCursor(0,0),!0}requestStatusString(e,t){const i=this._bufferService.buffer,s=this._optionsService.rawOptions;return(e=>(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\`),!0))('"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}"q`:'"p'===e?'P1$r61;1"p':"r"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:"m"===e?"P1$r0m":" q"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=E;let k=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){e<this.start?this.start=e:e>this.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(w=e,e=t,t=w),e<this.start&&(this.start=e),t>this.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function L(e){return 0<=e&&e<256}k=s([r(0,v.IBufferService)],k)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||(null===(t=this._value)||void 0===t||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,null===(e=this._value)||void 0===e||e.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){var r;return null===(r=this._data.get(e,t))||void 0===r?void 0:r.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"==typeof navigator;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i<this._array.length&&this._getKey(this._array[i])===t);return!1}*getKeyIterator(e){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i<this._array.length&&this._getKey(this._array[i])===e)}forEachByKey(e,t){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i<this._array.length&&this._getKey(this._array[i])===e)}values(){return[...this._array].values()}_search(e){let t=0,i=this._array.length-1;for(;i>=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r<e)){for(;s>0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=null==t?void 0:t.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&e<this._rows}_getCorrectBufferLength(e){if(!this._hasScrollback)return e;const i=e+this._optionsService.rawOptions.scrollback;return i>t.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols<e)for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);let n=0;if(this._rows<t)for(let s=this._rows;s<t;s++)this.lines.length<t+this.ybase&&(this._optionsService.rawOptions.windowsMode||void 0!==this._optionsService.rawOptions.windowsPty.backend||void 0!==this._optionsService.rawOptions.windowsPty.buildNumber?this.lines.push(new o.BufferLine(e,i)):this.ybase>0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r<this.lines.maxLength){const e=this.lines.length-r;e>0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);this._cols=e,this._rows=t,this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition<this.lines.length;)if(t+=this.lines.get(this._memoryCleanupPosition++).cleanupMemory(),t>100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&"conpty"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length<t&&this.lines.push(new o.BufferLine(e,s))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-i,0)}_reflowSmaller(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA),s=[];let r=0;for(let n=this.lines.length-1;n>=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l<n+c.length)continue;const d=c[c.length-1].getTrimmedLength(),_=(0,a.reflowSmallerGetNewLineLengths)(c,this._cols,e),u=_.length-c.length;let f;f=0===this.ybase&&this.y!==this.lines.length-1?Math.max(0,this.y-this.lines.maxLength+u):Math.max(0,this.lines.length-this.lines.maxLength+u);const v=[];for(let e=0;e<u;e++){const e=this.getBlankLine(o.DEFAULT_ATTR_DATA,!0);v.push(e)}v.length>0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t<c.length;t++)_[t]<e&&c[t].setCell(_[t],i);let C=u-f;for(;C-- >0;)0===this.ybase?this.y<t-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase<Math.min(this.lines.maxLength,this.lines.length+r)-t&&(this.ybase===this.ydisp&&this.ydisp++,this.ybase++);this.savedY=Math.min(this.savedY+u,this.ybase+t-1)}if(s.length>0){const e=[],t=[];for(let e=0;e<this.lines.length;e++)t.push(this.lines.get(e));const i=this.lines.length;let n=i-1,o=0,a=s[o];this.lines.length=Math.min(this.lines.maxLength,this.lines.length+r);let h=0;for(let c=Math.min(this.lines.maxLength-1,i+r-1);c>=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):""}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+1<this.lines.length&&this.lines.get(i+1).isWrapped;)i++;return{first:t,last:i}}setupTabStops(e){for(null!=e?this.tabs[e]||(e=this.prevStop(e)):(this.tabs={},e=0);e<this._cols;e+=this._optionsService.rawOptions.tabStopWidth)this.tabs[e]=!0}prevStop(e){for(null==e&&(e=this.x);!this.tabs[--e]&&e>0;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e<this._cols;);return e>=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t<this.markers.length;t++)this.markers[t].line===e&&(this.markers[t].dispose(),this.markers.splice(t--,1));this._isClearing=!1}clearAllMarkers(){this._isClearing=!0;for(let e=0;e<this.markers.length;e++)this.markers[e].dispose(),this.markers.splice(e--,1);this._isClearing=!1}addMarker(e){const t=new l.Marker(e);return this.markers.push(t),t.register(this.lines.onTrim((e=>{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.line<e.index+e.amount&&t.dispose(),t.line>e.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t<e;++t)this.setCell(t,s);this.length=e}get(e){const t=this._data[3*e+0],i=2097151&t;return[this._data[3*e+1],2097152&t?this._combined[e]:i?(0,o.stringFromCodePoint)(i):"",t>>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodePoint(e,t,i,s,r,n){268435456&r&&(this._extendedAttrs[e]=n),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s,this._data[3*e+2]=r}addCodepointToCell(e,t){let i=this._data[3*e+0];2097152&i?this._combined[e]+=(0,o.stringFromCodePoint)(t):(2097151&i?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&i)+(0,o.stringFromCodePoint)(t),i&=-2097152,i|=2097152):i=t|1<<22,this._data[3*e+0]=i)}insertCells(e,t,i,n){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs),t<this.length-e){const s=new r.CellData;for(let i=this.length-e-t-1;i>=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;s<t;++s)this.setCell(e+s,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);2===this.getWidth(this.length-1)&&this.setCellFromCodePoint(this.length-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs)}deleteCells(e,t,i,n){if(e%=this.length,t<this.length-e){const s=new r.CellData;for(let i=0;i<this.length-e-t;++i)this.setCell(e+i,this.loadCell(e+t+i,s));for(let e=this.length-t;e<this.length;++e)this.setCell(e,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs),0!==this.getWidth(e)||this.hasContent(e)||this.setCellFromCodePoint(e,0,1,(null==n?void 0:n.fg)||0,(null==n?void 0:n.bg)||0,(null==n?void 0:n.extended)||new s.ExtendedAttrs)}replaceCells(e,t,i,r,n=!1){if(n)for(e&&2===this.getWidth(e-1)&&!this.isProtected(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs),t<this.length&&2===this.getWidth(t-1)&&!this.isProtected(t)&&this.setCellFromCodePoint(t,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs);e<t&&e<this.length;)this.isProtected(e)||this.setCell(e,i),e++;else for(e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs),t<this.length&&2===this.getWidth(t-1)&&this.setCellFromCodePoint(t,0,1,(null==r?void 0:r.fg)||0,(null==r?void 0:r.bg)||0,(null==r?void 0:r.extended)||new s.ExtendedAttrs);e<t&&e<this.length;)this.setCell(e++,i)}resize(e,t){if(e===this.length)return 4*this._data.length*2<this._data.buffer.byteLength;const i=3*e;if(e>this.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i<e;++i)this.setCell(i,t)}else{this._data=this._data.subarray(0,i);const t=Object.keys(this._combined);for(let i=0;i<t.length;i++){const s=parseInt(t[i],10);s>=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t<s.length;t++){const i=parseInt(s[t],10);i>=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2<this._data.buffer.byteLength}cleanupMemory(){if(4*this._data.length*2<this._data.buffer.byteLength){const e=new Uint32Array(this._data.length);return e.set(this._data),this._data=e,1}return 0}fill(e,t=!1){if(t)for(let t=0;t<this.length;++t)this.isProtected(t)||this.setCell(t,e);else{this._combined={},this._extendedAttrs={};for(let t=0;t<this.length;++t)this.setCell(t,e)}}copyFrom(e){this.length!==e.length?this._data=new Uint32Array(e._data):this._data.set(e._data),this.length=e.length,this._combined={};for(const t in e._combined)this._combined[t]=e._combined[t];this._extendedAttrs={};for(const t in e._extendedAttrs)this._extendedAttrs[t]=e._extendedAttrs[t];this.isWrapped=e.isWrapped}clone(){const e=new h(0);e._data=new Uint32Array(this._data),e.length=this.length;for(const t in this._combined)e._combined[t]=this._combined[t];for(const t in this._extendedAttrs)e._extendedAttrs[t]=this._extendedAttrs[t];return e.isWrapped=this.isWrapped,e}getTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r<s;r++){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}const o=Object.keys(e._combined);for(let s=0;s<o.length;s++){const r=parseInt(o[s],10);r>=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e=!1,t=0,i=this.length){e&&(i=Math.min(i,this.getTrimmedLength()));let s="";for(;t<i;){const e=this._data[3*t+0],i=2097151&e;s+=2097152&e?this._combined[t]:i?(0,o.stringFromCodePoint)(i):n.WHITESPACE_CELL_CHAR,t+=e>>22||1}return s}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,"__esModule",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a<e.length-1;a++){let h=a,c=e.get(++h);if(!c.isWrapped)continue;const l=[e.get(a)];for(;h<e.length&&c.isWrapped;)l.push(c),c=e.get(++h);if(r>=a&&r<h){a+=l.length-1;continue}let d=0,_=i(l,d,t),u=1,f=0;for(;u<l.length;){const e=i(l,u,t),r=e-f,o=s-_,a=Math.min(r,o);l[d].copyCellsFrom(l[u],f,_,a,!1),_+=a,_===s&&(d++,_=0),f+=a,f===e&&(u++,f=0),0===_&&0!==d&&2===l[d-1].getWidth(s-1)&&(l[d].copyCellsFrom(l[d-1],s-1,_++,1,!1),l[d-1].setCell(s-1,n))}l[d].replaceCells(_,s,n);let v=0;for(let e=l.length-1;e>0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;o<e.length;o++)if(r===o){const i=t[++s];e.onDeleteEmitter.fire({index:o-n,amount:i}),o+=i-1,n+=i,r=t[++s]}else i.push(o);return{layout:i,countRemoved:n}},t.reflowLargerApplyNewLayout=function(e,t){const i=[];for(let s=0;s<t.length;s++)i.push(e.get(t[s]));for(let t=0;t<i.length;t++)e.set(t,i[t]);e.length=t.length},t.reflowSmallerGetNewLineLengths=function(e,t,s){const r=[],n=e.map(((s,r)=>i(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;h<n;){if(n-h<s){r.push(n-h);break}o+=s;const c=i(e,a,t);o>c&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"␤",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},t.CHARSETS.A={"#":"£"},t.CHARSETS.B=void 0,t.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},t.CHARSETS.C=t.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},t.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},t.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},t.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},t.CHARSETS.E=t.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},t.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},t.CHARSETS.H=t.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,"__esModule",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL="\0",e.SOH="\ 1",e.STX="\ 2",e.ETX="\ 3",e.EOT="\ 4",e.ENQ="\ 5",e.ACK="\ 6",e.BEL="\a",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="\ e",e.SI="\ f",e.DLE="\10",e.DC1="\11",e.DC2="\12",e.DC3="\13",e.DC4="\14",e.NAK="\15",e.SYN="\16",e.ETB="\17",e.CAN="\18",e.EM="\19",e.SUB="\1a",e.ESC="\e",e.FS="\1c",e.GS="\1d",e.RS="\1e",e.US="\1f",e.SP=" ",e.DEL="\7f"}(i||(t.C0=i={})),function(e){e.PAD="\80",e.HOP="\81",e.BPH="\82",e.NBH="\83",e.IND="\84",e.NEL="\85",e.SSA="\86",e.ESA="\87",e.HTS="\88",e.HTJ="\89",e.VTS="\8a",e.PLD="\8b",e.PLU="\8c",e.RI="\8d",e.SS2="\8e",e.SS3="\8f",e.DCS="\90",e.PU1="\91",e.PU2="\92",e.STS="\93",e.CCH="\94",e.MW="\95",e.SPA="\96",e.EPA="\97",e.SOS="\98",e.SGCI="\99",e.SCI="\9a",e.CSI="\9b",e.ST="\9c",e.OSC="\9d",e.PM="\9e",e.APC="\9f"}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:"UIKeyInputUpArrow"===e.key?o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A":"UIKeyInputLeftArrow"===e.key?o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D":"UIKeyInputRightArrow"===e.key?o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C":"UIKeyInputDownArrow"===e.key&&(o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B");break;case 8:if(e.altKey){o.key=s.C0.ESC+s.C0.DEL;break}o.key=s.C0.DEL;break;case 9:if(e.shiftKey){o.key=s.C0.ESC+"[Z";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"D",o.key===s.C0.ESC+"[1;3D"&&(o.key=s.C0.ESC+(i?"b":"[1;5D"))):o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"C",o.key===s.C0.ESC+"[1;3C"&&(o.key=s.C0.ESC+(i?"f":"[1;5C"))):o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"A",i||o.key!==s.C0.ESC+"[1;3A"||(o.key=s.C0.ESC+"[1;5A")):o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"B",i||o.key!==s.C0.ESC+"[1;3B"||(o.key=s.C0.ESC+"[1;5B")):o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+"[2~");break;case 46:o.key=a?s.C0.ESC+"[3;"+(a+1)+"~":s.C0.ESC+"[3~";break;case 36:o.key=a?s.C0.ESC+"[1;"+(a+1)+"H":t?s.C0.ESC+"OH":s.C0.ESC+"[H";break;case 35:o.key=a?s.C0.ESC+"[1;"+(a+1)+"F":t?s.C0.ESC+"OF":s.C0.ESC+"[F";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+"[5;"+(a+1)+"~":o.key=s.C0.ESC+"[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+"[6;"+(a+1)+"~":o.key=s.C0.ESC+"[6~";break;case 112:o.key=a?s.C0.ESC+"[1;"+(a+1)+"P":s.C0.ESC+"OP";break;case 113:o.key=a?s.C0.ESC+"[1;"+(a+1)+"Q":s.C0.ESC+"OQ";break;case 114:o.key=a?s.C0.ESC+"[1;"+(a+1)+"R":s.C0.ESC+"OR";break;case 115:o.key=a?s.C0.ESC+"[1;"+(a+1)+"S":s.C0.ESC+"OS";break;case 116:o.key=a?s.C0.ESC+"[15;"+(a+1)+"~":s.C0.ESC+"[15~";break;case 117:o.key=a?s.C0.ESC+"[17;"+(a+1)+"~":s.C0.ESC+"[17~";break;case 118:o.key=a?s.C0.ESC+"[18;"+(a+1)+"~":s.C0.ESC+"[18~";break;case 119:o.key=a?s.C0.ESC+"[19;"+(a+1)+"~":s.C0.ESC+"[19~";break;case 120:o.key=a?s.C0.ESC+"[20;"+(a+1)+"~":s.C0.ESC+"[20~";break;case 121:o.key=a?s.C0.ESC+"[21;"+(a+1)+"~":s.C0.ESC+"[21~";break;case 122:o.key=a?s.C0.ESC+"[23;"+(a+1)+"~":s.C0.ESC+"[23~";break;case 123:o.key=a?s.C0.ESC+"[24;"+(a+1)+"~":s.C0.ESC+"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&("_"===e.key&&(o.key=s.C0.US),"@"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=null==t?void 0:t[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n<i;++n){const r=e.charCodeAt(n);if(55296<=r&&r<=56319){if(++n>=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c<l;){if(c>=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d<i;){for(;!(!(d<l)||128&(s=e[d])||128&(r=e[d+1])||128&(n=e[d+2])||128&(o=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=n,t[a++]=o,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const i=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],s=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let r;t.UnicodeV6=class{constructor(){if(this.version="6",!r){r=new Uint8Array(65536),r.fill(1),r[0]=0,r.fill(0,1,32),r.fill(0,127,160),r.fill(2,4352,4448),r[9001]=2,r[9002]=2,r.fill(2,11904,42192),r[12351]=1,r.fill(2,44032,55204),r.fill(2,63744,64256),r.fill(2,65040,65050),r.fill(2,65072,65136),r.fill(2,65280,65377),r.fill(2,65504,65511);for(let e=0;e<i.length;++e)r.fill(0,i[e][0],i[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?r[e]:function(e,t){let i,s=0,r=t.length-1;if(e<t[0][0]||e>t[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e<t[i][0]))return!0;r=i-1}return!1}(e,s)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}}},5981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,s=/^[\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?"0"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf("rgb:")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf("#")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,"HOOK",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,"PUT",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,"UNHOOK",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data="",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data="",this._hitLimit=!1,e)));return this._params=a,this._data="",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;r<e.length;r++)this.table[t<<8|e[r]]=i<<4|s}}t.TransitionTable=a;const h=160;t.VT500_TRANSITION_TABLE=function(){const e=new a(4095),t=Array.apply(null,Array(256)).map(((e,t)=>t)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(e.intermediates){if(e.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let t=0;t<e.intermediates.length;++t){const s=e.intermediates.charCodeAt(t);if(32>s||s>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");i<<=8,i|=s}}if(1!==e.final.length)throw new Error("final must be a single byte");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingCodepoint=0,this.currentState=15&this._parseStack.transition}for(let i=o;i<t;++i){switch(r=e[i],n=this._transitions.table[this.currentState<<8|(r<160?r:h)],n>>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}}break;case 3:this._executeHandlers[r]?this._executeHandlers[r]():this._executeHandlerFb(r),this.precedingCodepoint=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:r,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const o=this._csiHandlers[this._collect<<8|r];let a=o?o.length-1:-1;for(;a>=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingCodepoint=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i<t&&(r=e[i])>47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingCodepoint=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r<h){this._dcsParser.put(e,i,s),i=s-1;break}break;case 14:if(s=this._dcsParser.unhook(24!==r&&26!==r),s)return this._preserveStack(6,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0;break;case 4:this._oscParser.start();break;case 5:for(let s=i+1;;s++)if(s>=t||(r=e[s])<32||r>127&&r<h){this._oscParser.put(e,i,s),i=s-1;break}break;case 6:if(s=this._oscParser.end(24!==r&&26!==r),s)return this._preserveStack(5,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0}this.currentState=15&n}}}t.EscapeSequenceParser=c},6242:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,"START")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,"PUT",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t<i;){const i=e[t++];if(59===i){this._state=2,this._start();break}if(i<48||57<i)return void(this._state=3);-1===this._id&&(this._id=0),this._id=10*this._id+i-48}2===this._state&&i-t>0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,"END",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data="",this._hitLimit=!1,e)));return this._data="",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i<e.length;++i){const s=e[i];if(Array.isArray(s))for(let e=0;e<s.length;++e)t.addSubParam(s[e]);else t.addParam(s)}return t}constructor(e=32,t=32){if(this.maxLength=e,this.maxSubParamsLength=t,t>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t<this.length;++t){e.push(this.params[t]);const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t<this.length;++t){const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i<this._addons.length;i++)if(this._addons[i]===e){t=i;break}if(-1===t)throw new Error("Could not dispose an addon that has not been loaded");e.isDisposed=!0,e.dispose.apply(e.instance),this._addons.splice(t,1)}}},8771:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new s.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`\e[M${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`\e[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`\e[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol "${e}"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding "${e}"`);this._activeEncoding=e}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,"SGR_PIXELS"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&("DEFAULT"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>null==e?void 0:e.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){var s,r,n;let o=0,a=0;for(const h of this._decorations.getKeyIterator(t))o=null!==(s=h.options.x)&&void 0!==s?s:0,a=o+(null!==(r=h.options.width)&&void 0!==r?r:1),e>=o&&e<a&&(!i||(null!==(n=h.options.layer)&&void 0!==n?n:"bottom")===i)&&(yield h)}forEachDecorationAtCell(e,t,i,s){this._decorations.forEachByKey(t,(t=>{var r,n,o;a=null!==(r=t.options.x)&&void 0!==r?r:0,h=a+(null!==(n=t.options.width)&&void 0!==n?n:1),e>=a&&e<h&&(!i||(null!==(o=t.options.layer)&&void 0!==o?o:"bottom")===i)&&s(t)}))}}t.DecorationService=c;class l extends n.Disposable{get isDisposed(){return this._isDisposed}get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=s.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=s.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.register(new r.EventEmitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.register(new r.EventEmitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},4348:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.TRACE&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.trace.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}debug(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.DEBUG&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.debug.bind(this._optionsService.options.logger))&&void 0!==s?s:console.log,e,t)}info(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.INFO&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.info.bind(this._optionsService.options.logger))&&void 0!==s?s:console.info,e,t)}warn(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.WARN&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.warn.bind(this._optionsService.options.logger))&&void 0!==s?s:console.warn,e,t)}error(e,...t){var i,s;this._logLevel<=o.LogLevelEnum.ERROR&&this._log(null!==(s=null===(i=this._optionsService.options.logger)||void 0===i?void 0:i.error.bind(this._optionsService.options.logger))&&void 0!==s?s:console.error,e,t)}};t.LogService=c=s([r(0,o.IOptionsService)],c),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==o.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const o=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i=Object.assign({},t.DEFAULT_OPTIONS);for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options=Object.assign({},i),this._setupOptions()}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return"block"===e||"underline"===e||"bar"===e}(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=t.DEFAULT_OPTIONS[e]);break;case"fontWeight":case"fontWeightBold":if("number"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"cursorWidth":i=Math.floor(i);case"lineHeight":case"tabStopWidth":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case"minimumContrastRatio":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case"scrollback":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case"rows":case"cols":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=null!=i?i:{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){var t;return null===(t=this._dataByLinkId.get(e))||void 0===t?void 0:t.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")},1480:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);t.UnicodeService=class{constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0;const i=e.length;for(let s=0;s<i;++s){let r=e.charCodeAt(s);if(55296<=r&&r<=56319){if(++s>=i)return t+this.wcwidth(r);const n=e.charCodeAt(s);56320<=n&&n<=57343?r=1024*(r-55296)+n-56320+65536:t+=this.wcwidth(n)}t+=this.wcwidth(r)}return t}}}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=["cols","rows"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions=Object.assign({},this._core.options);const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option "${e}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.coreMouseService.activeProtocol){case"X10":t="x10";break;case"VT200":t="vt200";break;case"DRAG":t="drag";break;case"ANY":t="any"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){var t,i,s;return this._checkProposedApi(),this._verifyPositiveIntegers(null!==(t=e.x)&&void 0!==t?t:0,null!==(i=e.width)&&void 0!==i?i:0,null!==(s=e.height)&&void 0!==s?s:0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write("\r\n",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error("This API only accepts positive integers")}}e.Terminal=d})(),s})()));
+//# sourceMappingURL=xterm.js.map
\ No newline at end of file
diff --git a/xterm.js/src/xterm.js.map b/xterm.js/src/xterm.js.map
new file mode 100644 (file)
index 0000000..d3bb063
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"file":"xterm.js","mappings":"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,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAC7C,CAAC,KAAQ,MAAS,CAAC,KAAQ,MAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAAS,CAAC,MAAQ,OAC7C,CAAC,MAAQ,OAA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","sources":["webpack://xterm/webpack/universalModuleDefinition","webpack://xterm/./src/browser/AccessibilityManager.ts","webpack://xterm/./src/browser/Clipboard.ts","webpack://xterm/./src/browser/ColorContrastCache.ts","webpack://xterm/./src/browser/Lifecycle.ts","webpack://xterm/./src/browser/Linkifier2.ts","webpack://xterm/./src/browser/LocalizableStrings.ts","webpack://xterm/./src/browser/OscLinkProvider.ts","webpack://xterm/./src/browser/RenderDebouncer.ts","webpack://xterm/./src/browser/ScreenDprMonitor.ts","webpack://xterm/./src/browser/Terminal.ts","webpack://xterm/./src/browser/TimeBasedDebouncer.ts","webpack://xterm/./src/browser/Viewport.ts","webpack://xterm/./src/browser/decorations/BufferDecorationRenderer.ts","webpack://xterm/./src/browser/decorations/ColorZoneStore.ts","webpack://xterm/./src/browser/decorations/OverviewRulerRenderer.ts","webpack://xterm/./src/browser/input/CompositionHelper.ts","webpack://xterm/./src/browser/input/Mouse.ts","webpack://xterm/./src/browser/input/MoveToCell.ts","webpack://xterm/./src/browser/renderer/dom/DomRenderer.ts","webpack://xterm/./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack://xterm/./src/browser/renderer/dom/WidthCache.ts","webpack://xterm/./src/browser/renderer/shared/Constants.ts","webpack://xterm/./src/browser/renderer/shared/RendererUtils.ts","webpack://xterm/./src/browser/selection/SelectionModel.ts","webpack://xterm/./src/browser/services/CharSizeService.ts","webpack://xterm/./src/browser/services/CharacterJoinerService.ts","webpack://xterm/./src/browser/services/CoreBrowserService.ts","webpack://xterm/./src/browser/services/MouseService.ts","webpack://xterm/./src/browser/services/RenderService.ts","webpack://xterm/./src/browser/services/SelectionService.ts","webpack://xterm/./src/browser/services/Services.ts","webpack://xterm/./src/browser/services/ThemeService.ts","webpack://xterm/./src/common/CircularList.ts","webpack://xterm/./src/common/Clone.ts","webpack://xterm/./src/common/Color.ts","webpack://xterm/./src/common/CoreTerminal.ts","webpack://xterm/./src/common/EventEmitter.ts","webpack://xterm/./src/common/InputHandler.ts","webpack://xterm/./src/common/Lifecycle.ts","webpack://xterm/./src/common/MultiKeyMap.ts","webpack://xterm/./src/common/Platform.ts","webpack://xterm/./src/common/SortedList.ts","webpack://xterm/./src/common/TaskQueue.ts","webpack://xterm/./src/common/WindowsMode.ts","webpack://xterm/./src/common/buffer/AttributeData.ts","webpack://xterm/./src/common/buffer/Buffer.ts","webpack://xterm/./src/common/buffer/BufferLine.ts","webpack://xterm/./src/common/buffer/BufferRange.ts","webpack://xterm/./src/common/buffer/BufferReflow.ts","webpack://xterm/./src/common/buffer/BufferSet.ts","webpack://xterm/./src/common/buffer/CellData.ts","webpack://xterm/./src/common/buffer/Constants.ts","webpack://xterm/./src/common/buffer/Marker.ts","webpack://xterm/./src/common/data/Charsets.ts","webpack://xterm/./src/common/data/EscapeSequences.ts","webpack://xterm/./src/common/input/Keyboard.ts","webpack://xterm/./src/common/input/TextDecoder.ts","webpack://xterm/./src/common/input/UnicodeV6.ts","webpack://xterm/./src/common/input/WriteBuffer.ts","webpack://xterm/./src/common/input/XParseColor.ts","webpack://xterm/./src/common/parser/Constants.ts","webpack://xterm/./src/common/parser/DcsParser.ts","webpack://xterm/./src/common/parser/EscapeSequenceParser.ts","webpack://xterm/./src/common/parser/OscParser.ts","webpack://xterm/./src/common/parser/Params.ts","webpack://xterm/./src/common/public/AddonManager.ts","webpack://xterm/./src/common/public/BufferApiView.ts","webpack://xterm/./src/common/public/BufferLineApiView.ts","webpack://xterm/./src/common/public/BufferNamespaceApi.ts","webpack://xterm/./src/common/public/ParserApi.ts","webpack://xterm/./src/common/public/UnicodeApi.ts","webpack://xterm/./src/common/services/BufferService.ts","webpack://xterm/./src/common/services/CharsetService.ts","webpack://xterm/./src/common/services/CoreMouseService.ts","webpack://xterm/./src/common/services/CoreService.ts","webpack://xterm/./src/common/services/DecorationService.ts","webpack://xterm/./src/common/services/InstantiationService.ts","webpack://xterm/./src/common/services/LogService.ts","webpack://xterm/./src/common/services/OptionsService.ts","webpack://xterm/./src/common/services/OscLinkService.ts","webpack://xterm/./src/common/services/ServiceRegistry.ts","webpack://xterm/./src/common/services/Services.ts","webpack://xterm/./src/common/services/UnicodeService.ts","webpack://xterm/webpack/bootstrap","webpack://xterm/./src/browser/public/Terminal.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, () => {\nreturn ","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal, IRenderDebouncer } from 'browser/Types';\nimport { isMac } from 'common/Platform';\nimport { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IBuffer } from 'common/buffer/Types';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n  TOP,\n  BOTTOM\n}\n\nexport class AccessibilityManager extends Disposable {\n  private _accessibilityContainer: HTMLElement;\n\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[];\n\n  private _liveRegion: HTMLElement;\n  private _liveRegionLineCount: number = 0;\n  private _liveRegionDebouncer: IRenderDebouncer;\n\n  private _screenDprMonitor: ScreenDprMonitor;\n\n  private _topBoundaryFocusListener: (e: FocusEvent) => void;\n  private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n  /**\n   * This queue has a character pushed to it for keys that are pressed, if the\n   * next character added to the terminal is equal to the key char then it is\n   * not announced (added to live region) because it has already been announced\n   * by the textarea event (which cannot be canceled). There are some race\n   * condition cases if there is typing while data is streaming, but this covers\n   * the main case of typing into the prompt and inputting the answer to a\n   * question (Y/N, etc.).\n   */\n  private _charsToConsume: string[] = [];\n\n  private _charsToAnnounce: string = '';\n\n  constructor(\n    private readonly _terminal: ITerminal,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n    this._accessibilityContainer = document.createElement('div');\n    this._accessibilityContainer.classList.add('xterm-accessibility');\n\n    this._rowContainer = document.createElement('div');\n    this._rowContainer.setAttribute('role', 'list');\n    this._rowContainer.classList.add('xterm-accessibility-tree');\n    this._rowElements = [];\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n\n    this._topBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.TOP);\n    this._bottomBoundaryFocusListener = e => this._handleBoundaryFocus(e, BoundaryPosition.BOTTOM);\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._refreshRowsDimensions();\n    this._accessibilityContainer.appendChild(this._rowContainer);\n\n    this._liveRegion = document.createElement('div');\n    this._liveRegion.classList.add('live-region');\n    this._liveRegion.setAttribute('aria-live', 'assertive');\n    this._accessibilityContainer.appendChild(this._liveRegion);\n    this._liveRegionDebouncer = this.register(new TimeBasedDebouncer(this._renderRows.bind(this)));\n\n    if (!this._terminal.element) {\n      throw new Error('Cannot enable accessibility before Terminal.open');\n    }\n    this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer);\n\n    this.register(this._terminal.onResize(e => this._handleResize(e.rows)));\n    this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n    this.register(this._terminal.onScroll(() => this._refreshRows()));\n    // Line feed is an issue as the prompt won't be read out after a command is run\n    this.register(this._terminal.onA11yChar(char => this._handleChar(char)));\n    this.register(this._terminal.onLineFeed(() => this._handleChar('\\n')));\n    this.register(this._terminal.onA11yTab(spaceCount => this._handleTab(spaceCount)));\n    this.register(this._terminal.onKey(e => this._handleKey(e.key)));\n    this.register(this._terminal.onBlur(() => this._clearLiveRegion()));\n    this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n\n    this._screenDprMonitor = new ScreenDprMonitor(window);\n    this.register(this._screenDprMonitor);\n    this._screenDprMonitor.setListener(() => this._refreshRowsDimensions());\n    // This shouldn't be needed on modern browsers but is present in case the\n    // media query that drives the ScreenDprMonitor isn't supported\n    this.register(addDisposableDomListener(window, 'resize', () => this._refreshRowsDimensions()));\n\n    this._refreshRows();\n    this.register(toDisposable(() => {\n      this._accessibilityContainer.remove();\n      this._rowElements.length = 0;\n    }));\n  }\n\n  private _handleTab(spaceCount: number): void {\n    for (let i = 0; i < spaceCount; i++) {\n      this._handleChar(' ');\n    }\n  }\n\n  private _handleChar(char: string): void {\n    if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n      if (this._charsToConsume.length > 0) {\n        // Have the screen reader ignore the char if it was just input\n        const shiftedChar = this._charsToConsume.shift();\n        if (shiftedChar !== char) {\n          this._charsToAnnounce += char;\n        }\n      } else {\n        this._charsToAnnounce += char;\n      }\n\n      if (char === '\\n') {\n        this._liveRegionLineCount++;\n        if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n          this._liveRegion.textContent += Strings.tooMuchOutput;\n        }\n      }\n\n      // Only detach/attach on mac as otherwise messages can go unaccounced\n      if (isMac) {\n        if (this._liveRegion.textContent && this._liveRegion.textContent.length > 0 && !this._liveRegion.parentNode) {\n          setTimeout(() => {\n            this._accessibilityContainer.appendChild(this._liveRegion);\n          }, 0);\n        }\n      }\n    }\n  }\n\n  private _clearLiveRegion(): void {\n    this._liveRegion.textContent = '';\n    this._liveRegionLineCount = 0;\n\n    // Only detach/attach on mac as otherwise messages can go unaccounced\n    if (isMac) {\n      this._liveRegion.remove();\n    }\n  }\n\n  private _handleKey(keyChar: string): void {\n    this._clearLiveRegion();\n    // Only add the char if there is no control character.\n    if (!/\\p{Control}/u.test(keyChar)) {\n      this._charsToConsume.push(keyChar);\n    }\n  }\n\n  private _refreshRows(start?: number, end?: number): void {\n    this._liveRegionDebouncer.refresh(start, end, this._terminal.rows);\n  }\n\n  private _renderRows(start: number, end: number): void {\n    const buffer: IBuffer = this._terminal.buffer;\n    const setSize = buffer.lines.length.toString();\n    for (let i = start; i <= end; i++) {\n      const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true);\n      const posInSet = (buffer.ydisp + i + 1).toString();\n      const element = this._rowElements[i];\n      if (element) {\n        if (lineData.length === 0) {\n          element.innerText = '\\u00a0';\n        } else {\n          element.textContent = lineData;\n        }\n        element.setAttribute('aria-posinset', posInSet);\n        element.setAttribute('aria-setsize', setSize);\n      }\n    }\n    this._announceCharacters();\n  }\n\n  private _announceCharacters(): void {\n    if (this._charsToAnnounce.length === 0) {\n      return;\n    }\n    this._liveRegion.textContent += this._charsToAnnounce;\n    this._charsToAnnounce = '';\n  }\n\n  private _handleBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n    const boundaryElement = e.target as HTMLElement;\n    const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n    // Don't scroll if the buffer top has reached the end in that direction\n    const posInSet = boundaryElement.getAttribute('aria-posinset');\n    const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n    if (posInSet === lastRowPos) {\n      return;\n    }\n\n    // Don't scroll when the last focused item was not the second row (focus is going the other\n    // direction)\n    if (e.relatedTarget !== beforeBoundaryElement) {\n      return;\n    }\n\n    // Remove old boundary element from array\n    let topBoundaryElement: HTMLElement;\n    let bottomBoundaryElement: HTMLElement;\n    if (position === BoundaryPosition.TOP) {\n      topBoundaryElement = boundaryElement;\n      bottomBoundaryElement = this._rowElements.pop()!;\n      this._rowContainer.removeChild(bottomBoundaryElement);\n    } else {\n      topBoundaryElement = this._rowElements.shift()!;\n      bottomBoundaryElement = boundaryElement;\n      this._rowContainer.removeChild(topBoundaryElement);\n    }\n\n    // Remove listeners from old boundary elements\n    topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n    bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Add new element to array/DOM\n    if (position === BoundaryPosition.TOP) {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.unshift(newElement);\n      this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n    } else {\n      const newElement = this._createAccessibilityTreeNode();\n      this._rowElements.push(newElement);\n      this._rowContainer.appendChild(newElement);\n    }\n\n    // Add listeners to new boundary elements\n    this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Scroll up\n    this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n    // Focus new boundary before element\n    this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n    // Prevent the standard behavior\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  }\n\n  private _handleResize(rows: number): void {\n    // Remove bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n    // Grow rows as required\n    for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n      this._rowElements[i] = this._createAccessibilityTreeNode();\n      this._rowContainer.appendChild(this._rowElements[i]);\n    }\n    // Shrink rows as required\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n    }\n\n    // Add bottom boundary listener\n    this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n    this._refreshRowsDimensions();\n  }\n\n  private _createAccessibilityTreeNode(): HTMLElement {\n    const element = document.createElement('div');\n    element.setAttribute('role', 'listitem');\n    element.tabIndex = -1;\n    this._refreshRowDimensions(element);\n    return element;\n  }\n  private _refreshRowsDimensions(): void {\n    if (!this._renderService.dimensions.css.cell.height) {\n      return;\n    }\n    this._accessibilityContainer.style.width = `${this._renderService.dimensions.css.canvas.width}px`;\n    if (this._rowElements.length !== this._terminal.rows) {\n      this._handleResize(this._terminal.rows);\n    }\n    for (let i = 0; i < this._terminal.rows; i++) {\n      this._refreshRowDimensions(this._rowElements[i]);\n    }\n  }\n  private _refreshRowDimensions(element: HTMLElement): void {\n    element.style.height = `${this._renderService.dimensions.css.cell.height}px`;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService, IOptionsService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n  return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n  if (bracketedPasteMode) {\n    return '\\x1b[200~' + text + '\\x1b[201~';\n  }\n  return text;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n  if (ev.clipboardData) {\n    ev.clipboardData.setData('text/plain', selectionService.selectionText);\n  }\n  // Prevent or the original text will be copied.\n  ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  ev.stopPropagation();\n  if (ev.clipboardData) {\n    const text = ev.clipboardData.getData('text/plain');\n    paste(text, textarea, coreService, optionsService);\n  }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService, optionsService: IOptionsService): void {\n  text = prepareTextForTerminal(text);\n  text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode && optionsService.rawOptions.ignoreBracketedPasteMode !== true);\n  coreService.triggerDataEvent(text, true);\n  textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n  // Calculate textarea position relative to the screen element\n  const pos = screenElement.getBoundingClientRect();\n  const left = ev.clientX - pos.left - 10;\n  const top = ev.clientY - pos.top - 10;\n\n  // Bring textarea at the cursor position\n  textarea.style.width = '20px';\n  textarea.style.height = '20px';\n  textarea.style.left = `${left}px`;\n  textarea.style.top = `${top}px`;\n  textarea.style.zIndex = '1000';\n\n  textarea.focus();\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n  moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n  if (shouldSelectWord) {\n    selectionService.rightClickSelect(ev);\n  }\n\n  // Get textarea ready to copy from the context menu\n  textarea.value = selectionService.selectionText;\n  textarea.select();\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { IColor } from 'common/Types';\nimport { TwoKeyMap } from 'common/MultiKeyMap';\n\nexport class ColorContrastCache implements IColorContrastCache {\n  private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();\n  private _css: TwoKeyMap</* bg */number, /* fg */number, string | null> = new TwoKeyMap();\n\n  public setCss(bg: number, fg: number, value: string | null): void {\n    this._css.set(bg, fg, value);\n  }\n\n  public getCss(bg: number, fg: number): string | null | undefined {\n    return this._css.get(bg, fg);\n  }\n\n  public setColor(bg: number, fg: number, value: IColor | null): void {\n    this._color.set(bg, fg, value);\n  }\n\n  public getColor(bg: number, fg: number): IColor | null | undefined {\n    return this._color.get(bg, fg);\n  }\n\n  public clear(): void {\n    this._color.clear();\n    this._css.clear();\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n  node: Element | Window | Document,\n  type: string,\n  handler: (e: any) => void,\n  options?: boolean | AddEventListenerOptions\n): IDisposable {\n  node.addEventListener(type, handler, options);\n  let disposed = false;\n  return {\n    dispose: () => {\n      if (disposed) {\n        return;\n      }\n      disposed = true;\n      node.removeEventListener(type, handler, options);\n    }\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IBufferCellPosition, ILink, ILinkDecorations, ILinkProvider, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, disposeArray, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { IBufferService } from 'common/services/Services';\nimport { IMouseService, IRenderService } from './services/Services';\n\nexport class Linkifier2 extends Disposable implements ILinkifier2 {\n  private _element: HTMLElement | undefined;\n  private _mouseService: IMouseService | undefined;\n  private _renderService: IRenderService | undefined;\n  private _linkProviders: ILinkProvider[] = [];\n  public get currentLink(): ILinkWithState | undefined { return this._currentLink; }\n  protected _currentLink: ILinkWithState | undefined;\n  private _mouseDownLink: ILinkWithState | undefined;\n  private _lastMouseEvent: MouseEvent | undefined;\n  private _linkCacheDisposables: IDisposable[] = [];\n  private _lastBufferCell: IBufferCellPosition | undefined;\n  private _isMouseOut: boolean = true;\n  private _wasResized: boolean = false;\n  private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n  private _activeLine: number = -1;\n\n  private readonly _onShowLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n  public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;\n  private readonly _onHideLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n  public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n    super();\n    this.register(getDisposeArrayDisposable(this._linkCacheDisposables));\n    this.register(toDisposable(() => {\n      this._lastMouseEvent = undefined;\n    }));\n    // Listen to resize to catch the case where it's resized and the cursor is out of the viewport.\n    this.register(this._bufferService.onResize(() => {\n      this._clearCurrentLink();\n      this._wasResized = true;\n    }));\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    this._linkProviders.push(linkProvider);\n    return {\n      dispose: () => {\n        // Remove the link provider from the list\n        const providerIndex = this._linkProviders.indexOf(linkProvider);\n\n        if (providerIndex !== -1) {\n          this._linkProviders.splice(providerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void {\n    this._element = element;\n    this._mouseService = mouseService;\n    this._renderService = renderService;\n\n    this.register(addDisposableDomListener(this._element, 'mouseleave', () => {\n      this._isMouseOut = true;\n      this._clearCurrentLink();\n    }));\n    this.register(addDisposableDomListener(this._element, 'mousemove', this._handleMouseMove.bind(this)));\n    this.register(addDisposableDomListener(this._element, 'mousedown', this._handleMouseDown.bind(this)));\n    this.register(addDisposableDomListener(this._element, 'mouseup', this._handleMouseUp.bind(this)));\n  }\n\n  private _handleMouseMove(event: MouseEvent): void {\n    this._lastMouseEvent = event;\n\n    if (!this._element || !this._mouseService) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n    if (!position) {\n      return;\n    }\n    this._isMouseOut = false;\n\n    // Ignore the event if it's an embedder created hover widget\n    const composedPath = event.composedPath() as HTMLElement[];\n    for (let i = 0; i < composedPath.length; i++) {\n      const target = composedPath[i];\n      // Hit Terminal.element, break and continue\n      if (target.classList.contains('xterm')) {\n        break;\n      }\n      // It's a hover, don't respect hover event\n      if (target.classList.contains('xterm-hover')) {\n        return;\n      }\n    }\n\n    if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n      this._handleHover(position);\n      this._lastBufferCell = position;\n    }\n  }\n\n  private _handleHover(position: IBufferCellPosition): void {\n    // TODO: This currently does not cache link provider results across wrapped lines, activeLine\n    //       should be something like `activeRange: {startY, endY}`\n    // Check if we need to clear the link\n    if (this._activeLine !== position.y || this._wasResized) {\n      this._clearCurrentLink();\n      this._askForLink(position, false);\n      this._wasResized = false;\n      return;\n    }\n\n    // Check the if the link is in the mouse position\n    const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n    if (!isCurrentLinkInPosition) {\n      this._clearCurrentLink();\n      this._askForLink(position, true);\n    }\n  }\n\n  private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n    if (!this._activeProviderReplies || !useLineCache) {\n      this._activeProviderReplies?.forEach(reply => {\n        reply?.forEach(linkWithState => {\n          if (linkWithState.link.dispose) {\n            linkWithState.link.dispose();\n          }\n        });\n      });\n      this._activeProviderReplies = new Map();\n      this._activeLine = position.y;\n    }\n    let linkProvided = false;\n\n    // There is no link cached, so ask for one\n    for (const [i, linkProvider] of this._linkProviders.entries()) {\n      if (useLineCache) {\n        const existingReply = this._activeProviderReplies?.get(i);\n        // If there isn't a reply, the provider hasn't responded yet.\n\n        // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n        // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n        // needs promises to get fixed\n        if (existingReply) {\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n        }\n      } else {\n        linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n          if (this._isMouseOut) {\n            return;\n          }\n          const linksWithState: ILinkWithState[] | undefined = links?.map(link  => ({ link }));\n          this._activeProviderReplies?.set(i, linksWithState);\n          linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n          // If all providers have responded, remove lower priority links that intersect ranges of\n          // higher priority links\n          if (this._activeProviderReplies?.size === this._linkProviders.length) {\n            this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n          }\n        });\n      }\n    }\n  }\n\n  private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n    const occupiedCells = new Set<number>();\n    for (let i = 0; i < replies.size; i++) {\n      const providerReply = replies.get(i);\n      if (!providerReply) {\n        continue;\n      }\n      for (let i = 0; i < providerReply.length; i++) {\n        const linkWithState = providerReply[i];\n        const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n        const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n        for (let x = startX; x <= endX; x++) {\n          if (occupiedCells.has(x)) {\n            providerReply.splice(i--, 1);\n            break;\n          }\n          occupiedCells.add(x);\n        }\n      }\n    }\n  }\n\n  private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n    if (!this._activeProviderReplies) {\n      return linkProvided;\n    }\n\n    const links = this._activeProviderReplies.get(index);\n\n    // Check if every provider before this one has come back undefined\n    let hasLinkBefore = false;\n    for (let j = 0; j < index; j++) {\n      if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n        hasLinkBefore = true;\n      }\n    }\n\n    // If all providers with higher priority came back undefined, then this provider's link for\n    // the position should be used\n    if (!hasLinkBefore && links) {\n      const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n      if (linkAtPosition) {\n        linkProvided = true;\n        this._handleNewLink(linkAtPosition);\n      }\n    }\n\n    // Check if all the providers have responded\n    if (this._activeProviderReplies.size === this._linkProviders.length && !linkProvided) {\n      // Respect the order of the link providers\n      for (let j = 0; j < this._activeProviderReplies.size; j++) {\n        const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n        if (currentLink) {\n          linkProvided = true;\n          this._handleNewLink(currentLink);\n          break;\n        }\n      }\n    }\n\n    return linkProvided;\n  }\n\n  private _handleMouseDown(): void {\n    this._mouseDownLink = this._currentLink;\n  }\n\n  private _handleMouseUp(event: MouseEvent): void {\n    if (!this._element || !this._mouseService || !this._currentLink) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n    if (!position) {\n      return;\n    }\n\n    if (this._mouseDownLink === this._currentLink && this._linkAtPosition(this._currentLink.link, position)) {\n      this._currentLink.link.activate(event, this._currentLink.link.text);\n    }\n  }\n\n  private _clearCurrentLink(startRow?: number, endRow?: number): void {\n    if (!this._element || !this._currentLink || !this._lastMouseEvent) {\n      return;\n    }\n\n    // If we have a start and end row, check that the link is within it\n    if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n      this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n      this._currentLink = undefined;\n      disposeArray(this._linkCacheDisposables);\n    }\n  }\n\n  private _handleNewLink(linkWithState: ILinkWithState): void {\n    if (!this._element || !this._lastMouseEvent || !this._mouseService) {\n      return;\n    }\n\n    const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService);\n\n    if (!position) {\n      return;\n    }\n\n    // Trigger hover if the we have a link at the position\n    if (this._linkAtPosition(linkWithState.link, position)) {\n      this._currentLink = linkWithState;\n      this._currentLink.state = {\n        decorations: {\n          underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n          pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n        },\n        isHovered: true\n      };\n      this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n      // Add listener for tracking decorations changes\n      linkWithState.link.decorations = {} as ILinkDecorations;\n      Object.defineProperties(linkWithState.link.decorations, {\n        pointerCursor: {\n          get: () => this._currentLink?.state?.decorations.pointerCursor,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n              this._currentLink.state.decorations.pointerCursor = v;\n              if (this._currentLink.state.isHovered) {\n                this._element?.classList.toggle('xterm-cursor-pointer', v);\n              }\n            }\n          }\n        },\n        underline: {\n          get: () => this._currentLink?.state?.decorations.underline,\n          set: v => {\n            if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n              this._currentLink.state.decorations.underline = v;\n              if (this._currentLink.state.isHovered) {\n                this._fireUnderlineEvent(linkWithState.link, v);\n              }\n            }\n          }\n        }\n      });\n\n      // Listen to viewport changes to re-render the link under the cursor (only when the line the\n      // link is on changes)\n      if (this._renderService) {\n        this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange(e => {\n          // Sanity check, this shouldn't happen in practice as this listener would be disposed\n          if (!this._currentLink) {\n            return;\n          }\n          // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n          // cleared.\n          const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n          const end = this._bufferService.buffer.ydisp + 1 + e.end;\n          // Only clear the link if the viewport change happened on this line\n          if (this._currentLink.link.range.start.y >= start && this._currentLink.link.range.end.y <= end) {\n            this._clearCurrentLink(start, end);\n            if (this._lastMouseEvent && this._element) {\n              // re-eval previously active link after changes\n              const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService!);\n              if (position) {\n                this._askForLink(position, false);\n              }\n            }\n          }\n        }));\n      }\n    }\n  }\n\n  protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = true;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, true);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.add('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.hover) {\n      link.hover(event, link.text);\n    }\n  }\n\n  private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n    const range = link.range;\n    const scrollOffset = this._bufferService.buffer.ydisp;\n    const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n    const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n    emitter.fire(event);\n  }\n\n  protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n    if (this._currentLink?.state) {\n      this._currentLink.state.isHovered = false;\n      if (this._currentLink.state.decorations.underline) {\n        this._fireUnderlineEvent(link, false);\n      }\n      if (this._currentLink.state.decorations.pointerCursor) {\n        element.classList.remove('xterm-cursor-pointer');\n      }\n    }\n\n    if (link.leave) {\n      link.leave(event, link.text);\n    }\n  }\n\n  /**\n   * Check if the buffer position is within the link\n   * @param link\n   * @param position\n   */\n  private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n    const lower = link.range.start.y * this._bufferService.cols + link.range.start.x;\n    const upper = link.range.end.y * this._bufferService.cols + link.range.end.x;\n    const current = position.y * this._bufferService.cols + position.x;\n    return (lower <= current && current <= upper);\n  }\n\n  /**\n   * Get the buffer position from a mouse event\n   * @param event\n   */\n  private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined {\n    const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n    if (!coords) {\n      return;\n    }\n\n    return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n  }\n\n  private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n    return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// This file contains strings that get exported in the API so they can be localized\n\n// eslint-disable-next-line prefer-const\nexport let promptLabel = 'Terminal input';\n\n// eslint-disable-next-line prefer-const\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILink, ILinkProvider } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services';\n\nexport class OscLinkProvider implements ILinkProvider {\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IOscLinkService private readonly _oscLinkService: IOscLinkService\n  ) {\n  }\n\n  public provideLinks(y: number, callback: (links: ILink[] | undefined) => void): void {\n    const line = this._bufferService.buffer.lines.get(y - 1);\n    if (!line) {\n      callback(undefined);\n      return;\n    }\n\n    const result: ILink[] = [];\n    const linkHandler = this._optionsService.rawOptions.linkHandler;\n    const cell = new CellData();\n    const lineLength = line.getTrimmedLength();\n    let currentLinkId = -1;\n    let currentStart = -1;\n    let finishLink = false;\n    for (let x = 0; x < lineLength; x++) {\n      // Minor optimization, only check for content if there isn't a link in case the link ends with\n      // a null cell\n      if (currentStart === -1 && !line.hasContent(x)) {\n        continue;\n      }\n\n      line.loadCell(x, cell);\n      if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n        if (currentStart === -1) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n          continue;\n        } else {\n          finishLink = cell.extended.urlId !== currentLinkId;\n        }\n      } else {\n        if (currentStart !== -1) {\n          finishLink = true;\n        }\n      }\n\n      if (finishLink || (currentStart !== -1 && x === lineLength - 1)) {\n        const text = this._oscLinkService.getLinkData(currentLinkId)?.uri;\n        if (text) {\n          // These ranges are 1-based\n          const range: IBufferRange = {\n            start: {\n              x: currentStart + 1,\n              y\n            },\n            end: {\n              // Offset end x if it's a link that ends on the last cell in the line\n              x: x + (!finishLink && x === lineLength - 1 ? 1 : 0),\n              y\n            }\n          };\n\n          let ignoreLink = false;\n          if (!linkHandler?.allowNonHttpProtocols) {\n            try {\n              const parsed = new URL(text);\n              if (!['http:', 'https:'].includes(parsed.protocol)) {\n                ignoreLink = true;\n              }\n            } catch (e) {\n              // Ignore invalid URLs to prevent unexpected behaviors\n              ignoreLink = true;\n            }\n          }\n\n          if (!ignoreLink) {\n            // OSC links always use underline and pointer decorations\n            result.push({\n              text,\n              range,\n              activate: (e, text) => (linkHandler ? linkHandler.activate(e, text, range) : defaultActivate(e, text)),\n              hover: (e, text) => linkHandler?.hover?.(e, text, range),\n              leave: (e, text) => linkHandler?.leave?.(e, text, range)\n            });\n          }\n        }\n        finishLink = false;\n\n        // Clear link or start a new link if one starts immediately\n        if (cell.hasExtendedAttrs() && cell.extended.urlId) {\n          currentStart = x;\n          currentLinkId = cell.extended.urlId;\n        } else {\n          currentStart = -1;\n          currentLinkId = -1;\n        }\n      }\n    }\n\n    // TODO: Handle fetching and returning other link ranges to underline other links with the same\n    //       id\n    callback(result);\n  }\n}\n\nfunction defaultActivate(e: MouseEvent, uri: string): void {\n  const answer = confirm(`Do you want to navigate to ${uri}?\\n\\nWARNING: This link could potentially be dangerous`);\n  if (answer) {\n    const newWindow = window.open();\n    if (newWindow) {\n      try {\n        newWindow.opener = null;\n      } catch {\n        // no-op, Electron can throw\n      }\n      newWindow.location.href = uri;\n    } else {\n      console.warn('Opening link blocked as opener could not be cleared');\n    }\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IRenderDebouncerWithCallback {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n  private _animationFrame: number | undefined;\n  private _refreshCallbacks: FrameRequestCallback[] = [];\n\n  constructor(\n    private _parentWindow: Window,\n    private _renderCallback: (start: number, end: number) => void\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._animationFrame) {\n      this._parentWindow.cancelAnimationFrame(this._animationFrame);\n      this._animationFrame = undefined;\n    }\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    this._refreshCallbacks.push(callback);\n    if (!this._animationFrame) {\n      this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n    }\n    return this._animationFrame;\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart !== undefined ? rowStart : 0;\n    rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    if (this._animationFrame) {\n      return;\n    }\n\n    this._animationFrame = this._parentWindow.requestAnimationFrame(() => this._innerRefresh());\n  }\n\n  private _innerRefresh(): void {\n    this._animationFrame = undefined;\n\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      this._runRefreshCallbacks();\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n    this._runRefreshCallbacks();\n  }\n\n  private _runRefreshCallbacks(): void {\n    for (const callback of this._refreshCallbacks) {\n      callback(0);\n    }\n    this._refreshCallbacks = [];\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable, toDisposable } from 'common/Lifecycle';\n\nexport type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRatio?: number) => void;\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nexport class ScreenDprMonitor extends Disposable {\n  private _currentDevicePixelRatio: number;\n  private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n  private _listener: ScreenDprListener | undefined;\n  private _resolutionMediaMatchList: MediaQueryList | undefined;\n\n  constructor(private _parentWindow: Window) {\n    super();\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this.register(toDisposable(() => {\n      this.clearListener();\n    }));\n  }\n\n  public setListener(listener: ScreenDprListener): void {\n    if (this._listener) {\n      this.clearListener();\n    }\n    this._listener = listener;\n    this._outerListener = () => {\n      if (!this._listener) {\n        return;\n      }\n      this._listener(this._parentWindow.devicePixelRatio, this._currentDevicePixelRatio);\n      this._updateDpr();\n    };\n    this._updateDpr();\n  }\n\n  private _updateDpr(): void {\n    if (!this._outerListener) {\n      return;\n    }\n\n    // Clear listeners for old DPR\n    this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n    // Add listeners for new DPR\n    this._currentDevicePixelRatio = this._parentWindow.devicePixelRatio;\n    this._resolutionMediaMatchList = this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`);\n    this._resolutionMediaMatchList.addListener(this._outerListener);\n  }\n\n  public clearListener(): void {\n    if (!this._resolutionMediaMatchList || !this._listener || !this._outerListener) {\n      return;\n    }\n    this._resolutionMediaMatchList.removeListener(this._outerListener);\n    this._resolutionMediaMatchList = undefined;\n    this._listener = undefined;\n    this._outerListener = undefined;\n  }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from 'browser/Clipboard';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Linkifier2 } from 'browser/Linkifier2';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { OscLinkProvider } from 'browser/OscLinkProvider';\nimport { CharacterJoinerHandler, CustomKeyEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal, IViewport } from 'browser/Types';\nimport { Viewport } from 'browser/Viewport';\nimport { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer';\nimport { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { IRenderer } from 'browser/renderer/shared/Types';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { CharacterJoinerService } from 'browser/services/CharacterJoinerService';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { MouseService } from 'browser/services/MouseService';\nimport { RenderService } from 'browser/services/RenderService';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services';\nimport { ThemeService } from 'browser/services/ThemeService';\nimport { color, rgba } from 'common/Color';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport * as Browser from 'common/Platform';\nimport { ColorRequestType, CoreMouseAction, CoreMouseButton, CoreMouseEventType, IColorEvent, ITerminalOptions, KeyboardResultType, ScrollSource, SpecialColorIndex } from 'common/Types';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { IBuffer } from 'common/buffer/Types';\nimport { C0, C1_ESCAPED } from 'common/data/EscapeSequences';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { toRgbString } from 'common/input/XParseColor';\nimport { DecorationService } from 'common/services/DecorationService';\nimport { IDecorationService } from 'common/services/Services';\nimport { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker } from 'xterm';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { AccessibilityManager } from './AccessibilityManager';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document: Document = (typeof window !== 'undefined') ? window.document : null as any;\n\nexport class Terminal extends CoreTerminal implements ITerminal {\n  public textarea: HTMLTextAreaElement | undefined;\n  public element: HTMLElement | undefined;\n  public screenElement: HTMLElement | undefined;\n\n  private _document: Document | undefined;\n  private _viewportScrollArea: HTMLElement | undefined;\n  private _viewportElement: HTMLElement | undefined;\n  private _helperContainer: HTMLElement | undefined;\n  private _compositionView: HTMLElement | undefined;\n\n  private _overviewRulerRenderer: OverviewRulerRenderer | undefined;\n\n  public browser: IBrowser = Browser as any;\n\n  private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n  // browser services\n  private _decorationService: DecorationService;\n  private _charSizeService: ICharSizeService | undefined;\n  private _coreBrowserService: ICoreBrowserService | undefined;\n  private _mouseService: IMouseService | undefined;\n  private _renderService: IRenderService | undefined;\n  private _themeService: IThemeService | undefined;\n  private _characterJoinerService: ICharacterJoinerService | undefined;\n  private _selectionService: ISelectionService | undefined;\n\n  /**\n   * Records whether the keydown event has already been handled and triggered a data event, if so\n   * the keypress event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyDownHandled: boolean = false;\n\n  /**\n   * Records whether a keydown event has occured since the last keyup event, i.e. whether a key\n   * is currently \"pressed\".\n   */\n  private _keyDownSeen: boolean = false;\n\n  /**\n   * Records whether the keypress event has already been handled and triggered a data event, if so\n   * the input event should not trigger a data event but should still print to the textarea so\n   * screen readers will announce it.\n   */\n  private _keyPressHandled: boolean = false;\n\n  /**\n   * Records whether there has been a keydown event for a dead key without a corresponding keydown\n   * event for the composed/alternative character. If we cancel the keydown event for the dead key,\n   * no events will be emitted for the final character.\n   */\n  private _unprocessedDeadKey: boolean = false;\n\n  public linkifier2: ILinkifier2;\n  public viewport: IViewport | undefined;\n  private _compositionHelper: ICompositionHelper | undefined;\n  private _accessibilityManager: MutableDisposable<AccessibilityManager> = this.register(new MutableDisposable());\n\n  private readonly _onCursorMove = this.register(new EventEmitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onKey = this.register(new EventEmitter<{ key: string, domEvent: KeyboardEvent }>());\n  public readonly onKey = this._onKey.event;\n  private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onSelectionChange = this.register(new EventEmitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onTitleChange = this.register(new EventEmitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onBell = this.register(new EventEmitter<void>());\n  public readonly onBell = this._onBell.event;\n\n  private _onFocus = this.register(new EventEmitter<void>());\n  public get onFocus(): IEvent<void> { return this._onFocus.event; }\n  private _onBlur = this.register(new EventEmitter<void>());\n  public get onBlur(): IEvent<void> { return this._onBlur.event; }\n  private _onA11yCharEmitter = this.register(new EventEmitter<string>());\n  public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n  private _onA11yTabEmitter = this.register(new EventEmitter<number>());\n  public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n  private _onWillOpen = this.register(new EventEmitter<HTMLElement>());\n  public get onWillOpen(): IEvent<HTMLElement> { return this._onWillOpen.event; }\n\n  constructor(\n    options: Partial<ITerminalOptions> = {}\n  ) {\n    super(options);\n\n    this._setup();\n\n    this.linkifier2 = this.register(this._instantiationService.createInstance(Linkifier2));\n    this.linkifier2.registerLinkProvider(this._instantiationService.createInstance(OscLinkProvider));\n    this._decorationService = this._instantiationService.createInstance(DecorationService);\n    this._instantiationService.setService(IDecorationService, this._decorationService);\n\n    // Setup InputHandler listeners\n    this.register(this._inputHandler.onRequestBell(() => this._onBell.fire()));\n    this.register(this._inputHandler.onRequestRefreshRows((start, end) => this.refresh(start, end)));\n    this.register(this._inputHandler.onRequestSendFocus(() => this._reportFocus()));\n    this.register(this._inputHandler.onRequestReset(() => this.reset()));\n    this.register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n    this.register(this._inputHandler.onColor((event) => this._handleColorEvent(event)));\n    this.register(forwardEvent(this._inputHandler.onCursorMove, this._onCursorMove));\n    this.register(forwardEvent(this._inputHandler.onTitleChange, this._onTitleChange));\n    this.register(forwardEvent(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n    this.register(forwardEvent(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n    // Setup listeners\n    this.register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n\n    this.register(toDisposable(() => {\n      this._customKeyEventHandler = undefined;\n      this.element?.parentNode?.removeChild(this.element);\n    }));\n  }\n\n  /**\n   * Handle color event from inputhandler for OSC 4|104 | 10|110 | 11|111 | 12|112.\n   * An event from OSC 4|104 may contain multiple set or report requests, and multiple\n   * or none restore requests (resetting all),\n   * while an event from OSC 10|110 | 11|111 | 12|112 always contains a single request.\n   */\n  private _handleColorEvent(event: IColorEvent): void {\n    if (!this._themeService) return;\n    for (const req of event) {\n      let acc: 'foreground' | 'background' | 'cursor' | 'ansi';\n      let ident = '';\n      switch (req.index) {\n        case SpecialColorIndex.FOREGROUND: // OSC 10 | 110\n          acc = 'foreground';\n          ident = '10';\n          break;\n        case SpecialColorIndex.BACKGROUND: // OSC 11 | 111\n          acc = 'background';\n          ident = '11';\n          break;\n        case SpecialColorIndex.CURSOR: // OSC 12 | 112\n          acc = 'cursor';\n          ident = '12';\n          break;\n        default: // OSC 4 | 104\n          // we can skip the [0..255] range check here (already done in inputhandler)\n          acc = 'ansi';\n          ident = '4;' + req.index;\n      }\n      switch (req.type) {\n        case ColorRequestType.REPORT:\n          const channels = color.toColorRGB(acc === 'ansi'\n            ? this._themeService.colors.ansi[req.index]\n            : this._themeService.colors[acc]);\n          this.coreService.triggerDataEvent(`${C0.ESC}]${ident};${toRgbString(channels)}${C1_ESCAPED.ST}`);\n          break;\n        case ColorRequestType.SET:\n          if (acc === 'ansi') {\n            this._themeService.modifyColors(colors => colors.ansi[req.index] = rgba.toColor(...req.color));\n          } else {\n            const narrowedAcc = acc;\n            this._themeService.modifyColors(colors => colors[narrowedAcc] = rgba.toColor(...req.color));\n          }\n          break;\n        case ColorRequestType.RESTORE:\n          this._themeService.restoreColor(req.index);\n          break;\n      }\n    }\n  }\n\n  protected _setup(): void {\n    super._setup();\n\n    this._customKeyEventHandler = undefined;\n  }\n\n  /**\n   * Convenience property to active buffer.\n   */\n  public get buffer(): IBuffer {\n    return this.buffers.active;\n  }\n\n  /**\n   * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n   */\n  public focus(): void {\n    if (this.textarea) {\n      this.textarea.focus({ preventScroll: true });\n    }\n  }\n\n  private _handleScreenReaderModeOptionChange(value: boolean): void {\n    if (value) {\n      if (!this._accessibilityManager.value && this._renderService) {\n        this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n      }\n    } else {\n      this._accessibilityManager.clear();\n    }\n  }\n\n  /**\n   * Binds the desired focus behavior on a given terminal object.\n   */\n  private _handleTextAreaFocus(ev: KeyboardEvent): void {\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    }\n    this.updateCursorStyle(ev);\n    this.element!.classList.add('focus');\n    this._showCursor();\n    this._onFocus.fire();\n  }\n\n  /**\n   * Blur the terminal, calling the blur function on the terminal's underlying\n   * textarea.\n   */\n  public blur(): void {\n    return this.textarea?.blur();\n  }\n\n  /**\n   * Binds the desired blur behavior on a given terminal object.\n   */\n  private _handleTextAreaBlur(): void {\n    // Text can safely be removed on blur. Doing it earlier could interfere with\n    // screen readers reading it out.\n    this.textarea!.value = '';\n    this.refresh(this.buffer.y, this.buffer.y);\n    if (this.coreService.decPrivateModes.sendFocus) {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n    this.element!.classList.remove('focus');\n    this._onBlur.fire();\n  }\n\n  private _syncTextArea(): void {\n    if (!this.textarea || !this.buffer.isCursorInViewport || this._compositionHelper!.isComposing || !this._renderService) {\n      return;\n    }\n    const cursorY = this.buffer.ybase + this.buffer.y;\n    const bufferLine = this.buffer.lines.get(cursorY);\n    if (!bufferLine) {\n      return;\n    }\n    const cursorX = Math.min(this.buffer.x, this.cols - 1);\n    const cellHeight = this._renderService.dimensions.css.cell.height;\n    const width = bufferLine.getWidth(cursorX);\n    const cellWidth = this._renderService.dimensions.css.cell.width * width;\n    const cursorTop = this.buffer.y * this._renderService.dimensions.css.cell.height;\n    const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n    // Sync the textarea to the exact position of the composition view so the IME knows where the\n    // text is.\n    this.textarea.style.left = cursorLeft + 'px';\n    this.textarea.style.top = cursorTop + 'px';\n    this.textarea.style.width = cellWidth + 'px';\n    this.textarea.style.height = cellHeight + 'px';\n    this.textarea.style.lineHeight = cellHeight + 'px';\n    this.textarea.style.zIndex = '-5';\n  }\n\n  /**\n   * Initialize default behavior\n   */\n  private _initGlobal(): void {\n    this._bindKeys();\n\n    // Bind clipboard functionality\n    this.register(addDisposableDomListener(this.element!, 'copy', (event: ClipboardEvent) => {\n      // If mouse events are active it means the selection manager is disabled and\n      // copy should be handled by the host program.\n      if (!this.hasSelection()) {\n        return;\n      }\n      copyHandler(event, this._selectionService!);\n    }));\n    const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this.coreService, this.optionsService);\n    this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));\n    this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));\n\n    // Handle right click context menus\n    if (Browser.isFirefox) {\n      // Firefox doesn't appear to fire the contextmenu event on right click\n      this.register(addDisposableDomListener(this.element!, 'mousedown', (event: MouseEvent) => {\n        if (event.button === 2) {\n          rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n        }\n      }));\n    } else {\n      this.register(addDisposableDomListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n        rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n      }));\n    }\n\n    // Move the textarea under the cursor when middle clicking on Linux to ensure\n    // middle click to paste selection works. This only appears to work in Chrome\n    // at the time is writing.\n    if (Browser.isLinux) {\n      // Use auxclick event over mousedown the latter doesn't seem to work. Note\n      // that the regular click event doesn't fire for the middle mouse button.\n      this.register(addDisposableDomListener(this.element!, 'auxclick', (event: MouseEvent) => {\n        if (event.button === 1) {\n          moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n        }\n      }));\n    }\n  }\n\n  /**\n   * Apply key handling to the terminal\n   */\n  private _bindKeys(): void {\n    this.register(addDisposableDomListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart()));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n    this.register(addDisposableDomListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n    this.register(addDisposableDomListener(this.textarea!, 'input', (ev: InputEvent) => this._inputEvent(ev), true));\n    this.register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n  }\n\n  /**\n   * Opens the terminal within an element.\n   *\n   * @param parent The element to create the terminal within.\n   */\n  public open(parent: HTMLElement): void {\n    if (!parent) {\n      throw new Error('Terminal requires a parent element.');\n    }\n\n    if (!parent.isConnected) {\n      this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n    }\n\n    this._document = parent.ownerDocument!;\n\n    // Create main element container\n    this.element = this._document.createElement('div');\n    this.element.dir = 'ltr';   // xterm.css assumes LTR\n    this.element.classList.add('terminal');\n    this.element.classList.add('xterm');\n    parent.appendChild(this.element);\n\n    // Performance: Use a document fragment to build the terminal\n    // viewport and helper elements detached from the DOM\n    const fragment = document.createDocumentFragment();\n    this._viewportElement = document.createElement('div');\n    this._viewportElement.classList.add('xterm-viewport');\n    fragment.appendChild(this._viewportElement);\n\n    this._viewportScrollArea = document.createElement('div');\n    this._viewportScrollArea.classList.add('xterm-scroll-area');\n    this._viewportElement.appendChild(this._viewportScrollArea);\n\n    this.screenElement = document.createElement('div');\n    this.screenElement.classList.add('xterm-screen');\n    // Create the container that will hold helpers like the textarea for\n    // capturing DOM Events. Then produce the helpers.\n    this._helperContainer = document.createElement('div');\n    this._helperContainer.classList.add('xterm-helpers');\n    this.screenElement.appendChild(this._helperContainer);\n    fragment.appendChild(this.screenElement);\n\n    this.textarea = document.createElement('textarea');\n    this.textarea.classList.add('xterm-helper-textarea');\n    this.textarea.setAttribute('aria-label', Strings.promptLabel);\n    if (!Browser.isChromeOS) {\n      // ChromeVox on ChromeOS does not like this. See\n      // https://issuetracker.google.com/issues/260170397\n      this.textarea.setAttribute('aria-multiline', 'false');\n    }\n    this.textarea.setAttribute('autocorrect', 'off');\n    this.textarea.setAttribute('autocapitalize', 'off');\n    this.textarea.setAttribute('spellcheck', 'false');\n    this.textarea.tabIndex = 0;\n\n    // Register the core browser service before the generic textarea handlers are registered so it\n    // handles them first. Otherwise the renderers may use the wrong focus state.\n    this._coreBrowserService = this._instantiationService.createInstance(CoreBrowserService, this.textarea, this._document.defaultView ?? window);\n    this._instantiationService.setService(ICoreBrowserService, this._coreBrowserService);\n\n    this.register(addDisposableDomListener(this.textarea, 'focus', (ev: KeyboardEvent) => this._handleTextAreaFocus(ev)));\n    this.register(addDisposableDomListener(this.textarea, 'blur', () => this._handleTextAreaBlur()));\n    this._helperContainer.appendChild(this.textarea);\n\n\n    this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n    this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n    this._themeService = this._instantiationService.createInstance(ThemeService);\n    this._instantiationService.setService(IThemeService, this._themeService);\n\n    this._characterJoinerService = this._instantiationService.createInstance(CharacterJoinerService);\n    this._instantiationService.setService(ICharacterJoinerService, this._characterJoinerService);\n\n    this._renderService = this.register(this._instantiationService.createInstance(RenderService, this.rows, this.screenElement));\n    this._instantiationService.setService(IRenderService, this._renderService);\n    this.register(this._renderService.onRenderedViewportChange(e => this._onRender.fire(e)));\n    this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n    this._compositionView = document.createElement('div');\n    this._compositionView.classList.add('composition-view');\n    this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n    this._helperContainer.appendChild(this._compositionView);\n\n    // Performance: Add viewport and helper elements from the fragment\n    this.element.appendChild(fragment);\n\n    try {\n      this._onWillOpen.fire(this.element);\n    }\n    catch { /* fails to load addon for some reason */ }\n    if (!this._renderService.hasRenderer()) {\n      this._renderService.setRenderer(this._createRenderer());\n    }\n\n    this._mouseService = this._instantiationService.createInstance(MouseService);\n    this._instantiationService.setService(IMouseService, this._mouseService);\n\n    this.viewport = this._instantiationService.createInstance(Viewport, this._viewportElement, this._viewportScrollArea);\n    this.viewport.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent, ScrollSource.VIEWPORT)),\n    this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport!.syncScrollArea()));\n    this.register(this.viewport);\n\n    this.register(this.onCursorMove(() => {\n      this._renderService!.handleCursorMove();\n      this._syncTextArea();\n    }));\n    this.register(this.onResize(() => this._renderService!.handleResize(this.cols, this.rows)));\n    this.register(this.onBlur(() => this._renderService!.handleBlur()));\n    this.register(this.onFocus(() => this._renderService!.handleFocus()));\n    this.register(this._renderService.onDimensionsChange(() => this.viewport!.syncScrollArea()));\n\n    this._selectionService = this.register(this._instantiationService.createInstance(SelectionService,\n      this.element,\n      this.screenElement,\n      this.linkifier2\n    ));\n    this._instantiationService.setService(ISelectionService, this._selectionService);\n    this.register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n    this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n    this.register(this._selectionService.onRequestRedraw(e => this._renderService!.handleSelectionChanged(e.start, e.end, e.columnSelectMode)));\n    this.register(this._selectionService.onLinuxMouseSelection(text => {\n      // If there's a new selection, put it into the textarea, focus and select it\n      // in order to register it as a selection on the OS. This event is fired\n      // only on Linux to enable middle click to paste selection.\n      this.textarea!.value = text;\n      this.textarea!.focus();\n      this.textarea!.select();\n    }));\n    this.register(this._onScroll.event(ev => {\n      this.viewport!.syncScrollArea();\n      this._selectionService!.refresh();\n    }));\n    this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));\n\n    this.linkifier2.attachToDom(this.screenElement, this._mouseService, this._renderService);\n    this.register(this._instantiationService.createInstance(BufferDecorationRenderer, this.screenElement));\n    this.register(addDisposableDomListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.handleMouseDown(e)));\n\n    // apply mouse event classes set by escape codes before terminal was attached\n    if (this.coreMouseService.areMouseEventsActive) {\n      this._selectionService.disable();\n      this.element.classList.add('enable-mouse-events');\n    } else {\n      this._selectionService.enable();\n    }\n\n    if (this.options.screenReaderMode) {\n      // Note that this must be done *after* the renderer is created in order to\n      // ensure the correct order of the dprchange event\n      this._accessibilityManager.value = this._instantiationService.createInstance(AccessibilityManager, this);\n    }\n    this.register(this.optionsService.onSpecificOptionChange('screenReaderMode', e => this._handleScreenReaderModeOptionChange(e)));\n\n    if (this.options.overviewRulerWidth) {\n      this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n    }\n    this.optionsService.onSpecificOptionChange('overviewRulerWidth', value => {\n      if (!this._overviewRulerRenderer && value && this._viewportElement && this.screenElement) {\n        this._overviewRulerRenderer = this.register(this._instantiationService.createInstance(OverviewRulerRenderer, this._viewportElement, this.screenElement));\n      }\n    });\n    // Measure the character size\n    this._charSizeService.measure();\n\n    // Setup loop that draws to screen\n    this.refresh(0, this.rows - 1);\n\n    // Initialize global actions that need to be taken on the document.\n    this._initGlobal();\n\n    // Listen for mouse events and translate\n    // them into terminal mouse protocols.\n    this.bindMouse();\n  }\n\n  private _createRenderer(): IRenderer {\n    return this._instantiationService.createInstance(DomRenderer, this.element!, this.screenElement!, this._viewportElement!, this.linkifier2);\n  }\n\n  /**\n   * Bind certain mouse events to the terminal.\n   * By default only 3 button + wheel up/down is ativated. For higher buttons\n   * no mouse report will be created. Typically the standard actions will be active.\n   *\n   * There are several reasons not to enable support for higher buttons/wheel:\n   * - Button 4 and 5 are typically used for history back and forward navigation,\n   *   there is no straight forward way to supress/intercept those standard actions.\n   * - Support for higher buttons does not work in some platform/browser combinations.\n   * - Left/right wheel was not tested.\n   * - Emulators vary in mouse button support, typically only 3 buttons and\n   *   wheel up/down work reliable.\n   *\n   * TODO: Move mouse event code into its own file.\n   */\n  public bindMouse(): void {\n    const self = this;\n    const el = this.element!;\n\n    // send event to CoreMouseService\n    function sendEvent(ev: MouseEvent | WheelEvent): boolean {\n      // get mouse coordinates\n      const pos = self._mouseService!.getMouseReportCoords(ev, self.screenElement!);\n      if (!pos) {\n        return false;\n      }\n\n      let but: CoreMouseButton;\n      let action: CoreMouseAction | undefined;\n      switch ((ev as any).overrideType || ev.type) {\n        case 'mousemove':\n          action = CoreMouseAction.MOVE;\n          if (ev.buttons === undefined) {\n            // buttons is not supported on macOS, try to get a value from button instead\n            but = CoreMouseButton.NONE;\n            if (ev.button !== undefined) {\n              but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n            }\n          } else {\n            // according to MDN buttons only reports up to button 5 (AUX2)\n            but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n              ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n                ev.buttons & 2 ? CoreMouseButton.RIGHT :\n                  CoreMouseButton.NONE; // fallback to NONE\n          }\n          break;\n        case 'mouseup':\n          action = CoreMouseAction.UP;\n          but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n          break;\n        case 'mousedown':\n          action = CoreMouseAction.DOWN;\n          but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n          break;\n        case 'wheel':\n          const amount = self.viewport!.getLinesScrolled(ev as WheelEvent);\n\n          if (amount === 0) {\n            return false;\n          }\n\n          action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n          but = CoreMouseButton.WHEEL;\n          break;\n        default:\n          // dont handle other event types by accident\n          return false;\n      }\n\n      // exit if we cannot determine valid button/action values\n      // do nothing for higher buttons than wheel\n      if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n        return false;\n      }\n\n      return self.coreMouseService.triggerMouseEvent({\n        col: pos.col,\n        row: pos.row,\n        x: pos.x,\n        y: pos.y,\n        button: but,\n        action,\n        ctrl: ev.ctrlKey,\n        alt: ev.altKey,\n        shift: ev.shiftKey\n      });\n    }\n\n    /**\n     * Event listener state handling.\n     * We listen to the onProtocolChange event of CoreMouseService and put\n     * requested listeners in `requestedEvents`. With this the listeners\n     * have all bits to do the event listener juggling.\n     * Note: 'mousedown' currently is \"always on\" and not managed\n     * by onProtocolChange.\n     */\n    const requestedEvents: { [key: string]: ((ev: Event) => void) | null } = {\n      mouseup: null,\n      wheel: null,\n      mousedrag: null,\n      mousemove: null\n    };\n    const eventListeners: { [key: string]: (ev: any) => void | boolean } = {\n      mouseup: (ev: MouseEvent) => {\n        sendEvent(ev);\n        if (!ev.buttons) {\n          // if no other button is held remove global handlers\n          this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n          if (requestedEvents.mousedrag) {\n            this._document!.removeEventListener('mousemove', requestedEvents.mousedrag);\n          }\n        }\n        return this.cancel(ev);\n      },\n      wheel: (ev: WheelEvent) => {\n        sendEvent(ev);\n        return this.cancel(ev, true);\n      },\n      mousedrag: (ev: MouseEvent) => {\n        // deal only with move while a button is held\n        if (ev.buttons) {\n          sendEvent(ev);\n        }\n      },\n      mousemove: (ev: MouseEvent) => {\n        // deal only with move without any button\n        if (!ev.buttons) {\n          sendEvent(ev);\n        }\n      }\n    };\n    this.register(this.coreMouseService.onProtocolChange(events => {\n      // apply global changes on events\n      if (events) {\n        if (this.optionsService.rawOptions.logLevel === 'debug') {\n          this._logService.debug('Binding to mouse events:', this.coreMouseService.explainEvents(events));\n        }\n        this.element!.classList.add('enable-mouse-events');\n        this._selectionService!.disable();\n      } else {\n        this._logService.debug('Unbinding from mouse events.');\n        this.element!.classList.remove('enable-mouse-events');\n        this._selectionService!.enable();\n      }\n\n      // add/remove handlers from requestedEvents\n\n      if (!(events & CoreMouseEventType.MOVE)) {\n        el.removeEventListener('mousemove', requestedEvents.mousemove!);\n        requestedEvents.mousemove = null;\n      } else if (!requestedEvents.mousemove) {\n        el.addEventListener('mousemove', eventListeners.mousemove);\n        requestedEvents.mousemove = eventListeners.mousemove;\n      }\n\n      if (!(events & CoreMouseEventType.WHEEL)) {\n        el.removeEventListener('wheel', requestedEvents.wheel!);\n        requestedEvents.wheel = null;\n      } else if (!requestedEvents.wheel) {\n        el.addEventListener('wheel', eventListeners.wheel, { passive: false });\n        requestedEvents.wheel = eventListeners.wheel;\n      }\n\n      if (!(events & CoreMouseEventType.UP)) {\n        this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n        el.removeEventListener('mouseup', requestedEvents.mouseup!);\n        requestedEvents.mouseup = null;\n      } else if (!requestedEvents.mouseup) {\n        el.addEventListener('mouseup', eventListeners.mouseup);\n        requestedEvents.mouseup = eventListeners.mouseup;\n      }\n\n      if (!(events & CoreMouseEventType.DRAG)) {\n        this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!);\n        requestedEvents.mousedrag = null;\n      } else if (!requestedEvents.mousedrag) {\n        requestedEvents.mousedrag = eventListeners.mousedrag;\n      }\n    }));\n    // force initial onProtocolChange so we dont miss early mouse requests\n    this.coreMouseService.activeProtocol = this.coreMouseService.activeProtocol;\n\n    /**\n     * \"Always on\" event listeners.\n     */\n    this.register(addDisposableDomListener(el, 'mousedown', (ev: MouseEvent) => {\n      ev.preventDefault();\n      this.focus();\n\n      // Don't send the mouse button to the pty if mouse events are disabled or\n      // if the selection manager is having selection forced (ie. a modifier is\n      // held).\n      if (!this.coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) {\n        return;\n      }\n\n      sendEvent(ev);\n\n      // Register additional global handlers which should keep reporting outside\n      // of the terminal element.\n      // Note: Other emulators also do this for 'mousedown' while a button\n      // is held, we currently limit 'mousedown' to the terminal only.\n      if (requestedEvents.mouseup) {\n        this._document!.addEventListener('mouseup', requestedEvents.mouseup);\n      }\n      if (requestedEvents.mousedrag) {\n        this._document!.addEventListener('mousemove', requestedEvents.mousedrag);\n      }\n\n      return this.cancel(ev);\n    }));\n\n    this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n      // do nothing, if app side handles wheel itself\n      if (requestedEvents.wheel) return;\n\n      if (!this.buffer.hasScrollback) {\n        // Convert wheel events into up/down events when the buffer does not have scrollback, this\n        // enables scrolling in apps hosted in the alt buffer such as vim or tmux.\n        const amount = this.viewport!.getLinesScrolled(ev);\n\n        // Do nothing if there's no vertical scroll\n        if (amount === 0) {\n          return;\n        }\n\n        // Construct and send sequences\n        const sequence = C0.ESC + (this.coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n        let data = '';\n        for (let i = 0; i < Math.abs(amount); i++) {\n          data += sequence;\n        }\n        this.coreService.triggerDataEvent(data, true);\n        return this.cancel(ev, true);\n      }\n\n      // normal viewport scrolling\n      // conditionally stop event, if the viewport still had rows to scroll within\n      if (this.viewport!.handleWheel(ev)) {\n        return this.cancel(ev);\n      }\n    }, { passive: false }));\n\n    this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n      if (this.coreMouseService.areMouseEventsActive) return;\n      this.viewport!.handleTouchStart(ev);\n      return this.cancel(ev);\n    }, { passive: true }));\n\n    this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n      if (this.coreMouseService.areMouseEventsActive) return;\n      if (!this.viewport!.handleTouchMove(ev)) {\n        return this.cancel(ev);\n      }\n    }, { passive: false }));\n  }\n\n\n  /**\n   * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n   * opportunity.\n   * @param start The row to start from (between 0 and this.rows - 1).\n   * @param end The row to end at (between start and this.rows - 1).\n   */\n  public refresh(start: number, end: number): void {\n    this._renderService?.refreshRows(start, end);\n  }\n\n  /**\n   * Change the cursor style for different selection modes\n   */\n  public updateCursorStyle(ev: KeyboardEvent): void {\n    if (this._selectionService?.shouldColumnSelect(ev)) {\n      this.element!.classList.add('column-select');\n    } else {\n      this.element!.classList.remove('column-select');\n    }\n  }\n\n  /**\n   * Display the cursor element\n   */\n  private _showCursor(): void {\n    if (!this.coreService.isCursorInitialized) {\n      this.coreService.isCursorInitialized = true;\n      this.refresh(this.buffer.y, this.buffer.y);\n    }\n  }\n\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source = ScrollSource.TERMINAL): void {\n    if (source === ScrollSource.VIEWPORT) {\n      super.scrollLines(disp, suppressScrollEvent, source);\n      this.refresh(0, this.rows - 1);\n    } else {\n      this.viewport?.scrollLines(disp);\n    }\n  }\n\n  public paste(data: string): void {\n    paste(data, this.textarea!, this.coreService, this.optionsService);\n  }\n\n  /**\n   * Attaches a custom key event handler which is run before keys are processed,\n   * giving consumers of xterm.js ultimate control as to what keys should be\n   * processed by the terminal and what keys should not.\n   * @param customKeyEventHandler The custom KeyboardEvent handler to attach.\n   * This is a function that takes a KeyboardEvent, allowing consumers to stop\n   * propagation and/or prevent the default action. The function returns whether\n   * the event should be processed by xterm.js.\n   */\n  public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n    this._customKeyEventHandler = customKeyEventHandler;\n  }\n\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this.linkifier2.registerLinkProvider(linkProvider);\n  }\n\n  public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    const joinerId = this._characterJoinerService.register(handler);\n    this.refresh(0, this.rows - 1);\n    return joinerId;\n  }\n\n  public deregisterCharacterJoiner(joinerId: number): void {\n    if (!this._characterJoinerService) {\n      throw new Error('Terminal must be opened first');\n    }\n    if (this._characterJoinerService.deregister(joinerId)) {\n      this.refresh(0, this.rows - 1);\n    }\n  }\n\n  public get markers(): IMarker[] {\n    return this.buffer.markers;\n  }\n\n  public registerMarker(cursorYOffset: number): IMarker {\n    return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n  }\n\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    return this._decorationService.registerDecoration(decorationOptions);\n  }\n\n  /**\n   * Gets whether the terminal has an active selection.\n   */\n  public hasSelection(): boolean {\n    return this._selectionService ? this._selectionService.hasSelection : false;\n  }\n\n  /**\n   * Selects text within the terminal.\n   * @param column The column the selection starts at..\n   * @param row The row the selection starts at.\n   * @param length The length of the selection.\n   */\n  public select(column: number, row: number, length: number): void {\n    this._selectionService!.setSelection(column, row, length);\n  }\n\n  /**\n   * Gets the terminal's current selection, this is useful for implementing copy\n   * behavior outside of xterm.js.\n   */\n  public getSelection(): string {\n    return this._selectionService ? this._selectionService.selectionText : '';\n  }\n\n  public getSelectionPosition(): IBufferRange | undefined {\n    if (!this._selectionService || !this._selectionService.hasSelection) {\n      return undefined;\n    }\n\n    return {\n      start: {\n        x: this._selectionService.selectionStart![0],\n        y: this._selectionService.selectionStart![1]\n      },\n      end: {\n        x: this._selectionService.selectionEnd![0],\n        y: this._selectionService.selectionEnd![1]\n      }\n    };\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._selectionService?.clearSelection();\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._selectionService?.selectAll();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._selectionService?.selectLines(start, end);\n  }\n\n  /**\n   * Handle a keydown [KeyboardEvent].\n   *\n   * [KeyboardEvent]: https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   */\n  protected _keyDown(event: KeyboardEvent): boolean | undefined {\n    this._keyDownHandled = false;\n    this._keyDownSeen = true;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n      return false;\n    }\n\n    // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled\n    const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey;\n\n    if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) {\n      if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) {\n        this.scrollToBottom();\n      }\n      return false;\n    }\n\n    if (!shouldIgnoreComposition && (event.key === 'Dead' || event.key === 'AltGraph')) {\n      this._unprocessedDeadKey = true;\n    }\n\n    const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta);\n\n    this.updateCursorStyle(event);\n\n    if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n      const scrollCount = this.rows - 1;\n      this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n      return this.cancel(event, true);\n    }\n\n    if (result.type === KeyboardResultType.SELECT_ALL) {\n      this.selectAll();\n    }\n\n    if (this._isThirdLevelShift(this.browser, event)) {\n      return true;\n    }\n\n    if (result.cancel) {\n      // The event is canceled at the end already, is this necessary?\n      this.cancel(event, true);\n    }\n\n    if (!result.key) {\n      return true;\n    }\n\n    // HACK: Process A-Z in the keypress event to fix an issue with macOS IMEs where lower case\n    // letters cannot be input while caps lock is on.\n    if (event.key && !event.ctrlKey && !event.altKey && !event.metaKey && event.key.length === 1) {\n      if (event.key.charCodeAt(0) >= 65 && event.key.charCodeAt(0) <= 90) {\n        return true;\n      }\n    }\n\n    if (this._unprocessedDeadKey) {\n      this._unprocessedDeadKey = false;\n      return true;\n    }\n\n    // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n    // will announce deleted characters. This will not work 100% of the time but it should cover\n    // most scenarios.\n    if (result.key === C0.ETX || result.key === C0.CR) {\n      this.textarea!.value = '';\n    }\n\n    this._onKey.fire({ key: result.key, domEvent: event });\n    this._showCursor();\n    this.coreService.triggerDataEvent(result.key, true);\n\n    // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n    // other listeners. When screen reader mode is enabled, we don't cancel them (unless ctrl or alt\n    // is also depressed) so that the cursor textarea can be updated, which triggers the screen\n    // reader to read it.\n    if (!this.optionsService.rawOptions.screenReaderMode || event.altKey || event.ctrlKey) {\n      return this.cancel(event, true);\n    }\n\n    this._keyDownHandled = true;\n  }\n\n  private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean {\n    const thirdLevelKey =\n      (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) ||\n      (browser.isWindows && ev.getModifierState('AltGraph'));\n\n    if (ev.type === 'keypress') {\n      return thirdLevelKey;\n    }\n\n    // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n    return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n  }\n\n  protected _keyUp(ev: KeyboardEvent): void {\n    this._keyDownSeen = false;\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return;\n    }\n\n    if (!wasModifierKeyOnlyEvent(ev)) {\n      this.focus();\n    }\n\n    this.updateCursorStyle(ev);\n    this._keyPressHandled = false;\n  }\n\n  /**\n   * Handle a keypress event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n   * @param ev The keypress event to be handled.\n   */\n  protected _keyPress(ev: KeyboardEvent): boolean {\n    let key;\n\n    this._keyPressHandled = false;\n\n    if (this._keyDownHandled) {\n      return false;\n    }\n\n    if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n      return false;\n    }\n\n    this.cancel(ev);\n\n    if (ev.charCode) {\n      key = ev.charCode;\n    } else if (ev.which === null || ev.which === undefined) {\n      key = ev.keyCode;\n    } else if (ev.which !== 0 && ev.charCode !== 0) {\n      key = ev.which;\n    } else {\n      return false;\n    }\n\n    if (!key || (\n      (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n    )) {\n      return false;\n    }\n\n    key = String.fromCharCode(key);\n\n    this._onKey.fire({ key, domEvent: ev });\n    this._showCursor();\n    this.coreService.triggerDataEvent(key, true);\n\n    this._keyPressHandled = true;\n\n    // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n    // keys could be ignored\n    this._unprocessedDeadKey = false;\n\n    return true;\n  }\n\n  /**\n   * Handle an input event.\n   * Key Resources:\n   *   - https://developer.mozilla.org/en-US/docs/Web/API/InputEvent\n   * @param ev The input event to be handled.\n   */\n  protected _inputEvent(ev: InputEvent): boolean {\n    // Only support emoji IMEs when screen reader mode is disabled as the event must bubble up to\n    // support reading out character input which can doubling up input characters\n    // Based on these event traces: https://github.com/xtermjs/xterm.js/issues/3679\n    if (ev.data && ev.inputType === 'insertText' && (!ev.composed || !this._keyDownSeen) && !this.optionsService.rawOptions.screenReaderMode) {\n      if (this._keyPressHandled) {\n        return false;\n      }\n\n      // The key was handled so clear the dead key state, otherwise certain keystrokes like arrow\n      // keys could be ignored\n      this._unprocessedDeadKey = false;\n\n      const text = ev.data;\n      this.coreService.triggerDataEvent(text, true);\n\n      this.cancel(ev);\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Resizes the terminal.\n   *\n   * @param x The number of columns to resize to.\n   * @param y The number of rows to resize to.\n   */\n  public resize(x: number, y: number): void {\n    if (x === this.cols && y === this.rows) {\n      // Check if we still need to measure the char size (fixes #785).\n      if (this._charSizeService && !this._charSizeService.hasValidSize) {\n        this._charSizeService.measure();\n      }\n      return;\n    }\n\n    super.resize(x, y);\n  }\n\n  private _afterResize(x: number, y: number): void {\n    this._charSizeService?.measure();\n\n    // Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an\n    // invalid location\n    this.viewport?.syncScrollArea(true);\n  }\n\n  /**\n   * Clear the entire buffer, making the prompt line the new first line.\n   */\n  public clear(): void {\n    if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n      // Don't clear if it's already clear\n      return;\n    }\n    this.buffer.clearAllMarkers();\n    this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n    this.buffer.lines.length = 1;\n    this.buffer.ydisp = 0;\n    this.buffer.ybase = 0;\n    this.buffer.y = 0;\n    for (let i = 1; i < this.rows; i++) {\n      this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    // IMPORTANT: Fire scroll event before viewport is reset. This ensures embedders get the clear\n    // scroll event and that the viewport's state will be valid for immediate writes.\n    this._onScroll.fire({ position: this.buffer.ydisp, source: ScrollSource.TERMINAL });\n    this.viewport?.reset();\n    this.refresh(0, this.rows - 1);\n  }\n\n  /**\n   * Reset terminal.\n   * Note: Calling this directly from JS is synchronous but does not clear\n   * input buffers and does not reset the parser, thus the terminal will\n   * continue to apply pending input data.\n   * If you need in band reset (synchronous with input data) consider\n   * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n   */\n  public reset(): void {\n    /**\n     * Since _setup handles a full terminal creation, we have to carry forward\n     * a few things that should not reset.\n     */\n    this.options.rows = this.rows;\n    this.options.cols = this.cols;\n    const customKeyEventHandler = this._customKeyEventHandler;\n\n    this._setup();\n    super.reset();\n    this._selectionService?.reset();\n    this._decorationService.reset();\n    this.viewport?.reset();\n\n    // reattach\n    this._customKeyEventHandler = customKeyEventHandler;\n\n    // do a full screen refresh\n    this.refresh(0, this.rows - 1);\n  }\n\n  public clearTextureAtlas(): void {\n    this._renderService?.clearTextureAtlas();\n  }\n\n  private _reportFocus(): void {\n    if (this.element?.classList.contains('focus')) {\n      this.coreService.triggerDataEvent(C0.ESC + '[I');\n    } else {\n      this.coreService.triggerDataEvent(C0.ESC + '[O');\n    }\n  }\n\n  private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n    if (!this._renderService) {\n      return;\n    }\n\n    switch (type) {\n      case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n        const canvasWidth = this._renderService.dimensions.css.canvas.width.toFixed(0);\n        const canvasHeight = this._renderService.dimensions.css.canvas.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n        break;\n      case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n        const cellWidth = this._renderService.dimensions.css.cell.width.toFixed(0);\n        const cellHeight = this._renderService.dimensions.css.cell.height.toFixed(0);\n        this.coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n        break;\n    }\n  }\n\n  // TODO: Remove cancel function and cancelEvents option\n  public cancel(ev: Event, force?: boolean): boolean | undefined {\n    if (!this.options.cancelEvents && !force) {\n      return;\n    }\n    ev.preventDefault();\n    ev.stopPropagation();\n    return false;\n  }\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n  return ev.keyCode === 16 || // Shift\n    ev.keyCode === 17 || // Ctrl\n    ev.keyCode === 18; // Alt\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nconst RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second\n\nimport { IRenderDebouncer } from 'browser/Types';\n\n/**\n * Debounces calls to update screen readers to update at most once configurable interval of time.\n */\nexport class TimeBasedDebouncer implements IRenderDebouncer {\n  private _rowStart: number | undefined;\n  private _rowEnd: number | undefined;\n  private _rowCount: number | undefined;\n\n  // The last moment that the Terminal was refreshed at\n  private _lastRefreshMs = 0;\n  // Whether a trailing refresh should be triggered due to a refresh request that was throttled\n  private _additionalRefreshRequested = false;\n\n  private _refreshTimeoutID: number | undefined;\n\n  constructor(\n    private _renderCallback: (start: number, end: number) => void,\n    private readonly _debounceThresholdMS = RENDER_DEBOUNCE_THRESHOLD_MS\n  ) {\n  }\n\n  public dispose(): void {\n    if (this._refreshTimeoutID) {\n      clearTimeout(this._refreshTimeoutID);\n    }\n  }\n\n  public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n    this._rowCount = rowCount;\n    // Get the min/max row start/end for the arg values\n    rowStart = rowStart !== undefined ? rowStart : 0;\n    rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n    // Set the properties to the updated values\n    this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n    this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n    // Only refresh if the time since last refresh is above a threshold, otherwise wait for\n    // enough time to pass before refreshing again.\n    const refreshRequestTime: number = Date.now();\n    if (refreshRequestTime - this._lastRefreshMs >= this._debounceThresholdMS) {\n      // Enough time has lapsed since the last refresh; refresh immediately\n      this._lastRefreshMs = refreshRequestTime;\n      this._innerRefresh();\n    } else if (!this._additionalRefreshRequested) {\n      // This is the first additional request throttled; set up trailing refresh\n      const elapsed = refreshRequestTime - this._lastRefreshMs;\n      const waitPeriodBeforeTrailingRefresh = this._debounceThresholdMS - elapsed;\n      this._additionalRefreshRequested = true;\n\n      this._refreshTimeoutID = window.setTimeout(() => {\n        this._lastRefreshMs = Date.now();\n        this._innerRefresh();\n        this._additionalRefreshRequested = false;\n        this._refreshTimeoutID = undefined; // No longer need to clear the timeout\n      }, waitPeriodBeforeTrailingRefresh);\n    }\n  }\n\n  private _innerRefresh(): void {\n    // Make sure values are set\n    if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n      return;\n    }\n\n    // Clamp values\n    const start = Math.max(this._rowStart, 0);\n    const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n    // Reset debouncer (this happens before render callback as the render could trigger it again)\n    this._rowStart = undefined;\n    this._rowEnd = undefined;\n\n    // Run render callback\n    this._renderCallback(start, end);\n  }\n}\n\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IViewport, ReadonlyColorSet } from 'browser/Types';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nconst FALLBACK_SCROLL_BAR_WIDTH = 15;\n\ninterface ISmoothScrollState {\n  startTime: number;\n  origin: number;\n  target: number;\n}\n\n/**\n * Represents the viewport of a terminal, the visible area within the larger buffer of output.\n * Logic for the virtual scroll bar is included in this object.\n */\nexport class Viewport extends Disposable implements IViewport {\n  public scrollBarWidth: number = 0;\n  private _currentRowHeight: number = 0;\n  private _currentDeviceCellHeight: number = 0;\n  private _lastRecordedBufferLength: number = 0;\n  private _lastRecordedViewportHeight: number = 0;\n  private _lastRecordedBufferHeight: number = 0;\n  private _lastTouchY: number = 0;\n  private _lastScrollTop: number = 0;\n  private _activeBuffer: IBuffer;\n  private _renderDimensions: IRenderDimensions;\n\n  // Stores a partial line amount when scrolling, this is used to keep track of how much of a line\n  // is scrolled so we can \"scroll\" over partial lines and feel natural on touchpads. This is a\n  // quick fix and could have a more robust solution in place that reset the value when needed.\n  private _wheelPartialScroll: number = 0;\n\n  private _refreshAnimationFrame: number | null = null;\n  private _ignoreNextScrollEvent: boolean = false;\n  private _smoothScrollState: ISmoothScrollState = {\n    startTime: 0,\n    origin: -1,\n    target: -1\n  };\n\n  private readonly _onRequestScrollLines = this.register(new EventEmitter<{ amount: number, suppressScrollEvent: boolean }>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  constructor(\n    private readonly _viewportElement: HTMLElement,\n    private readonly _scrollArea: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService themeService: IThemeService\n  ) {\n    super();\n\n    // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.\n    // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that\n    // case, therefore we account for a standard amount to make it visible\n    this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;\n    this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._handleScroll.bind(this)));\n\n    // Track properties used in performance critical code manually to avoid using slow getters\n    this._activeBuffer = this._bufferService.buffer;\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n    this._renderDimensions = this._renderService.dimensions;\n    this.register(this._renderService.onDimensionsChange(e => this._renderDimensions = e));\n\n    this._handleThemeChange(themeService.colors);\n    this.register(themeService.onChangeColors(e => this._handleThemeChange(e)));\n    this.register(this._optionsService.onSpecificOptionChange('scrollback', () => this.syncScrollArea()));\n\n    // Perform this async to ensure the ICharSizeService is ready.\n    setTimeout(() => this.syncScrollArea());\n  }\n\n  private _handleThemeChange(colors: ReadonlyColorSet): void {\n    this._viewportElement.style.backgroundColor = colors.background.css;\n  }\n\n  public reset(): void {\n    this._currentRowHeight = 0;\n    this._currentDeviceCellHeight = 0;\n    this._lastRecordedBufferLength = 0;\n    this._lastRecordedViewportHeight = 0;\n    this._lastRecordedBufferHeight = 0;\n    this._lastTouchY = 0;\n    this._lastScrollTop = 0;\n    // Sync on next animation frame to ensure the new terminal state is used\n    this._coreBrowserService.window.requestAnimationFrame(() => this.syncScrollArea());\n  }\n\n  /**\n   * Refreshes row height, setting line-height, viewport height and scroll area height if\n   * necessary.\n   */\n  private _refresh(immediate: boolean): void {\n    if (immediate) {\n      this._innerRefresh();\n      if (this._refreshAnimationFrame !== null) {\n        this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame);\n      }\n      return;\n    }\n    if (this._refreshAnimationFrame === null) {\n      this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._innerRefresh());\n    }\n  }\n\n  private _innerRefresh(): void {\n    if (this._charSizeService.height > 0) {\n      this._currentRowHeight = this._renderService.dimensions.device.cell.height / this._coreBrowserService.dpr;\n      this._currentDeviceCellHeight = this._renderService.dimensions.device.cell.height;\n      this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;\n      const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.css.canvas.height);\n      if (this._lastRecordedBufferHeight !== newBufferHeight) {\n        this._lastRecordedBufferHeight = newBufferHeight;\n        this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';\n      }\n    }\n\n    // Sync scrollTop\n    const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n    if (this._viewportElement.scrollTop !== scrollTop) {\n      // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not\n      // want this event to scroll the terminal\n      this._ignoreNextScrollEvent = true;\n      this._viewportElement.scrollTop = scrollTop;\n    }\n\n    this._refreshAnimationFrame = null;\n  }\n\n  /**\n   * Updates dimensions and synchronizes the scroll area if necessary.\n   */\n  public syncScrollArea(immediate: boolean = false): void {\n    // If buffer height changed\n    if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {\n      this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;\n      this._refresh(immediate);\n      return;\n    }\n\n    // If viewport height changed\n    if (this._lastRecordedViewportHeight !== this._renderService.dimensions.css.canvas.height) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If the buffer position doesn't match last scroll top\n    if (this._lastScrollTop !== this._activeBuffer.ydisp * this._currentRowHeight) {\n      this._refresh(immediate);\n      return;\n    }\n\n    // If row height changed\n    if (this._renderDimensions.device.cell.height !== this._currentDeviceCellHeight) {\n      this._refresh(immediate);\n      return;\n    }\n  }\n\n  /**\n   * Handles scroll events on the viewport, calculating the new viewport and requesting the\n   * terminal to scroll to it.\n   * @param ev The scroll event.\n   */\n  private _handleScroll(ev: Event): void {\n    // Record current scroll top position\n    this._lastScrollTop = this._viewportElement.scrollTop;\n\n    // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt\n    // which causes the terminal to scroll the buffer to the top\n    if (!this._viewportElement.offsetParent) {\n      return;\n    }\n\n    // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)\n    if (this._ignoreNextScrollEvent) {\n      this._ignoreNextScrollEvent = false;\n      // Still trigger the scroll so lines get refreshed\n      this._onRequestScrollLines.fire({ amount: 0, suppressScrollEvent: true });\n      return;\n    }\n\n    const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n    const diff = newRow - this._bufferService.buffer.ydisp;\n    this._onRequestScrollLines.fire({ amount: diff, suppressScrollEvent: true });\n  }\n\n  private _smoothScroll(): void {\n    // Check valid state\n    if (this._isDisposed || this._smoothScrollState.origin === -1 || this._smoothScrollState.target === -1) {\n      return;\n    }\n\n    // Calculate position complete\n    const percent = this._smoothScrollPercent();\n    this._viewportElement.scrollTop = this._smoothScrollState.origin + Math.round(percent * (this._smoothScrollState.target - this._smoothScrollState.origin));\n\n    // Continue or finish smooth scroll\n    if (percent < 1) {\n      this._coreBrowserService.window.requestAnimationFrame(() => this._smoothScroll());\n    } else {\n      this._clearSmoothScrollState();\n    }\n  }\n\n  private _smoothScrollPercent(): number {\n    if (!this._optionsService.rawOptions.smoothScrollDuration || !this._smoothScrollState.startTime) {\n      return 1;\n    }\n    return Math.max(Math.min((Date.now() - this._smoothScrollState.startTime) / this._optionsService.rawOptions.smoothScrollDuration, 1), 0);\n  }\n\n  private _clearSmoothScrollState(): void {\n    this._smoothScrollState.startTime = 0;\n    this._smoothScrollState.origin = -1;\n    this._smoothScrollState.target = -1;\n  }\n\n  /**\n   * Handles bubbling of scroll event in case the viewport has reached top or bottom\n   * @param ev The scroll event.\n   * @param amount The amount scrolled\n   */\n  private _bubbleScroll(ev: Event, amount: number): boolean {\n    const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;\n    if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||\n      (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {\n      if (ev.cancelable) {\n        ev.preventDefault();\n      }\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual\n   * scrolling to `onScroll`, this event needs to be attached manually by the consumer of\n   * `Viewport`.\n   * @param ev The mouse wheel event.\n   */\n  public handleWheel(ev: WheelEvent): boolean {\n    const amount = this._getPixelsScrolled(ev);\n    if (amount === 0) {\n      return false;\n    }\n    if (!this._optionsService.rawOptions.smoothScrollDuration) {\n      this._viewportElement.scrollTop += amount;\n    } else {\n      this._smoothScrollState.startTime = Date.now();\n      if (this._smoothScrollPercent() < 1) {\n        this._smoothScrollState.origin = this._viewportElement.scrollTop;\n        if (this._smoothScrollState.target === -1) {\n          this._smoothScrollState.target = this._viewportElement.scrollTop + amount;\n        } else {\n          this._smoothScrollState.target += amount;\n        }\n        this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0);\n        this._smoothScroll();\n      } else {\n        this._clearSmoothScrollState();\n      }\n    }\n    return this._bubbleScroll(ev, amount);\n  }\n\n  public scrollLines(disp: number): void {\n    if (disp === 0) {\n      return;\n    }\n    if (!this._optionsService.rawOptions.smoothScrollDuration) {\n      this._onRequestScrollLines.fire({ amount: disp, suppressScrollEvent: false });\n    } else {\n      const amount = disp * this._currentRowHeight;\n      this._smoothScrollState.startTime = Date.now();\n      if (this._smoothScrollPercent() < 1) {\n        this._smoothScrollState.origin = this._viewportElement.scrollTop;\n        this._smoothScrollState.target = this._smoothScrollState.origin + amount;\n        this._smoothScrollState.target = Math.max(Math.min(this._smoothScrollState.target, this._viewportElement.scrollHeight), 0);\n        this._smoothScroll();\n      } else {\n        this._clearSmoothScrollState();\n      }\n    }\n  }\n\n  private _getPixelsScrolled(ev: WheelEvent): number {\n    // Do nothing if it's not a vertical scroll event\n    if (ev.deltaY === 0 || ev.shiftKey) {\n      return 0;\n    }\n\n    // Fallback to WheelEvent.DOM_DELTA_PIXEL\n    let amount = this._applyScrollModifier(ev.deltaY, ev);\n    if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n      amount *= this._currentRowHeight;\n    } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      amount *= this._currentRowHeight * this._bufferService.rows;\n    }\n    return amount;\n  }\n\n\n  public getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement } {\n    let currentLine: string = '';\n    let cursorElement: HTMLElement | undefined;\n    const bufferElements: HTMLElement[] = [];\n    const end = endLine ?? this._bufferService.buffer.lines.length;\n    const lines = this._bufferService.buffer.lines;\n    for (let i = startLine; i < end; i++) {\n      const line = lines.get(i);\n      if (!line) {\n        continue;\n      }\n      const isWrapped = lines.get(i + 1)?.isWrapped;\n      currentLine += line.translateToString(!isWrapped);\n      if (!isWrapped || i === lines.length - 1) {\n        const div = document.createElement('div');\n        div.textContent = currentLine;\n        bufferElements.push(div);\n        if (currentLine.length > 0) {\n          cursorElement = div;\n        }\n        currentLine = '';\n      }\n    }\n    return { bufferElements, cursorElement };\n  }\n\n  /**\n   * Gets the number of pixels scrolled by the mouse event taking into account what type of delta\n   * is being used.\n   * @param ev The mouse wheel event.\n   */\n  public getLinesScrolled(ev: WheelEvent): number {\n    // Do nothing if it's not a vertical scroll event\n    if (ev.deltaY === 0 || ev.shiftKey) {\n      return 0;\n    }\n\n    // Fallback to WheelEvent.DOM_DELTA_LINE\n    let amount = this._applyScrollModifier(ev.deltaY, ev);\n    if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n      amount /= this._currentRowHeight + 0.0; // Prevent integer division\n      this._wheelPartialScroll += amount;\n      amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n      this._wheelPartialScroll %= 1;\n    } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n      amount *= this._bufferService.rows;\n    }\n    return amount;\n  }\n\n  private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n    const modifier = this._optionsService.rawOptions.fastScrollModifier;\n    // Multiply the scroll speed when the modifier is down\n    if ((modifier === 'alt' && ev.altKey) ||\n      (modifier === 'ctrl' && ev.ctrlKey) ||\n      (modifier === 'shift' && ev.shiftKey)) {\n      return amount * this._optionsService.rawOptions.fastScrollSensitivity * this._optionsService.rawOptions.scrollSensitivity;\n    }\n\n    return amount * this._optionsService.rawOptions.scrollSensitivity;\n  }\n\n  /**\n   * Handles the touchstart event, recording the touch occurred.\n   * @param ev The touch event.\n   */\n  public handleTouchStart(ev: TouchEvent): void {\n    this._lastTouchY = ev.touches[0].pageY;\n  }\n\n  /**\n   * Handles the touchmove event, scrolling the viewport if the position shifted.\n   * @param ev The touch event.\n   */\n  public handleTouchMove(ev: TouchEvent): boolean {\n    const deltaY = this._lastTouchY - ev.touches[0].pageY;\n    this._lastTouchY = ev.touches[0].pageY;\n    if (deltaY === 0) {\n      return false;\n    }\n    this._viewportElement.scrollTop += deltaY;\n    return this._bubbleScroll(ev, deltaY);\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IRenderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services';\n\nexport class BufferDecorationRenderer extends Disposable {\n  private readonly _container: HTMLElement;\n  private readonly _decorationElements: Map<IInternalDecoration, HTMLElement> = new Map();\n\n  private _animationFrame: number | undefined;\n  private _altBufferIsActive: boolean = false;\n  private _dimensionsChanged: boolean = false;\n\n  constructor(\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    super();\n\n    this._container = document.createElement('div');\n    this._container.classList.add('xterm-decoration-container');\n    this._screenElement.appendChild(this._container);\n\n    this.register(this._renderService.onRenderedViewportChange(() => this._doRefreshDecorations()));\n    this.register(this._renderService.onDimensionsChange(() => {\n      this._dimensionsChanged = true;\n      this._queueRefresh();\n    }));\n    this.register(addDisposableDomListener(window, 'resize', () => this._queueRefresh()));\n    this.register(this._bufferService.buffers.onBufferActivate(() => {\n      this._altBufferIsActive = this._bufferService.buffer === this._bufferService.buffers.alt;\n    }));\n    this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh()));\n    this.register(this._decorationService.onDecorationRemoved(decoration => this._removeDecoration(decoration)));\n    this.register(toDisposable(() => {\n      this._container.remove();\n      this._decorationElements.clear();\n    }));\n  }\n\n  private _queueRefresh(): void {\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._renderService.addRefreshCallback(() => {\n      this._doRefreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n\n  private _doRefreshDecorations(): void {\n    for (const decoration of this._decorationService.decorations) {\n      this._renderDecoration(decoration);\n    }\n    this._dimensionsChanged = false;\n  }\n\n  private _renderDecoration(decoration: IInternalDecoration): void {\n    this._refreshStyle(decoration);\n    if (this._dimensionsChanged) {\n      this._refreshXPosition(decoration);\n    }\n  }\n\n  private _createElement(decoration: IInternalDecoration): HTMLElement {\n    const element = document.createElement('div');\n    element.classList.add('xterm-decoration');\n    element.classList.toggle('xterm-decoration-top-layer', decoration?.options?.layer === 'top');\n    element.style.width = `${Math.round((decoration.options.width || 1) * this._renderService.dimensions.css.cell.width)}px`;\n    element.style.height = `${(decoration.options.height || 1) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.top = `${(decoration.marker.line - this._bufferService.buffers.active.ydisp) * this._renderService.dimensions.css.cell.height}px`;\n    element.style.lineHeight = `${this._renderService.dimensions.css.cell.height}px`;\n\n    const x = decoration.options.x ?? 0;\n    if (x && x > this._bufferService.cols) {\n      // exceeded the container width, so hide\n      element.style.display = 'none';\n    }\n    this._refreshXPosition(decoration, element);\n\n    return element;\n  }\n\n  private _refreshStyle(decoration: IInternalDecoration): void {\n    const line = decoration.marker.line - this._bufferService.buffers.active.ydisp;\n    if (line < 0 || line >= this._bufferService.rows) {\n      // outside of viewport\n      if (decoration.element) {\n        decoration.element.style.display = 'none';\n        decoration.onRenderEmitter.fire(decoration.element);\n      }\n    } else {\n      let element = this._decorationElements.get(decoration);\n      if (!element) {\n        element = this._createElement(decoration);\n        decoration.element = element;\n        this._decorationElements.set(decoration, element);\n        this._container.appendChild(element);\n        decoration.onDispose(() => {\n          this._decorationElements.delete(decoration);\n          element!.remove();\n        });\n      }\n      element.style.top = `${line * this._renderService.dimensions.css.cell.height}px`;\n      element.style.display = this._altBufferIsActive ? 'none' : 'block';\n      decoration.onRenderEmitter.fire(element);\n    }\n  }\n\n  private _refreshXPosition(decoration: IInternalDecoration, element: HTMLElement | undefined = decoration.element): void {\n    if (!element) {\n      return;\n    }\n    const x = decoration.options.x ?? 0;\n    if ((decoration.options.anchor || 'left') === 'right') {\n      element.style.right = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    } else {\n      element.style.left = x ? `${x * this._renderService.dimensions.css.cell.width}px` : '';\n    }\n  }\n\n  private _removeDecoration(decoration: IInternalDecoration): void {\n    this._decorationElements.get(decoration)?.remove();\n    this._decorationElements.delete(decoration);\n    decoration.dispose();\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInternalDecoration } from 'common/services/Services';\n\nexport interface IColorZoneStore {\n  readonly zones: IColorZone[];\n  clear(): void;\n  addDecoration(decoration: IInternalDecoration): void;\n  /**\n   * Sets the amount of padding in lines that will be added between zones, if new lines intersect\n   * the padding they will be merged into the same zone.\n   */\n  setPadding(padding: { [position: string]: number }): void;\n}\n\nexport interface IColorZone {\n  /** Color in a format supported by canvas' fillStyle. */\n  color: string;\n  position: 'full' | 'left' | 'center' | 'right' | undefined;\n  startBufferLine: number;\n  endBufferLine: number;\n}\n\ninterface IMinimalDecorationForColorZone {\n  marker: Pick<IInternalDecoration['marker'], 'line'>;\n  options: Pick<IInternalDecoration['options'], 'overviewRulerOptions'>;\n}\n\nexport class ColorZoneStore implements IColorZoneStore {\n  private _zones: IColorZone[] = [];\n\n  // The zone pool is used to keep zone objects from being freed between clearing the color zone\n  // store and fetching the zones. This helps reduce GC pressure since the color zones are\n  // accumulated on potentially every scroll event.\n  private _zonePool: IColorZone[] = [];\n  private _zonePoolIndex = 0;\n\n  private _linePadding: { [position: string]: number } = {\n    full: 0,\n    left: 0,\n    center: 0,\n    right: 0\n  };\n\n  public get zones(): IColorZone[] {\n    // Trim the zone pool to free unused memory\n    this._zonePool.length = Math.min(this._zonePool.length, this._zones.length);\n    return this._zones;\n  }\n\n  public clear(): void {\n    this._zones.length = 0;\n    this._zonePoolIndex = 0;\n  }\n\n  public addDecoration(decoration: IMinimalDecorationForColorZone): void {\n    if (!decoration.options.overviewRulerOptions) {\n      return;\n    }\n    for (const z of this._zones) {\n      if (z.color === decoration.options.overviewRulerOptions.color &&\n          z.position === decoration.options.overviewRulerOptions.position) {\n        if (this._lineIntersectsZone(z, decoration.marker.line)) {\n          return;\n        }\n        if (this._lineAdjacentToZone(z, decoration.marker.line, decoration.options.overviewRulerOptions.position)) {\n          this._addLineToZone(z, decoration.marker.line);\n          return;\n        }\n      }\n    }\n    // Create using zone pool if possible\n    if (this._zonePoolIndex < this._zonePool.length) {\n      this._zonePool[this._zonePoolIndex].color = decoration.options.overviewRulerOptions.color;\n      this._zonePool[this._zonePoolIndex].position = decoration.options.overviewRulerOptions.position;\n      this._zonePool[this._zonePoolIndex].startBufferLine = decoration.marker.line;\n      this._zonePool[this._zonePoolIndex].endBufferLine = decoration.marker.line;\n      this._zones.push(this._zonePool[this._zonePoolIndex++]);\n      return;\n    }\n    // Create\n    this._zones.push({\n      color: decoration.options.overviewRulerOptions.color,\n      position: decoration.options.overviewRulerOptions.position,\n      startBufferLine: decoration.marker.line,\n      endBufferLine: decoration.marker.line\n    });\n    this._zonePool.push(this._zones[this._zones.length - 1]);\n    this._zonePoolIndex++;\n  }\n\n  public setPadding(padding: { [position: string]: number }): void {\n    this._linePadding = padding;\n  }\n\n  private _lineIntersectsZone(zone: IColorZone, line: number): boolean {\n    return (\n      line >= zone.startBufferLine &&\n      line <= zone.endBufferLine\n    );\n  }\n\n  private _lineAdjacentToZone(zone: IColorZone, line: number, position: IColorZone['position']): boolean {\n    return (\n      (line >= zone.startBufferLine - this._linePadding[position || 'full']) &&\n      (line <= zone.endBufferLine + this._linePadding[position || 'full'])\n    );\n  }\n\n  private _addLineToZone(zone: IColorZone, line: number): void {\n    zone.startBufferLine = Math.min(zone.startBufferLine, line);\n    zone.endBufferLine = Math.max(zone.endBufferLine, line);\n  }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ICoreBrowserService, IRenderService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\n// Helper objects to avoid excessive calculation and garbage collection during rendering. These are\n// static values for each render and can be accessed using the decoration position as the key.\nconst drawHeight = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawWidth = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\nconst drawX = {\n  full: 0,\n  left: 0,\n  center: 0,\n  right: 0\n};\n\nexport class OverviewRulerRenderer extends Disposable {\n  private readonly _canvas: HTMLCanvasElement;\n  private readonly _ctx: CanvasRenderingContext2D;\n  private readonly _colorZoneStore: IColorZoneStore = new ColorZoneStore();\n  private get _width(): number {\n    return this._optionsService.options.overviewRulerWidth || 0;\n  }\n  private _animationFrame: number | undefined;\n\n  private _shouldUpdateDimensions: boolean | undefined = true;\n  private _shouldUpdateAnchor: boolean | undefined = true;\n  private _lastKnownBufferLength: number = 0;\n\n  private _containerHeight: number | undefined;\n\n  constructor(\n    private readonly _viewportElement: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreBrowserService private readonly _coreBrowseService: ICoreBrowserService\n  ) {\n    super();\n    this._canvas = document.createElement('canvas');\n    this._canvas.classList.add('xterm-decoration-overview-ruler');\n    this._refreshCanvasDimensions();\n    this._viewportElement.parentElement?.insertBefore(this._canvas, this._viewportElement);\n    const ctx = this._canvas.getContext('2d');\n    if (!ctx) {\n      throw new Error('Ctx cannot be null');\n    } else {\n      this._ctx = ctx;\n    }\n    this._registerDecorationListeners();\n    this._registerBufferChangeListeners();\n    this._registerDimensionChangeListeners();\n    this.register(toDisposable(() => {\n      this._canvas?.remove();\n    }));\n  }\n\n  /**\n   * On decoration add or remove, redraw\n   */\n  private _registerDecorationListeners(): void {\n    this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true)));\n    this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true)));\n  }\n\n  /**\n   * On buffer change, redraw\n   * and hide the canvas if the alt buffer is active\n   */\n  private _registerBufferChangeListeners(): void {\n    this.register(this._renderService.onRenderedViewportChange(() => this._queueRefresh()));\n    this.register(this._bufferService.buffers.onBufferActivate(() => {\n      this._canvas!.style.display = this._bufferService.buffer === this._bufferService.buffers.alt ? 'none' : 'block';\n    }));\n    this.register(this._bufferService.onScroll(() => {\n      if (this._lastKnownBufferLength !== this._bufferService.buffers.normal.lines.length) {\n        this._refreshDrawHeightConstants();\n        this._refreshColorZonePadding();\n      }\n    }));\n  }\n  /**\n   * On dimension change, update canvas dimensions\n   * and then redraw\n   */\n  private _registerDimensionChangeListeners(): void {\n    // container height changed\n    this.register(this._renderService.onRender((): void => {\n      if (!this._containerHeight || this._containerHeight !== this._screenElement.clientHeight) {\n        this._queueRefresh(true);\n        this._containerHeight = this._screenElement.clientHeight;\n      }\n    }));\n    // overview ruler width changed\n    this.register(this._optionsService.onSpecificOptionChange('overviewRulerWidth', () => this._queueRefresh(true)));\n    // device pixel ratio changed\n    this.register(addDisposableDomListener(this._coreBrowseService.window, 'resize', () => this._queueRefresh(true)));\n    // set the canvas dimensions\n    this._queueRefresh(true);\n  }\n\n  private _refreshDrawConstants(): void {\n    // width\n    const outerWidth = Math.floor(this._canvas.width / 3);\n    const innerWidth = Math.ceil(this._canvas.width / 3);\n    drawWidth.full = this._canvas.width;\n    drawWidth.left = outerWidth;\n    drawWidth.center = innerWidth;\n    drawWidth.right = outerWidth;\n    // height\n    this._refreshDrawHeightConstants();\n    // x\n    drawX.full = 0;\n    drawX.left = 0;\n    drawX.center = drawWidth.left;\n    drawX.right = drawWidth.left + drawWidth.center;\n  }\n\n  private _refreshDrawHeightConstants(): void {\n    drawHeight.full = Math.round(2 * this._coreBrowseService.dpr);\n    // Calculate actual pixels per line\n    const pixelsPerLine = this._canvas.height / this._bufferService.buffer.lines.length;\n    // Clamp actual pixels within a range\n    const nonFullHeight = Math.round(Math.max(Math.min(pixelsPerLine, 12), 6) * this._coreBrowseService.dpr);\n    drawHeight.left = nonFullHeight;\n    drawHeight.center = nonFullHeight;\n    drawHeight.right = nonFullHeight;\n  }\n\n  private _refreshColorZonePadding(): void {\n    this._colorZoneStore.setPadding({\n      full: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.full),\n      left: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.left),\n      center: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.center),\n      right: Math.floor(this._bufferService.buffers.active.lines.length / (this._canvas.height - 1) * drawHeight.right)\n    });\n    this._lastKnownBufferLength = this._bufferService.buffers.normal.lines.length;\n  }\n\n  private _refreshCanvasDimensions(): void {\n    this._canvas.style.width = `${this._width}px`;\n    this._canvas.width = Math.round(this._width * this._coreBrowseService.dpr);\n    this._canvas.style.height = `${this._screenElement.clientHeight}px`;\n    this._canvas.height = Math.round(this._screenElement.clientHeight * this._coreBrowseService.dpr);\n    this._refreshDrawConstants();\n    this._refreshColorZonePadding();\n  }\n\n  private _refreshDecorations(): void {\n    if (this._shouldUpdateDimensions) {\n      this._refreshCanvasDimensions();\n    }\n    this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n    this._colorZoneStore.clear();\n    for (const decoration of this._decorationService.decorations) {\n      this._colorZoneStore.addDecoration(decoration);\n    }\n    this._ctx.lineWidth = 1;\n    const zones = this._colorZoneStore.zones;\n    for (const zone of zones) {\n      if (zone.position !== 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    for (const zone of zones) {\n      if (zone.position === 'full') {\n        this._renderColorZone(zone);\n      }\n    }\n    this._shouldUpdateDimensions = false;\n    this._shouldUpdateAnchor = false;\n  }\n\n  private _renderColorZone(zone: IColorZone): void {\n    this._ctx.fillStyle = zone.color;\n    this._ctx.fillRect(\n      /* x */ drawX[zone.position || 'full'],\n      /* y */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        (zone.startBufferLine / this._bufferService.buffers.active.lines.length) - drawHeight[zone.position || 'full'] / 2\n      ),\n      /* w */ drawWidth[zone.position || 'full'],\n      /* h */ Math.round(\n        (this._canvas.height - 1) * // -1 to ensure at least 2px are allowed for decoration on last line\n        ((zone.endBufferLine - zone.startBufferLine) / this._bufferService.buffers.active.lines.length) + drawHeight[zone.position || 'full']\n      )\n    );\n  }\n\n  private _queueRefresh(updateCanvasDimensions?: boolean, updateAnchor?: boolean): void {\n    this._shouldUpdateDimensions = updateCanvasDimensions || this._shouldUpdateDimensions;\n    this._shouldUpdateAnchor = updateAnchor || this._shouldUpdateAnchor;\n    if (this._animationFrame !== undefined) {\n      return;\n    }\n    this._animationFrame = this._coreBrowseService.window.requestAnimationFrame(() => {\n      this._refreshDecorations();\n      this._animationFrame = undefined;\n    });\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\nimport { C0 } from 'common/data/EscapeSequences';\n\ninterface IPosition {\n  start: number;\n  end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n  /**\n   * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n   * IME. This variable determines whether the compositionText should be displayed on the UI.\n   */\n  private _isComposing: boolean;\n  public get isComposing(): boolean { return this._isComposing; }\n\n  /**\n   * The position within the input textarea's value of the current composition.\n   */\n  private _compositionPosition: IPosition;\n\n  /**\n   * Whether a composition is in the process of being sent, setting this to false will cancel any\n   * in-progress composition.\n   */\n  private _isSendingComposition: boolean;\n\n  /**\n   * Data already sent due to keydown event.\n   */\n  private _dataAlreadySent: string;\n\n  constructor(\n    private readonly _textarea: HTMLTextAreaElement,\n    private readonly _compositionView: HTMLElement,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IRenderService private readonly _renderService: IRenderService\n  ) {\n    this._isComposing = false;\n    this._isSendingComposition = false;\n    this._compositionPosition = { start: 0, end: 0 };\n    this._dataAlreadySent = '';\n  }\n\n  /**\n   * Handles the compositionstart event, activating the composition view.\n   */\n  public compositionstart(): void {\n    this._isComposing = true;\n    this._compositionPosition.start = this._textarea.value.length;\n    this._compositionView.textContent = '';\n    this._dataAlreadySent = '';\n    this._compositionView.classList.add('active');\n  }\n\n  /**\n   * Handles the compositionupdate event, updating the composition view.\n   * @param ev The event.\n   */\n  public compositionupdate(ev: Pick<CompositionEvent, 'data'>): void {\n    this._compositionView.textContent = ev.data;\n    this.updateCompositionElements();\n    setTimeout(() => {\n      this._compositionPosition.end = this._textarea.value.length;\n    }, 0);\n  }\n\n  /**\n   * Handles the compositionend event, hiding the composition view and sending the composition to\n   * the handler.\n   */\n  public compositionend(): void {\n    this._finalizeComposition(true);\n  }\n\n  /**\n   * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n   * @param ev The keydown event.\n   * @returns Whether the Terminal should continue processing the keydown event.\n   */\n  public keydown(ev: KeyboardEvent): boolean {\n    if (this._isComposing || this._isSendingComposition) {\n      if (ev.keyCode === 229) {\n        // Continue composing if the keyCode is the \"composition character\"\n        return false;\n      }\n      if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n        // Continue composing if the keyCode is a modifier key\n        return false;\n      }\n      // Finish composition immediately. This is mainly here for the case where enter is\n      // pressed and the handler needs to be triggered before the command is executed.\n      this._finalizeComposition(false);\n    }\n\n    if (ev.keyCode === 229) {\n      // If the \"composition character\" is used but gets to this point it means a non-composition\n      // character (eg. numbers and punctuation) was pressed when the IME was active.\n      this._handleAnyTextareaChanges();\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Finalizes the composition, resuming regular input actions. This is called when a composition\n   * is ending.\n   * @param waitForPropagation Whether to wait for events to propagate before sending\n   *   the input. This should be false if a non-composition keystroke is entered before the\n   *   compositionend event is triggered, such as enter, so that the composition is sent before\n   *   the command is executed.\n   */\n  private _finalizeComposition(waitForPropagation: boolean): void {\n    this._compositionView.classList.remove('active');\n    this._isComposing = false;\n\n    if (!waitForPropagation) {\n      // Cancel any delayed composition send requests and send the input immediately.\n      this._isSendingComposition = false;\n      const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n      this._coreService.triggerDataEvent(input, true);\n    } else {\n      // Make a deep copy of the composition position here as a new compositionstart event may\n      // fire before the setTimeout executes.\n      const currentCompositionPosition = {\n        start: this._compositionPosition.start,\n        end: this._compositionPosition.end\n      };\n\n      // Since composition* events happen before the changes take place in the textarea on most\n      // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n      // complete. This ensures the correct character is retrieved.\n      // This solution was used because:\n      // - The compositionend event's data property is unreliable, at least on Chromium\n      // - The last compositionupdate event's data property does not always accurately describe\n      //   the character, a counter example being Korean where an ending consonsant can move to\n      //   the following character if the following input is a vowel.\n      this._isSendingComposition = true;\n      setTimeout(() => {\n        // Ensure that the input has not already been sent\n        if (this._isSendingComposition) {\n          this._isSendingComposition = false;\n          let input;\n          // Add length of data already sent due to keydown event,\n          // otherwise input characters can be duplicated. (Issue #3191)\n          currentCompositionPosition.start += this._dataAlreadySent.length;\n          if (this._isComposing) {\n            // Use the end position to get the string if a new composition has started.\n            input = this._textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);\n          } else {\n            // Don't use the end position here in order to pick up any characters after the\n            // composition has finished, for example when typing a non-composition character\n            // (eg. 2) after a composition character.\n            input = this._textarea.value.substring(currentCompositionPosition.start);\n          }\n          if (input.length > 0) {\n            this._coreService.triggerDataEvent(input, true);\n          }\n        }\n      }, 0);\n    }\n  }\n\n  /**\n   * Apply any changes made to the textarea after the current event chain is allowed to complete.\n   * This should be called when not currently composing but a keydown event with the \"composition\n   * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n   * IME is active.\n   */\n  private _handleAnyTextareaChanges(): void {\n    const oldValue = this._textarea.value;\n    setTimeout(() => {\n      // Ignore if a composition has started since the timeout\n      if (!this._isComposing) {\n        const newValue = this._textarea.value;\n\n        const diff = newValue.replace(oldValue, '');\n\n        this._dataAlreadySent = diff;\n\n        if (newValue.length > oldValue.length) {\n          this._coreService.triggerDataEvent(diff, true);\n        } else if (newValue.length < oldValue.length) {\n          this._coreService.triggerDataEvent(`${C0.DEL}`, true);\n        } else if ((newValue.length === oldValue.length) && (newValue !== oldValue)) {\n          this._coreService.triggerDataEvent(newValue, true);\n        }\n\n      }\n    }, 0);\n  }\n\n  /**\n   * Positions the composition view on top of the cursor and the textarea just below it (so the\n   * IME helper dialog is positioned correctly).\n   * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n   *   necessary as the IME events across browsers are not consistently triggered.\n   */\n  public updateCompositionElements(dontRecurse?: boolean): void {\n    if (!this._isComposing) {\n      return;\n    }\n\n    if (this._bufferService.buffer.isCursorInViewport) {\n      const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n\n      const cellHeight = this._renderService.dimensions.css.cell.height;\n      const cursorTop = this._bufferService.buffer.y * this._renderService.dimensions.css.cell.height;\n      const cursorLeft = cursorX * this._renderService.dimensions.css.cell.width;\n\n      this._compositionView.style.left = cursorLeft + 'px';\n      this._compositionView.style.top = cursorTop + 'px';\n      this._compositionView.style.height = cellHeight + 'px';\n      this._compositionView.style.lineHeight = cellHeight + 'px';\n      this._compositionView.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n      this._compositionView.style.fontSize = this._optionsService.rawOptions.fontSize + 'px';\n      // Sync the textarea to the exact position of the composition view so the IME knows where the\n      // text is.\n      const compositionViewBounds = this._compositionView.getBoundingClientRect();\n      this._textarea.style.left = cursorLeft + 'px';\n      this._textarea.style.top = cursorTop + 'px';\n      // Ensure the text area is at least 1x1, otherwise certain IMEs may break\n      this._textarea.style.width = Math.max(compositionViewBounds.width, 1) + 'px';\n      this._textarea.style.height = Math.max(compositionViewBounds.height, 1) + 'px';\n      this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n    }\n\n    if (!dontRecurse) {\n      setTimeout(() => this.updateCompositionElements(true), 0);\n    }\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n  const rect = element.getBoundingClientRect();\n  const elementStyle = window.getComputedStyle(element);\n  const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'));\n  const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'));\n  return [\n    event.clientX - rect.left - leftPadding,\n    event.clientY - rect.top - topPadding\n  ];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param window The window object the element belongs to.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param hasValidCharSize Whether there is a valid character size available.\n * @param cssCellWidth The cell width device pixel render dimensions.\n * @param cssCellHeight The cell height device pixel render dimensions.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(window: Pick<Window, 'getComputedStyle'>, event: Pick<MouseEvent, 'clientX' | 'clientY'>, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, cssCellWidth: number, cssCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n  // Coordinates cannot be measured if there are no valid\n  if (!hasValidCharSize) {\n    return undefined;\n  }\n\n  const coords = getCoordsRelativeToElement(window, event, element);\n  if (!coords) {\n    return undefined;\n  }\n\n  coords[0] = Math.ceil((coords[0] + (isSelection ? cssCellWidth / 2 : 0)) / cssCellWidth);\n  coords[1] = Math.ceil(coords[1] / cssCellHeight);\n\n  // Ensure coordinates are within the terminal viewport. Note that selections\n  // need an addition point of precision to cover the end point (as characters\n  // cover half of one char and half of the next).\n  coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n  coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n  return coords;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n  UP = 'A',\n  DOWN = 'B',\n  RIGHT = 'C',\n  LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startX = bufferService.buffer.x;\n  const startY = bufferService.buffer.y;\n\n  // The alt buffer should try to navigate between rows\n  if (!bufferService.buffer.hasScrollback) {\n    return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n      moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n      moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n  }\n\n  // Only move horizontally for the normal buffer\n  let direction;\n  if (startY === targetY) {\n    direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n    return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n  }\n  direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n  const rowDifference = Math.abs(startY - targetY);\n  const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n    (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n    colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n  return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n  return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n  return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n    return '';\n  }\n  return repeat(bufferLine(\n    startX, startY, startX,\n    startY - wrappedRowsForRow(startY, bufferService), false, bufferService\n  ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n  return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n  let startRow;\n  if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  const endRow = targetY;\n  const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n  return repeat(bufferLine(\n    startX, startRow, targetX, endRow,\n    direction === Direction.RIGHT, bufferService\n  ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n  let wrappedRows = 0;\n  const startRow = startY - wrappedRowsForRow(startY, bufferService);\n  const endRow = targetY - wrappedRowsForRow(targetY, bufferService);\n\n  for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n    const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n    const line = bufferService.buffer.lines.get(startRow + (direction * i));\n    if (line?.isWrapped) {\n      wrappedRows++;\n    }\n  }\n\n  return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(currentRow: number, bufferService: IBufferService): number {\n  let rowCount = 0;\n  let line = bufferService.buffer.lines.get(currentRow);\n  let lineWraps = line?.isWrapped;\n\n  while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n    rowCount++;\n    line = bufferService.buffer.lines.get(--currentRow);\n    lineWraps = line?.isWrapped;\n  }\n\n  return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n  let startRow;\n  if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n    startRow = targetY - wrappedRowsForRow(targetY, bufferService);\n  } else {\n    startRow = startY;\n  }\n\n  if ((startX < targetX &&\n    startRow <= targetY) || // down/right or same y/right\n    (startX >= targetX &&\n    startRow < targetY)) {  // down/left or same y/left\n    return Direction.RIGHT;\n  }\n  return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n  return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n  startCol: number,\n  startRow: number,\n  endCol: number,\n  endRow: number,\n  forward: boolean,\n  bufferService: IBufferService\n): string {\n  let currentCol = startCol;\n  let currentRow = startRow;\n  let bufferStr = '';\n\n  while (currentCol !== endCol || currentRow !== endRow) {\n    currentCol += forward ? 1 : -1;\n\n    if (forward && currentCol > bufferService.cols - 1) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, startCol, currentCol\n      );\n      currentCol = 0;\n      startCol = 0;\n      currentRow++;\n    } else if (!forward && currentCol < 0) {\n      bufferStr += bufferService.buffer.translateBufferLineToString(\n        currentRow, false, 0, startCol + 1\n      );\n      currentCol = bufferService.cols - 1;\n      startCol = currentCol;\n      currentRow--;\n    }\n  }\n\n  return bufferStr + bufferService.buffer.translateBufferLineToString(\n    currentRow, false, startCol, currentCol\n  );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n  const mod =  applicationCursor ? 'O' : '[';\n  return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param str The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n  count = Math.floor(count);\n  let rpt = '';\n  for (let i = 0; i < count; i++) {\n    rpt += str;\n  }\n  return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent, ReadonlyColorSet } from 'browser/Types';\nimport { color } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IBufferService, IInstantiationService, IOptionsService } from 'common/services/Services';\n\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\n\nlet nextTerminalId = 1;\n\n\n/**\n * A fallback renderer for when canvas is slow. This is not meant to be\n * particularly fast or feature complete, more just stable and usable for when\n * canvas is not an option.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n  private _rowFactory: DomRendererRowFactory;\n  private _terminalClass: number = nextTerminalId++;\n\n  private _themeStyleElement!: HTMLStyleElement;\n  private _dimensionsStyleElement!: HTMLStyleElement;\n  private _rowContainer: HTMLElement;\n  private _rowElements: HTMLElement[] = [];\n  private _selectionContainer: HTMLElement;\n  private _widthCache: WidthCache;\n\n  public dimensions: IRenderDimensions;\n\n  public readonly onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>()).event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _viewportElement: HTMLElement,\n    private readonly _linkifier2: ILinkifier2,\n    @IInstantiationService instantiationService: IInstantiationService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {\n    super();\n    this._rowContainer = document.createElement('div');\n    this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n    this._rowContainer.style.lineHeight = 'normal';\n    this._rowContainer.setAttribute('aria-hidden', 'true');\n    this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n    this._selectionContainer = document.createElement('div');\n    this._selectionContainer.classList.add(SELECTION_CLASS);\n    this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n    this.dimensions = createRenderDimensions();\n    this._updateDimensions();\n    this.register(this._optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n    this.register(this._themeService.onChangeColors(e => this._injectCss(e)));\n    this._injectCss(this._themeService.colors);\n\n    this._rowFactory = instantiationService.createInstance(DomRendererRowFactory, document);\n\n    this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n    this._screenElement.appendChild(this._rowContainer);\n    this._screenElement.appendChild(this._selectionContainer);\n\n    this.register(this._linkifier2.onShowLinkUnderline(e => this._handleLinkHover(e)));\n    this.register(this._linkifier2.onHideLinkUnderline(e => this._handleLinkLeave(e)));\n\n    this.register(toDisposable(() => {\n      this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n      // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n      // https://github.com/xtermjs/xterm.js/issues/2960\n      this._rowContainer.remove();\n      this._selectionContainer.remove();\n      this._widthCache.dispose();\n      this._themeStyleElement.remove();\n      this._dimensionsStyleElement.remove();\n    }));\n\n    this._widthCache = new WidthCache(document);\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  private _updateDimensions(): void {\n    const dpr = this._coreBrowserService.dpr;\n    this.dimensions.device.char.width = this._charSizeService.width * dpr;\n    this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * dpr);\n    this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n    this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n    this.dimensions.device.char.left = 0;\n    this.dimensions.device.char.top = 0;\n    this.dimensions.device.canvas.width = this.dimensions.device.cell.width * this._bufferService.cols;\n    this.dimensions.device.canvas.height = this.dimensions.device.cell.height * this._bufferService.rows;\n    this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / dpr);\n    this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / dpr);\n    this.dimensions.css.cell.width = this.dimensions.css.canvas.width / this._bufferService.cols;\n    this.dimensions.css.cell.height = this.dimensions.css.canvas.height / this._bufferService.rows;\n\n    for (const element of this._rowElements) {\n      element.style.width = `${this.dimensions.css.canvas.width}px`;\n      element.style.height = `${this.dimensions.css.cell.height}px`;\n      element.style.lineHeight = `${this.dimensions.css.cell.height}px`;\n      // Make sure rows don't overflow onto following row\n      element.style.overflow = 'hidden';\n    }\n\n    if (!this._dimensionsStyleElement) {\n      this._dimensionsStyleElement = document.createElement('style');\n      this._screenElement.appendChild(this._dimensionsStyleElement);\n    }\n\n    const styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n      ` display: inline-block;` +   // TODO: find workaround for inline-block (creates ~20% render penalty)\n      ` height: 100%;` +\n      ` vertical-align: top;` +\n      `}`;\n\n    this._dimensionsStyleElement.textContent = styles;\n\n    this._selectionContainer.style.height = this._viewportElement.style.height;\n    this._screenElement.style.width = `${this.dimensions.css.canvas.width}px`;\n    this._screenElement.style.height = `${this.dimensions.css.canvas.height}px`;\n  }\n\n  private _injectCss(colors: ReadonlyColorSet): void {\n    if (!this._themeStyleElement) {\n      this._themeStyleElement = document.createElement('style');\n      this._screenElement.appendChild(this._themeStyleElement);\n    }\n\n    // Base CSS\n    let styles =\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n      ` color: ${colors.foreground.css};` +\n      ` font-family: ${this._optionsService.rawOptions.fontFamily};` +\n      ` font-size: ${this._optionsService.rawOptions.fontSize}px;` +\n      ` font-kerning: none;` +\n      ` white-space: pre` +\n      `}`;\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .xterm-dim {` +\n      ` color: ${color.multiplyOpacity(colors.foreground, 0.5).css};` +\n      `}`;\n    // Text styles\n    styles +=\n      `${this._terminalSelector} span:not(.${RowCss.BOLD_CLASS}) {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeight};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.BOLD_CLASS} {` +\n      ` font-weight: ${this._optionsService.rawOptions.fontWeightBold};` +\n      `}` +\n      `${this._terminalSelector} span.${RowCss.ITALIC_CLASS} {` +\n      ` font-style: italic;` +\n      `}`;\n    // Blink animation\n    styles +=\n      `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +\n      ` 50% {` +\n      `  border-bottom-style: hidden;` +\n      ` }` +\n      `}`;\n    styles +=\n      `@keyframes blink_block` + `_` + this._terminalClass + ` {` +\n      ` 0% {` +\n      `  background-color: ${colors.cursor.css};` +\n      `  color: ${colors.cursorAccent.css};` +\n      ` }` +\n      ` 50% {` +\n      `  background-color: inherit;` +\n      `  color: ${colors.cursor.css};` +\n      ` }` +\n      `}`;\n    // Cursor\n    styles +=\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}:not(.${RowCss.CURSOR_STYLE_BLOCK_CLASS}) {` +\n      ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_BLINK_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BLOCK_CLASS} {` +\n      ` background-color: ${colors.cursor.css};` +\n      ` color: ${colors.cursorAccent.css};` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_OUTLINE_CLASS} {` +\n      ` outline: 1px solid ${colors.cursor.css};` +\n      ` outline-offset: -1px;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_BAR_CLASS} {` +\n      ` box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${colors.cursor.css} inset;` +\n      `}` +\n      `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${RowCss.CURSOR_CLASS}.${RowCss.CURSOR_STYLE_UNDERLINE_CLASS} {` +\n      ` border-bottom: 1px ${colors.cursor.css};` +\n      ` border-bottom-style: solid;` +\n      ` height: calc(100% - 1px);` +\n      `}`;\n    // Selection\n    styles +=\n      `${this._terminalSelector} .${SELECTION_CLASS} {` +\n      ` position: absolute;` +\n      ` top: 0;` +\n      ` left: 0;` +\n      ` z-index: 1;` +\n      ` pointer-events: none;` +\n      `}` +\n      `${this._terminalSelector}.focus .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionBackgroundOpaque.css};` +\n      `}` +\n      `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n      ` position: absolute;` +\n      ` background-color: ${colors.selectionInactiveBackgroundOpaque.css};` +\n      `}`;\n    // Colors\n    for (const [i, c] of colors.ansi.entries()) {\n      styles +=\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n        `${this._terminalSelector} .${FG_CLASS_PREFIX}${i}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(c, 0.5).css}; }` +\n        `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n    }\n    styles +=\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(colors.background).css}; }` +\n      `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR}.${RowCss.DIM_CLASS} { color: ${color.multiplyOpacity(color.opaque(colors.background), 0.5).css}; }` +\n      `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${colors.foreground.css}; }`;\n\n    this._themeStyleElement.textContent = styles;\n  }\n\n  /**\n   * default letter spacing\n   * Due to rounding issues in dimensions dpr calc glyph might render\n   * slightly too wide or too narrow. The method corrects the stacking offsets\n   * by applying a default letter-spacing for all chars.\n   * The value gets passed to the row factory to avoid setting this value again\n   * (render speedup is roughly 10%).\n   */\n  private _setDefaultSpacing(): void {\n    // measure same char as in CharSizeService to get the base deviation\n    const spacing = this.dimensions.css.cell.width - this._widthCache.get('W', false, false);\n    this._rowContainer.style.letterSpacing = `${spacing}px`;\n    this._rowFactory.defaultSpacing = spacing;\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  private _refreshRowElements(cols: number, rows: number): void {\n    // Add missing elements\n    for (let i = this._rowElements.length; i <= rows; i++) {\n      const row = document.createElement('div');\n      this._rowContainer.appendChild(row);\n      this._rowElements.push(row);\n    }\n    // Remove excess elements\n    while (this._rowElements.length > rows) {\n      this._rowContainer.removeChild(this._rowElements.pop()!);\n    }\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    this._refreshRowElements(cols, rows);\n    this._updateDimensions();\n  }\n\n  public handleCharSizeChanged(): void {\n    this._updateDimensions();\n    this._widthCache.clear();\n    this._setDefaultSpacing();\n  }\n\n  public handleBlur(): void {\n    this._rowContainer.classList.remove(FOCUS_CLASS);\n  }\n\n  public handleFocus(): void {\n    this._rowContainer.classList.add(FOCUS_CLASS);\n    this.renderRows(this._bufferService.buffer.y, this._bufferService.buffer.y);\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    // Remove all selections\n    this._selectionContainer.replaceChildren();\n    this._rowFactory.handleSelectionChanged(start, end, columnSelectMode);\n    this.renderRows(0, this._bufferService.rows - 1);\n\n    // Selection does not exist\n    if (!start || !end) {\n      return;\n    }\n\n    // Translate from buffer position to viewport position\n    const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n    const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n    const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n    const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n    // No need to draw the selection\n    if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n      return;\n    }\n\n    // Create the selections\n    const documentFragment = document.createDocumentFragment();\n\n    if (columnSelectMode) {\n      const isXFlipped = start[0] > end[0];\n      documentFragment.appendChild(\n        this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n      );\n    } else {\n      // Draw first row\n      const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n      const endCol = viewportCappedStartRow === viewportEndRow ? end[0] : this._bufferService.cols;\n      documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n      // Draw middle rows\n      const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n      documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n      // Draw final row\n      if (viewportCappedStartRow !== viewportCappedEndRow) {\n        // Only draw viewportEndRow if it's not the same as viewporttartRow\n        const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n        documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));\n      }\n    }\n    this._selectionContainer.appendChild(documentFragment);\n  }\n\n  /**\n   * Creates a selection element at the specified position.\n   * @param row The row of the selection.\n   * @param colStart The start column.\n   * @param colEnd The end columns.\n   */\n  private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n    const element = document.createElement('div');\n    element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;\n    element.style.top = `${row * this.dimensions.css.cell.height}px`;\n    element.style.left = `${colStart * this.dimensions.css.cell.width}px`;\n    element.style.width = `${this.dimensions.css.cell.width * (colEnd - colStart)}px`;\n    return element;\n  }\n\n  public handleCursorMove(): void {\n    // No-op, the cursor is drawn when rows are drawn\n  }\n\n  private _handleOptionsChanged(): void {\n    // Force a refresh\n    this._updateDimensions();\n    // Refresh CSS\n    this._injectCss(this._themeService.colors);\n    // update spacing cache\n    this._widthCache.setFont(\n      this._optionsService.rawOptions.fontFamily,\n      this._optionsService.rawOptions.fontSize,\n      this._optionsService.rawOptions.fontWeight,\n      this._optionsService.rawOptions.fontWeightBold\n    );\n    this._setDefaultSpacing();\n  }\n\n  public clear(): void {\n    for (const e of this._rowElements) {\n      /**\n       * NOTE: This used to be `e.innerText = '';` but that doesn't work when using `jsdom` and\n       * `@testing-library/react`\n       *\n       * references:\n       * - https://github.com/testing-library/react-testing-library/issues/1146\n       * - https://github.com/jsdom/jsdom/issues/1245\n       */\n      e.replaceChildren();\n    }\n  }\n\n  public renderRows(start: number, end: number): void {\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, this._bufferService.cols - 1);\n    const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n\n    for (let y = start; y <= end; y++) {\n      const row = y + buffer.ydisp;\n      const rowElement = this._rowElements[y];\n      const lineData = buffer.lines.get(row);\n      if (!rowElement || !lineData) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          lineData,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          -1,\n          -1\n        )\n      );\n    }\n  }\n\n  private get _terminalSelector(): string {\n    return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n  }\n\n  private _handleLinkHover(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n  }\n\n  private _handleLinkLeave(e: ILinkifierEvent): void {\n    this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n  }\n\n  private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n    /**\n     * NOTE: The linkifier may send out of viewport y-values if:\n     * - negative y-value: the link started at a higher line\n     * - y-value >= maxY: the link ends at a line below viewport\n     *\n     * For negative y-values we can simply adjust x = 0,\n     * as higher up link start means, that everything from\n     * (0,0) is a link under top-down-left-right char progression\n     *\n     * Additionally there might be a small chance of out-of-sync x|y-values\n     * from a race condition of render updates vs. link event handler execution:\n     * - (sync) resize: chances terminal buffer in sync, schedules render update async\n     * - (async) link handler race condition: new buffer metrics, but still on old render state\n     * - (async) render update: brings term metrics and render state back in sync\n     */\n    // clip coords into viewport\n    if (y < 0) x = 0;\n    if (y2 < 0) x2 = 0;\n    const maxY = this._bufferService.rows - 1;\n    y = Math.max(Math.min(y, maxY), 0);\n    y2 = Math.max(Math.min(y2, maxY), 0);\n\n    cols = Math.min(cols, this._bufferService.cols);\n    const buffer = this._bufferService.buffer;\n    const cursorAbsoluteY = buffer.ybase + buffer.y;\n    const cursorX = Math.min(buffer.x, cols - 1);\n    const cursorBlink = this._optionsService.rawOptions.cursorBlink;\n    const cursorStyle = this._optionsService.rawOptions.cursorStyle;\n    const cursorInactiveStyle = this._optionsService.rawOptions.cursorInactiveStyle;\n\n    // refresh rows within link range\n    for (let i = y; i <= y2; ++i) {\n      const row = i + buffer.ydisp;\n      const rowElement = this._rowElements[i];\n      const bufferline = buffer.lines.get(row);\n      if (!rowElement || !bufferline) {\n        break;\n      }\n      rowElement.replaceChildren(\n        ...this._rowFactory.createRow(\n          bufferline,\n          row,\n          row === cursorAbsoluteY,\n          cursorStyle,\n          cursorInactiveStyle,\n          cursorX,\n          cursorBlink,\n          this.dimensions.css.cell.width,\n          this._widthCache,\n          enabled ? (i === y ? x : 0) : -1,\n          enabled ? ((i === y2 ? x2 : cols) - 1) : -1\n        )\n      );\n    }\n  }\n}\n","/**\n * Copyright (c) 2018, 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, IColor } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { color, rgba } from 'common/Color';\nimport { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { JoinedCellData } from 'browser/services/CharacterJoinerService';\nimport { excludeFromContrastRatioDemands } from 'browser/renderer/shared/RendererUtils';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WidthCache } from 'browser/renderer/dom/WidthCache';\nimport { IColorContrastCache } from 'browser/Types';\n\n\nexport const enum RowCss {\n  BOLD_CLASS = 'xterm-bold',\n  DIM_CLASS = 'xterm-dim',\n  ITALIC_CLASS = 'xterm-italic',\n  UNDERLINE_CLASS = 'xterm-underline',\n  OVERLINE_CLASS = 'xterm-overline',\n  STRIKETHROUGH_CLASS = 'xterm-strikethrough',\n  CURSOR_CLASS = 'xterm-cursor',\n  CURSOR_BLINK_CLASS = 'xterm-cursor-blink',\n  CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block',\n  CURSOR_STYLE_OUTLINE_CLASS = 'xterm-cursor-outline',\n  CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar',\n  CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline'\n}\n\n\nexport class DomRendererRowFactory {\n  private _workCell: CellData = new CellData();\n\n  private _selectionStart: [number, number] | undefined;\n  private _selectionEnd: [number, number] | undefined;\n  private _columnSelectMode: boolean = false;\n\n  public defaultSpacing = 0;\n\n  constructor(\n    private readonly _document: Document,\n    @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IDecorationService private readonly _decorationService: IDecorationService,\n    @IThemeService private readonly _themeService: IThemeService\n  ) {}\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionStart = start;\n    this._selectionEnd = end;\n    this._columnSelectMode = columnSelectMode;\n  }\n\n  public createRow(\n    lineData: IBufferLine,\n    row: number,\n    isCursorRow: boolean,\n    cursorStyle: string | undefined,\n    cursorInactiveStyle: string | undefined,\n    cursorX: number,\n    cursorBlink: boolean,\n    cellWidth: number,\n    widthCache: WidthCache,\n    linkStart: number,\n    linkEnd: number\n  ): HTMLSpanElement[] {\n\n    const elements: HTMLSpanElement[] = [];\n    const joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n    const colors = this._themeService.colors;\n\n    let lineLength = lineData.getNoBgTrimmedLength();\n    if (isCursorRow && lineLength < cursorX + 1) {\n      lineLength = cursorX + 1;\n    }\n\n    let charElement: HTMLSpanElement | undefined;\n    let cellAmount = 0;\n    let text = '';\n    let oldBg = 0;\n    let oldFg = 0;\n    let oldExt = 0;\n    let oldLinkHover: number | boolean = false;\n    let oldSpacing = 0;\n    let oldIsInSelection: boolean = false;\n    let spacing = 0;\n    const classes: string[] = [];\n\n    const hasHover = linkStart !== -1 && linkEnd !== -1;\n\n    for (let x = 0; x < lineLength; x++) {\n      lineData.loadCell(x, this._workCell);\n      let width = this._workCell.getWidth();\n\n      // The character to the left is a wide character, drawing is owned by the char at x-1\n      if (width === 0) {\n        continue;\n      }\n\n      // If true, indicates that the current character(s) to draw were joined.\n      let isJoined = false;\n      let lastCharX = x;\n\n      // Process any joined character ranges as needed. Because of how the\n      // ranges are produced, we know that they are valid for the characters\n      // and attributes of our input.\n      let cell = this._workCell;\n      if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n        isJoined = true;\n        const range = joinedRanges.shift()!;\n\n        // We already know the exact start and end column of the joined range,\n        // so we get the string and width representing it directly\n        cell = new JoinedCellData(\n          this._workCell,\n          lineData.translateToString(true, range[0], range[1]),\n          range[1] - range[0]\n        );\n\n        // Skip over the cells occupied by this range in the loop\n        lastCharX = range[1] - 1;\n\n        // Recalculate width\n        width = cell.getWidth();\n      }\n\n      const isInSelection = this._isCellInSelection(x, row);\n      const isCursorCell = isCursorRow && x === cursorX;\n      const isLinkHover = hasHover && x >= linkStart && x <= linkEnd;\n\n      let isDecorated = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        isDecorated = true;\n      });\n\n      // get chars to render for this cell\n      let chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n      if (chars === ' ' && (cell.isUnderline() || cell.isOverline())) {\n        chars = '\\xa0';\n      }\n\n      // lookup char render width and calc spacing\n      spacing = width * cellWidth - widthCache.get(chars, cell.isBold(), cell.isItalic());\n\n      if (!charElement) {\n        charElement = this._document.createElement('span');\n      } else {\n        /**\n         * chars can only be merged on existing span if:\n         * - existing span only contains mergeable chars (cellAmount != 0)\n         * - bg did not change (or both are in selection)\n         * - fg did not change (or both are in selection and selection fg is set)\n         * - ext did not change\n         * - underline from hover state did not change\n         * - cell content renders to same letter-spacing\n         * - cell is not cursor\n         */\n        if (\n          cellAmount\n          && (\n            (isInSelection && oldIsInSelection)\n            || (!isInSelection && !oldIsInSelection && cell.bg === oldBg)\n          )\n          && (\n            (isInSelection && oldIsInSelection && colors.selectionForeground)\n            || cell.fg === oldFg\n          )\n          && cell.extended.ext === oldExt\n          && isLinkHover === oldLinkHover\n          && spacing === oldSpacing\n          && !isCursorCell\n          && !isJoined\n          && !isDecorated\n        ) {\n          // no span alterations, thus only account chars skipping all code below\n          text += chars;\n          cellAmount++;\n          continue;\n        } else {\n          /**\n           * cannot merge:\n           * - apply left-over text to old span\n           * - create new span, reset state holders cellAmount & text\n           */\n          if (cellAmount) {\n            charElement.textContent = text;\n          }\n          charElement = this._document.createElement('span');\n          cellAmount = 0;\n          text = '';\n        }\n      }\n      // preserve conditions for next merger eval round\n      oldBg = cell.bg;\n      oldFg = cell.fg;\n      oldExt = cell.extended.ext;\n      oldLinkHover = isLinkHover;\n      oldSpacing = spacing;\n      oldIsInSelection = isInSelection;\n\n      if (isJoined) {\n        // The DOM renderer colors the background of the cursor but for ligatures all cells are\n        // joined. The workaround here is to show a cursor around the whole ligature so it shows up,\n        // the cursor looks the same when on any character of the ligature though\n        if (cursorX >= x && cursorX <= lastCharX) {\n          cursorX = x;\n        }\n      }\n\n      if (!this._coreService.isCursorHidden && isCursorCell) {\n        classes.push(RowCss.CURSOR_CLASS);\n        if (this._coreBrowserService.isFocused) {\n          if (cursorBlink) {\n            classes.push(RowCss.CURSOR_BLINK_CLASS);\n          }\n          classes.push(\n            cursorStyle === 'bar'\n              ? RowCss.CURSOR_STYLE_BAR_CLASS\n              : cursorStyle === 'underline'\n                ? RowCss.CURSOR_STYLE_UNDERLINE_CLASS\n                : RowCss.CURSOR_STYLE_BLOCK_CLASS\n          );\n        } else {\n          if (cursorInactiveStyle) {\n            switch (cursorInactiveStyle) {\n              case 'outline':\n                classes.push(RowCss.CURSOR_STYLE_OUTLINE_CLASS);\n                break;\n              case 'block':\n                classes.push(RowCss.CURSOR_STYLE_BLOCK_CLASS);\n                break;\n              case 'bar':\n                classes.push(RowCss.CURSOR_STYLE_BAR_CLASS);\n                break;\n              case 'underline':\n                classes.push(RowCss.CURSOR_STYLE_UNDERLINE_CLASS);\n                break;\n              default:\n                break;\n            }\n          }\n        }\n      }\n\n      if (cell.isBold()) {\n        classes.push(RowCss.BOLD_CLASS);\n      }\n\n      if (cell.isItalic()) {\n        classes.push(RowCss.ITALIC_CLASS);\n      }\n\n      if (cell.isDim()) {\n        classes.push(RowCss.DIM_CLASS);\n      }\n\n      if (cell.isInvisible()) {\n        text = WHITESPACE_CELL_CHAR;\n      } else {\n        text = cell.getChars() || WHITESPACE_CELL_CHAR;\n      }\n\n      if (cell.isUnderline()) {\n        classes.push(`${RowCss.UNDERLINE_CLASS}-${cell.extended.underlineStyle}`);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n        if (!cell.isUnderlineColorDefault()) {\n          if (cell.isUnderlineColorRGB()) {\n            charElement.style.textDecorationColor = `rgb(${AttributeData.toColorRGB(cell.getUnderlineColor()).join(',')})`;\n          } else {\n            let fg = cell.getUnderlineColor();\n            if (this._optionsService.rawOptions.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n              fg += 8;\n            }\n            charElement.style.textDecorationColor = colors.ansi[fg].css;\n          }\n        }\n      }\n\n      if (cell.isOverline()) {\n        classes.push(RowCss.OVERLINE_CLASS);\n        if (text === ' ') {\n          text = '\\xa0'; // = &nbsp;\n        }\n      }\n\n      if (cell.isStrikethrough()) {\n        classes.push(RowCss.STRIKETHROUGH_CLASS);\n      }\n\n      // apply link hover underline late, effectively overrides any previous text-decoration\n      // settings\n      if (isLinkHover) {\n        charElement.style.textDecoration = 'underline';\n      }\n\n      let fg = cell.getFgColor();\n      let fgColorMode = cell.getFgColorMode();\n      let bg = cell.getBgColor();\n      let bgColorMode = cell.getBgColorMode();\n      const isInverse = !!cell.isInverse();\n      if (isInverse) {\n        const temp = fg;\n        fg = bg;\n        bg = temp;\n        const temp2 = fgColorMode;\n        fgColorMode = bgColorMode;\n        bgColorMode = temp2;\n      }\n\n      // Apply any decoration foreground/background overrides, this must happen after inverse has\n      // been applied\n      let bgOverride: IColor | undefined;\n      let fgOverride: IColor | undefined;\n      let isTop = false;\n      this._decorationService.forEachDecorationAtCell(x, row, undefined, d => {\n        if (d.options.layer !== 'top' && isTop) {\n          return;\n        }\n        if (d.backgroundColorRGB) {\n          bgColorMode = Attributes.CM_RGB;\n          bg = d.backgroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          bgOverride = d.backgroundColorRGB;\n        }\n        if (d.foregroundColorRGB) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = d.foregroundColorRGB.rgba >> 8 & 0xFFFFFF;\n          fgOverride = d.foregroundColorRGB;\n        }\n        isTop = d.options.layer === 'top';\n      });\n\n      // Apply selection\n      if (!isTop && isInSelection) {\n        // If in the selection, force the element to be above the selection to improve contrast and\n        // support opaque selections. The applies background is not actually needed here as\n        // selection is drawn in a seperate container, the main purpose of this to ensuring minimum\n        // contrast ratio\n        bgOverride = this._coreBrowserService.isFocused ? colors.selectionBackgroundOpaque : colors.selectionInactiveBackgroundOpaque;\n        bg = bgOverride.rgba >> 8 & 0xFFFFFF;\n        bgColorMode = Attributes.CM_RGB;\n        // Since an opaque selection is being rendered, the selection pretends to be a decoration to\n        // ensure text is drawn above the selection.\n        isTop = true;\n        // Apply selection foreground if applicable\n        if (colors.selectionForeground) {\n          fgColorMode = Attributes.CM_RGB;\n          fg = colors.selectionForeground.rgba >> 8 & 0xFFFFFF;\n          fgOverride = colors.selectionForeground;\n        }\n      }\n\n      // If it's a top decoration, render above the selection\n      if (isTop) {\n        classes.push('xterm-decoration-top');\n      }\n\n      // Background\n      let resolvedBg: IColor;\n      switch (bgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          resolvedBg = colors.ansi[bg];\n          classes.push(`xterm-bg-${bg}`);\n          break;\n        case Attributes.CM_RGB:\n          resolvedBg = rgba.toColor(bg >> 16, bg >> 8 & 0xFF, bg & 0xFF);\n          this._addStyle(charElement, `background-color:#${padStart((bg >>> 0).toString(16), '0', 6)}`);\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (isInverse) {\n            resolvedBg = colors.foreground;\n            classes.push(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n          } else {\n            resolvedBg = colors.background;\n          }\n      }\n\n      // If there is no background override by now it's the original color, so apply dim if needed\n      if (!bgOverride) {\n        if (cell.isDim()) {\n          bgOverride = color.multiplyOpacity(resolvedBg, 0.5);\n        }\n      }\n\n      // Foreground\n      switch (fgColorMode) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:\n          if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) {\n            fg += 8;\n          }\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.ansi[fg], cell, bgOverride, undefined)) {\n            classes.push(`xterm-fg-${fg}`);\n          }\n          break;\n        case Attributes.CM_RGB:\n          const color = rgba.toColor(\n            (fg >> 16) & 0xFF,\n            (fg >>  8) & 0xFF,\n            (fg      ) & 0xFF\n          );\n          if (!this._applyMinimumContrast(charElement, resolvedBg, color, cell, bgOverride, fgOverride)) {\n            this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`);\n          }\n          break;\n        case Attributes.CM_DEFAULT:\n        default:\n          if (!this._applyMinimumContrast(charElement, resolvedBg, colors.foreground, cell, bgOverride, undefined)) {\n            if (isInverse) {\n              classes.push(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n            }\n          }\n      }\n\n      // apply CSS classes\n      // slightly faster than using classList by omitting\n      // checks for doubled entries (code above should not have doublets)\n      if (classes.length) {\n        charElement.className = classes.join(' ');\n        classes.length = 0;\n      }\n\n      // exclude conditions for cell merging - never merge these\n      if (!isCursorCell && !isJoined && !isDecorated) {\n        cellAmount++;\n      } else {\n        charElement.textContent = text;\n      }\n      // apply letter-spacing rule\n      if (spacing !== this.defaultSpacing) {\n        charElement.style.letterSpacing = `${spacing}px`;\n      }\n\n      elements.push(charElement);\n      x = lastCharX;\n    }\n\n    // postfix text of last merged span\n    if (charElement && cellAmount) {\n      charElement.textContent = text;\n    }\n\n    return elements;\n  }\n\n  private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData, bgOverride: IColor | undefined, fgOverride: IColor | undefined): boolean {\n    if (this._optionsService.rawOptions.minimumContrastRatio === 1 || excludeFromContrastRatioDemands(cell.getCode())) {\n      return false;\n    }\n\n    // Try get from cache first, only use the cache when there are no decoration overrides\n    const cache = this._getContrastCache(cell);\n    let adjustedColor: IColor | undefined | null = undefined;\n    if (!bgOverride && !fgOverride) {\n      adjustedColor = cache.getColor(bg.rgba, fg.rgba);\n    }\n\n    // Calculate and store in cache\n    if (adjustedColor === undefined) {\n      // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n      // non-dim cells\n      const ratio = this._optionsService.rawOptions.minimumContrastRatio / (cell.isDim() ? 2 : 1);\n      adjustedColor = color.ensureContrastRatio(bgOverride || bg, fgOverride || fg, ratio);\n      cache.setColor((bgOverride || bg).rgba, (fgOverride || fg).rgba, adjustedColor ?? null);\n    }\n\n    if (adjustedColor) {\n      this._addStyle(element, `color:${adjustedColor.css}`);\n      return true;\n    }\n\n    return false;\n  }\n\n  private _getContrastCache(cell: ICellData): IColorContrastCache {\n    if (cell.isDim()) {\n      return this._themeService.colors.halfContrastCache;\n    }\n    return this._themeService.colors.contrastCache;\n  }\n\n  private _addStyle(element: HTMLElement, style: string): void {\n    element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n  }\n\n  private _isCellInSelection(x: number, y: number): boolean {\n    const start = this._selectionStart;\n    const end = this._selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    if (this._columnSelectMode) {\n      if (start[0] <= end[0]) {\n        return x >= start[0] && y >= start[1] &&\n          x < end[0] && y <= end[1];\n      }\n      return x < start[0] && y >= start[1] &&\n        x >= end[0] && y <= end[1];\n    }\n    return (y > start[1] && y < end[1]) ||\n        (start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||\n        (start[1] < end[1] && y === end[1] && x < end[0]) ||\n        (start[1] < end[1] && y === start[1] && x >= start[0]);\n  }\n}\n\nfunction padStart(text: string, padChar: string, length: number): string {\n  while (text.length < length) {\n    text = padChar + text;\n  }\n  return text;\n}\n","/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { FontWeight } from 'common/services/Services';\n\n\nexport const enum WidthCacheSettings {\n  /** sentinel for unset values in flat cache */\n  FLAT_UNSET = -9999,\n  /** size of flat cache, size-1 equals highest codepoint handled by flat */\n  FLAT_SIZE = 256,\n  /** char repeat for measuring */\n  REPEAT = 32\n}\n\n\nconst enum FontVariant {\n  REGULAR = 0,\n  BOLD = 1,\n  ITALIC = 2,\n  BOLD_ITALIC = 3\n}\n\n\nexport class WidthCache implements IDisposable {\n  // flat cache for regular variant up to CacheSettings.FLAT_SIZE\n  // NOTE: ~4x faster access than holey (serving >>80% of terminal content)\n  //       It has a small memory footprint (only 1MB for full BMP caching),\n  //       still the sweet spot is not reached before touching 32k different codepoints,\n  //       thus we store the remaining <<20% of terminal data in a holey structure.\n  protected _flat = new Float32Array(WidthCacheSettings.FLAT_SIZE);\n\n  // holey cache for bold, italic and bold&italic for any string\n  // FIXME: can grow really big over time (~8.5 MB for full BMP caching),\n  //        so a shared API across terminals is needed\n  protected _holey: Map<string, number> | undefined;\n\n  private _font = '';\n  private _fontSize = 0;\n  private _weight: FontWeight = 'normal';\n  private _weightBold: FontWeight = 'bold';\n  private _container: HTMLDivElement;\n  private _measureElements: HTMLSpanElement[] = [];\n\n  constructor(_document: Document) {\n    this._container = _document.createElement('div');\n    this._container.style.position = 'absolute';\n    this._container.style.top = '-50000px';\n    this._container.style.width = '50000px';\n    // SP should stack in spans\n    this._container.style.whiteSpace = 'pre';\n    // avoid undercuts in non-monospace fonts from kerning\n    this._container.style.fontKerning = 'none';\n\n    const regular = _document.createElement('span');\n\n    const bold = _document.createElement('span');\n    bold.style.fontWeight = 'bold';\n\n    const italic = _document.createElement('span');\n    italic.style.fontStyle = 'italic';\n\n    const boldItalic = _document.createElement('span');\n    boldItalic.style.fontWeight = 'bold';\n    boldItalic.style.fontStyle = 'italic';\n\n    // NOTE: must be in order of FontVariant\n    this._measureElements = [regular, bold, italic, boldItalic];\n    this._container.appendChild(regular);\n    this._container.appendChild(bold);\n    this._container.appendChild(italic);\n    this._container.appendChild(boldItalic);\n\n    _document.body.appendChild(this._container);\n\n    this.clear();\n  }\n\n  public dispose(): void {\n    this._container.remove();           // remove elements from DOM\n    this._measureElements.length = 0;   // release element refs\n    this._holey = undefined;            // free cache memory via GC\n  }\n\n  /**\n   * Clear the width cache.\n   */\n  public clear(): void {\n    this._flat.fill(WidthCacheSettings.FLAT_UNSET);\n    // .clear() has some overhead, re-assign instead (>3 times faster)\n    this._holey = new Map<string, number>();\n  }\n\n  /**\n   * Set the font for measuring.\n   * Must be called for any changes on font settings.\n   * Also clears the cache.\n   */\n  public setFont(font: string, fontSize: number, weight: FontWeight, weightBold: FontWeight): void {\n    // skip if nothing changed\n    if (font === this._font\n      && fontSize === this._fontSize\n      && weight === this._weight\n      && weightBold === this._weightBold\n    ) {\n      return;\n    }\n\n    this._font = font;\n    this._fontSize = fontSize;\n    this._weight = weight;\n    this._weightBold = weightBold;\n\n    this._container.style.fontFamily = this._font;\n    this._container.style.fontSize = `${this._fontSize}px`;\n    this._measureElements[FontVariant.REGULAR].style.fontWeight = `${weight}`;\n    this._measureElements[FontVariant.BOLD].style.fontWeight = `${weightBold}`;\n    this._measureElements[FontVariant.ITALIC].style.fontWeight = `${weight}`;\n    this._measureElements[FontVariant.BOLD_ITALIC].style.fontWeight = `${weightBold}`;\n\n    this.clear();\n  }\n\n  /**\n   * Get the render width for cell content `c` with current font settings.\n   * `variant` denotes the font variant to be used.\n   */\n  public get(c: string, bold: boolean | number, italic: boolean | number): number {\n    let cp = 0;\n    if (!bold && !italic && c.length === 1 && (cp = c.charCodeAt(0)) < WidthCacheSettings.FLAT_SIZE) {\n      return this._flat[cp] !== WidthCacheSettings.FLAT_UNSET\n        ? this._flat[cp]\n        : (this._flat[cp] = this._measure(c, 0));\n    }\n    let key = c;\n    if (bold) key += 'B';\n    if (italic) key += 'I';\n    let width = this._holey!.get(key);\n    if (width === undefined) {\n      let variant = 0;\n      if (bold) variant |= FontVariant.BOLD;\n      if (italic) variant |= FontVariant.ITALIC;\n      width = this._measure(c, variant);\n      this._holey!.set(key, width);\n    }\n    return width;\n  }\n\n  protected _measure(c: string, variant: FontVariant): number {\n    const el = this._measureElements[variant];\n    el.textContent = c.repeat(WidthCacheSettings.REPEAT);\n    return el.offsetWidth / WidthCacheSettings.REPEAT;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n  if (!value) {\n    throw new Error('value must not be falsy');\n  }\n  return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n  // Only return true for Powerline symbols which require\n  // different padding and should be excluded from minimum contrast\n  // ratio standards\n  return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n  return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n  return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function excludeFromContrastRatioDemands(codepoint: number): boolean {\n  return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n  return {\n    css: {\n      canvas: createDimension(),\n      cell: createDimension()\n    },\n    device: {\n      canvas: createDimension(),\n      cell: createDimension(),\n      char: {\n        width: 0,\n        height: 0,\n        left: 0,\n        top: 0\n      }\n    }\n  };\n}\n\nfunction createDimension(): IDimensions {\n  return {\n    width: 0,\n    height: 0\n  };\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n  /**\n   * Whether select all is currently active.\n   */\n  public isSelectAllActive: boolean = false;\n\n  /**\n   * The minimal length of the selection from the start position. When double\n   * clicking on a word, the word will be selected which makes the selection\n   * start at the start of the word and makes this variable the length.\n   */\n  public selectionStartLength: number = 0;\n\n  /**\n   * The [x, y] position the selection starts at.\n   */\n  public selectionStart: [number, number] | undefined;\n\n  /**\n   * The [x, y] position the selection ends at.\n   */\n  public selectionEnd: [number, number] | undefined;\n\n  constructor(\n    private _bufferService: IBufferService\n  ) {\n  }\n\n  /**\n   * Clears the current selection.\n   */\n  public clearSelection(): void {\n    this.selectionStart = undefined;\n    this.selectionEnd = undefined;\n    this.isSelectAllActive = false;\n    this.selectionStartLength = 0;\n  }\n\n  /**\n   * The final selection start, taking into consideration select all.\n   */\n  public get finalSelectionStart(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [0, 0];\n    }\n\n    if (!this.selectionEnd || !this.selectionStart) {\n      return this.selectionStart;\n    }\n\n    return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n  }\n\n  /**\n   * The final selection end, taking into consideration select all, double click\n   * word selection and triple click line selection.\n   */\n  public get finalSelectionEnd(): [number, number] | undefined {\n    if (this.isSelectAllActive) {\n      return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n    }\n\n    if (!this.selectionStart) {\n      return undefined;\n    }\n\n    // Use the selection start + length if the end doesn't exist or they're reversed\n    if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n      const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n      if (startPlusLength > this._bufferService.cols) {\n        // Ensure the trailing EOL isn't included when the selection ends on the right edge\n        if (startPlusLength % this._bufferService.cols === 0) {\n          return [this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols) - 1];\n        }\n        return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n      }\n      return [startPlusLength, this.selectionStart[1]];\n    }\n\n    // Ensure the the word/line is selected after a double/triple click\n    if (this.selectionStartLength) {\n      // Select the larger of the two when start and end are on the same line\n      if (this.selectionEnd[1] === this.selectionStart[1]) {\n        // Keep the whole wrapped word/line selected if the content wraps multiple lines\n        const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n        if (startPlusLength > this._bufferService.cols) {\n          return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n        }\n        return [Math.max(startPlusLength, this.selectionEnd[0]), this.selectionEnd[1]];\n      }\n    }\n    return this.selectionEnd;\n  }\n\n  /**\n   * Returns whether the selection start and end are reversed.\n   */\n  public areSelectionValuesReversed(): boolean {\n    const start = this.selectionStart;\n    const end = this.selectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   * @returns Whether a refresh is necessary.\n   */\n  public handleTrim(amount: number): boolean {\n    // Adjust the selection position based on the trimmed amount.\n    if (this.selectionStart) {\n      this.selectionStart[1] -= amount;\n    }\n    if (this.selectionEnd) {\n      this.selectionEnd[1] -= amount;\n    }\n\n    // The selection has moved off the buffer, clear it.\n    if (this.selectionEnd && this.selectionEnd[1] < 0) {\n      this.clearSelection();\n      return true;\n    }\n\n    // If the selection start is trimmed, ensure the start column is 0.\n    if (this.selectionStart && this.selectionStart[1] < 0) {\n      this.selectionStart[1] = 0;\n    }\n    return false;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { Disposable } from 'common/Lifecycle';\n\n\nconst enum MeasureSettings {\n  REPEAT = 32\n}\n\n\nexport class CharSizeService extends Disposable implements ICharSizeService {\n  public serviceBrand: undefined;\n\n  public width: number = 0;\n  public height: number = 0;\n  private _measureStrategy: IMeasureStrategy;\n\n  public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n  private readonly _onCharSizeChange = this.register(new EventEmitter<void>());\n  public readonly onCharSizeChange = this._onCharSizeChange.event;\n\n  constructor(\n    document: Document,\n    parentElement: HTMLElement,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._measureStrategy = new DomMeasureStrategy(document, parentElement, this._optionsService);\n    this.register(this._optionsService.onMultipleOptionChange(['fontFamily', 'fontSize'], () => this.measure()));\n  }\n\n  public measure(): void {\n    const result = this._measureStrategy.measure();\n    if (result.width !== this.width || result.height !== this.height) {\n      this.width = result.width;\n      this.height = result.height;\n      this._onCharSizeChange.fire();\n    }\n  }\n}\n\ninterface IMeasureStrategy {\n  measure(): IReadonlyMeasureResult;\n}\n\ninterface IReadonlyMeasureResult {\n  readonly width: number;\n  readonly height: number;\n}\n\ninterface IMeasureResult {\n  width: number;\n  height: number;\n}\n\n// TODO: For supporting browsers we should also provide a CanvasCharDimensionsProvider that uses\n// ctx.measureText\nclass DomMeasureStrategy implements IMeasureStrategy {\n  private _result: IMeasureResult = { width: 0, height: 0 };\n  private _measureElement: HTMLElement;\n\n  constructor(\n    private _document: Document,\n    private _parentElement: HTMLElement,\n    private _optionsService: IOptionsService\n  ) {\n    this._measureElement = this._document.createElement('span');\n    this._measureElement.classList.add('xterm-char-measure-element');\n    this._measureElement.textContent = 'W'.repeat(MeasureSettings.REPEAT);\n    this._measureElement.setAttribute('aria-hidden', 'true');\n    this._measureElement.style.whiteSpace = 'pre';\n    this._measureElement.style.fontKerning = 'none';\n    this._parentElement.appendChild(this._measureElement);\n  }\n\n  public measure(): IReadonlyMeasureResult {\n    this._measureElement.style.fontFamily = this._optionsService.rawOptions.fontFamily;\n    this._measureElement.style.fontSize = `${this._optionsService.rawOptions.fontSize}px`;\n\n    // Note that this triggers a synchronous layout\n    const geometry = {\n      height: Number(this._measureElement.offsetHeight),\n      width: Number(this._measureElement.offsetWidth)\n    };\n\n    // If values are 0 then the element is likely currently display:none, in which case we should\n    // retain the previous value.\n    if (geometry.width !== 0 && geometry.height !== 0) {\n      this._result.width = geometry.width / MeasureSettings.REPEAT;\n      this._result.height = Math.ceil(geometry.height);\n    }\n\n    return this._result;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoiner } from 'browser/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\nimport { ICharacterJoinerService } from 'browser/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n  private _width: number;\n  // .content carries no meaning for joined CellData, simply nullify it\n  // thus we have to overload all other .content accessors\n  public content: number = 0;\n  public fg: number;\n  public bg: number;\n  public combinedData: string = '';\n\n  constructor(firstCell: ICellData, chars: string, width: number) {\n    super();\n    this.fg = firstCell.fg;\n    this.bg = firstCell.bg;\n    this.combinedData = chars;\n    this._width = width;\n  }\n\n  public isCombined(): number {\n    // always mark joined cell data as combined\n    return Content.IS_COMBINED_MASK;\n  }\n\n  public getWidth(): number {\n    return this._width;\n  }\n\n  public getChars(): string {\n    return this.combinedData;\n  }\n\n  public getCode(): number {\n    // code always gets the highest possible fake codepoint (read as -1)\n    // this is needed as code is used by caches as identifier\n    return 0x1FFFFF;\n  }\n\n  public setFromCharData(value: CharData): void {\n    throw new Error('not implemented');\n  }\n\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n\nexport class CharacterJoinerService implements ICharacterJoinerService {\n  public serviceBrand: undefined;\n\n  private _characterJoiners: ICharacterJoiner[] = [];\n  private _nextCharacterJoinerId: number = 0;\n  private _workCell: CellData = new CellData();\n\n  constructor(\n    @IBufferService private _bufferService: IBufferService\n  ) { }\n\n  public register(handler: (text: string) => [number, number][]): number {\n    const joiner: ICharacterJoiner = {\n      id: this._nextCharacterJoinerId++,\n      handler\n    };\n\n    this._characterJoiners.push(joiner);\n    return joiner.id;\n  }\n\n  public deregister(joinerId: number): boolean {\n    for (let i = 0; i < this._characterJoiners.length; i++) {\n      if (this._characterJoiners[i].id === joinerId) {\n        this._characterJoiners.splice(i, 1);\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public getJoinedCharacters(row: number): [number, number][] {\n    if (this._characterJoiners.length === 0) {\n      return [];\n    }\n\n    const line = this._bufferService.buffer.lines.get(row);\n    if (!line || line.length === 0) {\n      return [];\n    }\n\n    const ranges: [number, number][] = [];\n    const lineStr = line.translateToString(true);\n\n    // Because some cells can be represented by multiple javascript characters,\n    // we track the cell and the string indexes separately. This allows us to\n    // translate the string ranges we get from the joiners back into cell ranges\n    // for use when rendering\n    let rangeStartColumn = 0;\n    let currentStringIndex = 0;\n    let rangeStartStringIndex = 0;\n    let rangeAttrFG = line.getFg(0);\n    let rangeAttrBG = line.getBg(0);\n\n    for (let x = 0; x < line.getTrimmedLength(); x++) {\n      line.loadCell(x, this._workCell);\n\n      if (this._workCell.getWidth() === 0) {\n        // If this character is of width 0, skip it.\n        continue;\n      }\n\n      // End of range\n      if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n        // If we ended up with a sequence of more than one character,\n        // look for ranges to join.\n        if (x - rangeStartColumn > 1) {\n          const joinedRanges = this._getJoinedRanges(\n            lineStr,\n            rangeStartStringIndex,\n            currentStringIndex,\n            line,\n            rangeStartColumn\n          );\n          for (let i = 0; i < joinedRanges.length; i++) {\n            ranges.push(joinedRanges[i]);\n          }\n        }\n\n        // Reset our markers for a new range.\n        rangeStartColumn = x;\n        rangeStartStringIndex = currentStringIndex;\n        rangeAttrFG = this._workCell.fg;\n        rangeAttrBG = this._workCell.bg;\n      }\n\n      currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n    }\n\n    // Process any trailing ranges.\n    if (this._bufferService.cols - rangeStartColumn > 1) {\n      const joinedRanges = this._getJoinedRanges(\n        lineStr,\n        rangeStartStringIndex,\n        currentStringIndex,\n        line,\n        rangeStartColumn\n      );\n      for (let i = 0; i < joinedRanges.length; i++) {\n        ranges.push(joinedRanges[i]);\n      }\n    }\n\n    return ranges;\n  }\n\n  /**\n   * Given a segment of a line of text, find all ranges of text that should be\n   * joined in a single rendering unit. Ranges are internally converted to\n   * column ranges, rather than string ranges.\n   * @param line String representation of the full line of text\n   * @param startIndex Start position of the range to search in the string (inclusive)\n   * @param endIndex End position of the range to search in the string (exclusive)\n   */\n  private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n    const text = line.substring(startIndex, endIndex);\n    // At this point we already know that there is at least one joiner so\n    // we can just pull its value and assign it directly rather than\n    // merging it into an empty array, which incurs unnecessary writes.\n    let allJoinedRanges: [number, number][] = [];\n    try {\n      allJoinedRanges = this._characterJoiners[0].handler(text);\n    } catch (error) {\n      console.error(error);\n    }\n    for (let i = 1; i < this._characterJoiners.length; i++) {\n      // We merge any overlapping ranges across the different joiners\n      try {\n        const joinerRanges = this._characterJoiners[i].handler(text);\n        for (let j = 0; j < joinerRanges.length; j++) {\n          CharacterJoinerService._mergeRanges(allJoinedRanges, joinerRanges[j]);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    }\n    this._stringRangesToCellRanges(allJoinedRanges, lineData, startCol);\n    return allJoinedRanges;\n  }\n\n  /**\n   * Modifies the provided ranges in-place to adjust for variations between\n   * string length and cell width so that the range represents a cell range,\n   * rather than the string range the joiner provides.\n   * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n   * @param line Cell data for the relevant line in the terminal\n   * @param startCol Offset within the line to start from\n   */\n  private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n    let currentRangeIndex = 0;\n    let currentRangeStarted = false;\n    let currentStringIndex = 0;\n    let currentRange = ranges[currentRangeIndex];\n\n    // If we got through all of the ranges, stop searching\n    if (!currentRange) {\n      return;\n    }\n\n    for (let x = startCol; x < this._bufferService.cols; x++) {\n      const width = line.getWidth(x);\n      const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n      // We skip zero-width characters when creating the string to join the text\n      // so we do the same here\n      if (width === 0) {\n        continue;\n      }\n\n      // Adjust the start of the range\n      if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n        currentRange[0] = x;\n        currentRangeStarted = true;\n      }\n\n      // Adjust the end of the range\n      if (currentRange[1] <= currentStringIndex) {\n        currentRange[1] = x;\n\n        // We're finished with this range, so we move to the next one\n        currentRange = ranges[++currentRangeIndex];\n\n        // If there are no more ranges left, stop searching\n        if (!currentRange) {\n          break;\n        }\n\n        // Ranges can be on adjacent characters. Because the end index of the\n        // ranges are exclusive, this means that the index for the start of a\n        // range can be the same as the end index of the previous range. To\n        // account for the start of the next range, we check here just in case.\n        if (currentRange[0] <= currentStringIndex) {\n          currentRange[0] = x;\n          currentRangeStarted = true;\n        } else {\n          currentRangeStarted = false;\n        }\n      }\n\n      // Adjust the string index based on the character length to line up with\n      // the column adjustment\n      currentStringIndex += length;\n    }\n\n    // If there is still a range left at the end, it must extend all the way to\n    // the end of the line.\n    if (currentRange) {\n      currentRange[1] = this._bufferService.cols;\n    }\n  }\n\n  /**\n   * Merges the range defined by the provided start and end into the list of\n   * existing ranges. The merge is done in place on the existing range for\n   * performance and is also returned.\n   * @param ranges Existing range list\n   * @param newRange Tuple of two numbers representing the new range to merge in.\n   * @returns The ranges input with the new range merged in place\n   */\n  private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n    let inRange = false;\n    for (let i = 0; i < ranges.length; i++) {\n      const range = ranges[i];\n      if (!inRange) {\n        if (newRange[1] <= range[0]) {\n          // Case 1: New range is before the search range\n          ranges.splice(i, 0, newRange);\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 2: New range is either wholly contained within the\n          // search range or overlaps with the front of it\n          range[0] = Math.min(newRange[0], range[0]);\n          return ranges;\n        }\n\n        if (newRange[0] < range[1]) {\n          // Case 3: New range either wholly contains the search range\n          // or overlaps with the end of it\n          range[0] = Math.min(newRange[0], range[0]);\n          inRange = true;\n        }\n\n        // Case 4: New range starts after the search range\n        continue;\n      } else {\n        if (newRange[1] <= range[0]) {\n          // Case 5: New range extends from previous range but doesn't\n          // reach the current one\n          ranges[i - 1][1] = newRange[1];\n          return ranges;\n        }\n\n        if (newRange[1] <= range[1]) {\n          // Case 6: New range extends from prvious range into the\n          // current range\n          ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n          ranges.splice(i, 1);\n          return ranges;\n        }\n\n        // Case 7: New range extends from previous range past the\n        // end of the current range\n        ranges.splice(i, 1);\n        i--;\n      }\n    }\n\n    if (inRange) {\n      // Case 8: New range extends past the last existing range\n      ranges[ranges.length - 1][1] = newRange[1];\n    } else {\n      // Case 9: New range starts after the last existing range\n      ranges.push(newRange);\n    }\n\n    return ranges;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\n\nexport class CoreBrowserService implements ICoreBrowserService {\n  public serviceBrand: undefined;\n\n  private _isFocused = false;\n  private _cachedIsFocused: boolean | undefined = undefined;\n\n  constructor(\n    private _textarea: HTMLTextAreaElement,\n    public readonly window: Window & typeof globalThis\n  ) {\n    this._textarea.addEventListener('focus', () => this._isFocused = true);\n    this._textarea.addEventListener('blur', () => this._isFocused = false);\n  }\n\n  public get dpr(): number {\n    return this.window.devicePixelRatio;\n  }\n\n  public get isFocused(): boolean {\n    if (this._cachedIsFocused === undefined) {\n      this._cachedIsFocused = this._isFocused && this._textarea.ownerDocument.hasFocus();\n      queueMicrotask(() => this._cachedIsFocused = undefined);\n    }\n    return this._cachedIsFocused;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService, IRenderService, IMouseService } from './Services';\nimport { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse';\n\nexport class MouseService implements IMouseService {\n  public serviceBrand: undefined;\n\n  constructor(\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService\n  ) {\n  }\n\n  public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n    return getCoords(\n      window,\n      event,\n      element,\n      colCount,\n      rowCount,\n      this._charSizeService.hasValidSize,\n      this._renderService.dimensions.css.cell.width,\n      this._renderService.dimensions.css.cell.height,\n      isSelection\n    );\n  }\n\n  public getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined {\n    const coords = getCoordsRelativeToElement(window, event, element);\n    if (!this._charSizeService.hasValidSize) {\n      return undefined;\n    }\n    coords[0] = Math.min(Math.max(coords[0], 0), this._renderService.dimensions.css.canvas.width - 1);\n    coords[1] = Math.min(Math.max(coords[1], 0), this._renderService.dimensions.css.canvas.height - 1);\n    return {\n      col: Math.floor(coords[0] / this._renderService.dimensions.css.cell.width),\n      row: Math.floor(coords[1] / this._renderService.dimensions.css.cell.height),\n      x: Math.floor(coords[0]),\n      y: Math.floor(coords[1])\n    };\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderDebouncerWithCallback } from 'browser/Types';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable } from 'common/Lifecycle';\nimport { DebouncedIdleTask } from 'common/TaskQueue';\nimport { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';\n\ninterface ISelectionState {\n  start: [number, number] | undefined;\n  end: [number, number] | undefined;\n  columnSelectMode: boolean;\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n  public serviceBrand: undefined;\n\n  private _renderer: MutableDisposable<IRenderer> = this.register(new MutableDisposable());\n  private _renderDebouncer: IRenderDebouncerWithCallback;\n  private _screenDprMonitor: ScreenDprMonitor;\n  private _pausedResizeTask = new DebouncedIdleTask();\n\n  private _isPaused: boolean = false;\n  private _needsFullRefresh: boolean = false;\n  private _isNextRenderRedrawOnly: boolean = true;\n  private _needsSelectionRefresh: boolean = false;\n  private _canvasWidth: number = 0;\n  private _canvasHeight: number = 0;\n  private _selectionState: ISelectionState = {\n    start: undefined,\n    end: undefined,\n    columnSelectMode: false\n  };\n\n  private readonly _onDimensionsChange = this.register(new EventEmitter<IRenderDimensions>());\n  public readonly onDimensionsChange =  this._onDimensionsChange.event;\n  private readonly _onRenderedViewportChange = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;\n  private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRender = this._onRender.event;\n  private readonly _onRefreshRequest = this.register(new EventEmitter<{ start: number, end: number }>());\n  public readonly onRefreshRequest = this._onRefreshRequest.event;\n\n  public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }\n\n  constructor(\n    private _rowCount: number,\n    screenElement: HTMLElement,\n    @IOptionsService optionsService: IOptionsService,\n    @ICharSizeService private readonly _charSizeService: ICharSizeService,\n    @IDecorationService decorationService: IDecorationService,\n    @IBufferService bufferService: IBufferService,\n    @ICoreBrowserService coreBrowserService: ICoreBrowserService,\n    @IThemeService themeService: IThemeService\n  ) {\n    super();\n\n    this._renderDebouncer = new RenderDebouncer(coreBrowserService.window, (start, end) => this._renderRows(start, end));\n    this.register(this._renderDebouncer);\n\n    this._screenDprMonitor = new ScreenDprMonitor(coreBrowserService.window);\n    this._screenDprMonitor.setListener(() => this.handleDevicePixelRatioChange());\n    this.register(this._screenDprMonitor);\n\n    this.register(bufferService.onResize(() => this._fullRefresh()));\n    this.register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));\n    this.register(optionsService.onOptionChange(() => this._handleOptionsChanged()));\n    this.register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));\n\n    // Do a full refresh whenever any decoration is added or removed. This may not actually result\n    // in changes but since decorations should be used sparingly or added/removed all in the same\n    // frame this should have minimal performance impact.\n    this.register(decorationService.onDecorationRegistered(() => this._fullRefresh()));\n    this.register(decorationService.onDecorationRemoved(() => this._fullRefresh()));\n\n    // Clear the renderer when the a change that could affect glyphs occurs\n    this.register(optionsService.onMultipleOptionChange([\n      'customGlyphs',\n      'drawBoldTextInBrightColors',\n      'letterSpacing',\n      'lineHeight',\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'fontWeightBold',\n      'minimumContrastRatio'\n    ], () => {\n      this.clear();\n      this.handleResize(bufferService.cols, bufferService.rows);\n      this._fullRefresh();\n    }));\n\n    // Refresh the cursor line when the cursor changes\n    this.register(optionsService.onMultipleOptionChange([\n      'cursorBlink',\n      'cursorStyle'\n    ], () => this.refreshRows(bufferService.buffer.y, bufferService.buffer.y, true)));\n\n    // dprchange should handle this case, we need this as well for browsers that don't support the\n    // matchMedia query.\n    this.register(addDisposableDomListener(coreBrowserService.window, 'resize', () => this.handleDevicePixelRatioChange()));\n\n    this.register(themeService.onChangeColors(() => this._fullRefresh()));\n\n    // Detect whether IntersectionObserver is detected and enable renderer pause\n    // and resume based on terminal visibility if so\n    if ('IntersectionObserver' in coreBrowserService.window) {\n      const observer = new coreBrowserService.window.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 });\n      observer.observe(screenElement);\n      this.register({ dispose: () => observer.disconnect() });\n    }\n  }\n\n  private _handleIntersectionChange(entry: IntersectionObserverEntry): void {\n    this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting;\n\n    // Terminal was hidden on open\n    if (!this._isPaused && !this._charSizeService.hasValidSize) {\n      this._charSizeService.measure();\n    }\n\n    if (!this._isPaused && this._needsFullRefresh) {\n      this._pausedResizeTask.flush();\n      this.refreshRows(0, this._rowCount - 1);\n      this._needsFullRefresh = false;\n    }\n  }\n\n  public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n      return;\n    }\n    if (!isRedrawOnly) {\n      this._isNextRenderRedrawOnly = false;\n    }\n    this._renderDebouncer.refresh(start, end, this._rowCount);\n  }\n\n  private _renderRows(start: number, end: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n\n    // Since this is debounced, a resize event could have happened between the time a refresh was\n    // requested and when this triggers. Clamp the values of start and end to ensure they're valid\n    // given the current viewport state.\n    start = Math.min(start, this._rowCount - 1);\n    end = Math.min(end, this._rowCount - 1);\n\n    // Render\n    this._renderer.value.renderRows(start, end);\n\n    // Update selection if needed\n    if (this._needsSelectionRefresh) {\n      this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n      this._needsSelectionRefresh = false;\n    }\n\n    // Fire render event only if it was not a redraw\n    if (!this._isNextRenderRedrawOnly) {\n      this._onRenderedViewportChange.fire({ start, end });\n    }\n    this._onRender.fire({ start, end });\n    this._isNextRenderRedrawOnly = true;\n  }\n\n  public resize(cols: number, rows: number): void {\n    this._rowCount = rows;\n    this._fireOnCanvasResize();\n  }\n\n  private _handleOptionsChanged(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this.refreshRows(0, this._rowCount - 1);\n    this._fireOnCanvasResize();\n  }\n\n  private _fireOnCanvasResize(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    // Don't fire the event if the dimensions haven't changed\n    if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {\n      return;\n    }\n    this._onDimensionsChange.fire(this._renderer.value.dimensions);\n  }\n\n  public hasRenderer(): boolean {\n    return !!this._renderer.value;\n  }\n\n  public setRenderer(renderer: IRenderer): void {\n    this._renderer.value = renderer;\n    this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n    // Force a refresh\n    this._needsSelectionRefresh = true;\n    this._fullRefresh();\n  }\n\n  public addRefreshCallback(callback: FrameRequestCallback): number {\n    return this._renderDebouncer.addRefreshCallback(callback);\n  }\n\n  private _fullRefresh(): void {\n    if (this._isPaused) {\n      this._needsFullRefresh = true;\n    } else {\n      this.refreshRows(0, this._rowCount - 1);\n    }\n  }\n\n  public clearTextureAtlas(): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.clearTextureAtlas?.();\n    this._fullRefresh();\n  }\n\n  public handleDevicePixelRatioChange(): void {\n    // Force char size measurement as DomMeasureStrategy(getBoundingClientRect) is not stable\n    // when devicePixelRatio changes\n    this._charSizeService.measure();\n\n    if (!this._renderer.value) {\n      return;\n    }\n    this._renderer.value.handleDevicePixelRatioChange();\n    this.refreshRows(0, this._rowCount - 1);\n  }\n\n  public handleResize(cols: number, rows: number): void {\n    if (!this._renderer.value) {\n      return;\n    }\n    if (this._isPaused) {\n      this._pausedResizeTask.set(() => this._renderer.value!.handleResize(cols, rows));\n    } else {\n      this._renderer.value.handleResize(cols, rows);\n    }\n    this._fullRefresh();\n  }\n\n  // TODO: Is this useful when we have onResize?\n  public handleCharSizeChanged(): void {\n    this._renderer.value?.handleCharSizeChanged();\n  }\n\n  public handleBlur(): void {\n    this._renderer.value?.handleBlur();\n  }\n\n  public handleFocus(): void {\n    this._renderer.value?.handleFocus();\n  }\n\n  public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n    this._selectionState.start = start;\n    this._selectionState.end = end;\n    this._selectionState.columnSelectMode = columnSelectMode;\n    this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);\n  }\n\n  public handleCursorMove(): void {\n    this._renderer.value?.handleCursorMove();\n  }\n\n  public clear(): void {\n    this._renderer.value?.clear();\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange, ILinkifier2 } from 'browser/Types';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { ICoreBrowserService, IMouseService, IRenderService, ISelectionService } from 'browser/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport * as Browser from 'common/Platform';\nimport { IBufferLine, IDisposable } from 'common/Types';\nimport { getRangeLength } from 'common/buffer/BufferRange';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n  start: number;\n  length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n  NORMAL,\n  WORD,\n  LINE,\n  COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n  public serviceBrand: undefined;\n\n  protected _model: SelectionModel;\n\n  /**\n   * The amount to scroll every drag scroll update (depends on how far the mouse\n   * drag is above or below the terminal).\n   */\n  private _dragScrollAmount: number = 0;\n\n  /**\n   * The current selection mode.\n   */\n  protected _activeSelectionMode: SelectionMode;\n\n  /**\n   * A setInterval timer that is active while the mouse is down whose callback\n   * scrolls the viewport when necessary.\n   */\n  private _dragScrollIntervalTimer: number | undefined;\n\n  /**\n   * The animation frame ID used for refreshing the selection.\n   */\n  private _refreshAnimationFrame: number | undefined;\n\n  /**\n   * Whether selection is enabled.\n   */\n  private _enabled = true;\n\n  private _mouseMoveListener: EventListener;\n  private _mouseUpListener: EventListener;\n  private _trimListener: IDisposable;\n  private _workCell: CellData = new CellData();\n\n  private _mouseDownTimeStamp: number = 0;\n  private _oldHasSelection: boolean = false;\n  private _oldSelectionStart: [number, number] | undefined = undefined;\n  private _oldSelectionEnd: [number, number] | undefined = undefined;\n\n  private readonly _onLinuxMouseSelection = this.register(new EventEmitter<string>());\n  public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;\n  private readonly _onRedrawRequest = this.register(new EventEmitter<ISelectionRedrawRequestEvent>());\n  public readonly onRequestRedraw = this._onRedrawRequest.event;\n  private readonly _onSelectionChange = this.register(new EventEmitter<void>());\n  public readonly onSelectionChange = this._onSelectionChange.event;\n  private readonly _onRequestScrollLines = this.register(new EventEmitter<ISelectionRequestScrollLinesEvent>());\n  public readonly onRequestScrollLines = this._onRequestScrollLines.event;\n\n  constructor(\n    private readonly _element: HTMLElement,\n    private readonly _screenElement: HTMLElement,\n    private readonly _linkifier: ILinkifier2,\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService,\n    @IMouseService private readonly _mouseService: IMouseService,\n    @IOptionsService private readonly _optionsService: IOptionsService,\n    @IRenderService private readonly _renderService: IRenderService,\n    @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService\n  ) {\n    super();\n\n    // Init listeners\n    this._mouseMoveListener = event => this._handleMouseMove(event as MouseEvent);\n    this._mouseUpListener = event => this._handleMouseUp(event as MouseEvent);\n    this._coreService.onUserInput(() => {\n      if (this.hasSelection) {\n        this.clearSelection();\n      }\n    });\n    this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._handleTrim(amount));\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._handleBufferActivate(e)));\n\n    this.enable();\n\n    this._model = new SelectionModel(this._bufferService);\n    this._activeSelectionMode = SelectionMode.NORMAL;\n\n    this.register(toDisposable(() => {\n      this._removeMouseDownListeners();\n    }));\n  }\n\n  public reset(): void {\n    this.clearSelection();\n  }\n\n  /**\n   * Disables the selection manager. This is useful for when terminal mouse\n   * are enabled.\n   */\n  public disable(): void {\n    this.clearSelection();\n    this._enabled = false;\n  }\n\n  /**\n   * Enable the selection manager.\n   */\n  public enable(): void {\n    this._enabled = true;\n  }\n\n  public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n  public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n  /**\n   * Gets whether there is an active text selection.\n   */\n  public get hasSelection(): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return start[0] !== end[0] || start[1] !== end[1];\n  }\n\n  /**\n   * Gets the text currently selected.\n   */\n  public get selectionText(): string {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return '';\n    }\n\n    const buffer = this._bufferService.buffer;\n    const result: string[] = [];\n\n    if (this._activeSelectionMode === SelectionMode.COLUMN) {\n      // Ignore zero width selections\n      if (start[0] === end[0]) {\n        return '';\n      }\n\n      // For column selection it's not enough to rely on final selection's swapping of reversed\n      // values, it also needs the x coordinates to swap independently of the y coordinate is needed\n      const startCol = start[0] < end[0] ? start[0] : end[0];\n      const endCol = start[0] < end[0] ? end[0] : start[0];\n      for (let i = start[1]; i <= end[1]; i++) {\n        const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);\n        result.push(lineText);\n      }\n    } else {\n      // Get first row\n      const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n      result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n      // Get middle rows\n      for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n        const bufferLine = buffer.lines.get(i);\n        const lineText = buffer.translateBufferLineToString(i, true);\n        if (bufferLine?.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n\n      // Get final row\n      if (start[1] !== end[1]) {\n        const bufferLine = buffer.lines.get(end[1]);\n        const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n        if (bufferLine && bufferLine!.isWrapped) {\n          result[result.length - 1] += lineText;\n        } else {\n          result.push(lineText);\n        }\n      }\n    }\n\n    // Format string by replacing non-breaking space chars with regular spaces\n    // and joining the array into a multi-line string.\n    const formattedResult = result.map(line => {\n      return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n    }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n    return formattedResult;\n  }\n\n  /**\n   * Clears the current terminal selection.\n   */\n  public clearSelection(): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Queues a refresh, redrawing the selection on the next opportunity.\n   * @param isLinuxMouseSelection Whether the selection should be registered as a new\n   * selection on Linux.\n   */\n  public refresh(isLinuxMouseSelection?: boolean): void {\n    // Queue the refresh for the renderer\n    if (!this._refreshAnimationFrame) {\n      this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());\n    }\n\n    // If the platform is Linux and the refresh call comes from a mouse event,\n    // we need to update the selection for middle click to paste selection.\n    if (Browser.isLinux && isLinuxMouseSelection) {\n      const selectionText = this.selectionText;\n      if (selectionText.length) {\n        this._onLinuxMouseSelection.fire(this.selectionText);\n      }\n    }\n  }\n\n  /**\n   * Fires the refresh event, causing consumers to pick it up and redraw the\n   * selection state.\n   */\n  private _refresh(): void {\n    this._refreshAnimationFrame = undefined;\n    this._onRedrawRequest.fire({\n      start: this._model.finalSelectionStart,\n      end: this._model.finalSelectionEnd,\n      columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n    });\n  }\n\n  /**\n   * Checks if the current click was inside the current selection\n   * @param event The mouse event\n   */\n  private _isClickInSelection(event: MouseEvent): boolean {\n    const coords = this._getMouseBufferCoords(event);\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n\n    if (!start || !end || !coords) {\n      return false;\n    }\n\n    return this._areCoordsInSelection(coords, start, end);\n  }\n\n  public isCellInSelection(x: number, y: number): boolean {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    if (!start || !end) {\n      return false;\n    }\n    return this._areCoordsInSelection([x, y], start, end);\n  }\n\n  protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n    return (coords[1] > start[1] && coords[1] < end[1]) ||\n        (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n        (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n  }\n\n  /**\n   * Selects word at the current mouse event coordinates.\n   * @param event The mouse event.\n   */\n  private _selectWordAtCursor(event: MouseEvent, allowWhitespaceOnlySelection: boolean): boolean {\n    // Check if there is a link under the cursor first and select that if so\n    const range = this._linkifier.currentLink?.link?.range;\n    if (range) {\n      this._model.selectionStart = [range.start.x - 1, range.start.y - 1];\n      this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._selectWordAt(coords, allowWhitespaceOnlySelection);\n      this._model.selectionEnd = undefined;\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Selects all text within the terminal.\n   */\n  public selectAll(): void {\n    this._model.isSelectAllActive = true;\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  public selectLines(start: number, end: number): void {\n    this._model.clearSelection();\n    start = Math.max(start, 0);\n    end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n    this._model.selectionStart = [0, start];\n    this._model.selectionEnd = [this._bufferService.cols, end];\n    this.refresh();\n    this._onSelectionChange.fire();\n  }\n\n  /**\n   * Handle the buffer being trimmed, adjust the selection position.\n   * @param amount The amount the buffer is being trimmed.\n   */\n  private _handleTrim(amount: number): void {\n    const needsRefresh = this._model.handleTrim(amount);\n    if (needsRefresh) {\n      this.refresh();\n    }\n  }\n\n  /**\n   * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n   * @param event The mouse event.\n   */\n  private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n    const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n    if (!coords) {\n      return undefined;\n    }\n\n    // Convert to 0-based\n    coords[0]--;\n    coords[1]--;\n\n    // Convert viewport coords to buffer coords\n    coords[1] += this._bufferService.buffer.ydisp;\n    return coords;\n  }\n\n  /**\n   * Gets the amount the viewport should be scrolled based on how far out of the\n   * terminal the mouse is.\n   * @param event The mouse event.\n   */\n  private _getMouseEventScrollAmount(event: MouseEvent): number {\n    let offset = getCoordsRelativeToElement(this._coreBrowserService.window, event, this._screenElement)[1];\n    const terminalHeight = this._renderService.dimensions.css.canvas.height;\n    if (offset >= 0 && offset <= terminalHeight) {\n      return 0;\n    }\n    if (offset > terminalHeight) {\n      offset -= terminalHeight;\n    }\n\n    offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n    offset /= DRAG_SCROLL_MAX_THRESHOLD;\n    return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n  }\n\n  /**\n   * Returns whether the selection manager should force selection, regardless of\n   * whether the terminal is in mouse events mode.\n   * @param event The mouse event.\n   */\n  public shouldForceSelection(event: MouseEvent): boolean {\n    if (Browser.isMac) {\n      return event.altKey && this._optionsService.rawOptions.macOptionClickForcesSelection;\n    }\n\n    return event.shiftKey;\n  }\n\n  /**\n   * Handles te mousedown event, setting up for a new selection.\n   * @param event The mousedown event.\n   */\n  public handleMouseDown(event: MouseEvent): void {\n    this._mouseDownTimeStamp = event.timeStamp;\n    // If we have selection, we want the context menu on right click even if the\n    // terminal is in mouse mode.\n    if (event.button === 2 && this.hasSelection) {\n      return;\n    }\n\n    // Only action the primary button\n    if (event.button !== 0) {\n      return;\n    }\n\n    // Allow selection when using a specific modifier key, even when disabled\n    if (!this._enabled) {\n      if (!this.shouldForceSelection(event)) {\n        return;\n      }\n\n      // Don't send the mouse down event to the current process, we want to select\n      event.stopPropagation();\n    }\n\n    // Tell the browser not to start a regular selection\n    event.preventDefault();\n\n    // Reset drag scroll state\n    this._dragScrollAmount = 0;\n\n    if (this._enabled && event.shiftKey) {\n      this._handleIncrementalClick(event);\n    } else {\n      if (event.detail === 1) {\n        this._handleSingleClick(event);\n      } else if (event.detail === 2) {\n        this._handleDoubleClick(event);\n      } else if (event.detail === 3) {\n        this._handleTripleClick(event);\n      }\n    }\n\n    this._addMouseDownListeners();\n    this.refresh(true);\n  }\n\n  /**\n   * Adds listeners when mousedown is triggered.\n   */\n  private _addMouseDownListeners(): void {\n    // Listen on the document so that dragging outside of viewport works\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n    }\n    this._dragScrollIntervalTimer = this._coreBrowserService.window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n  }\n\n  /**\n   * Removes the listeners that are registered when mousedown is triggered.\n   */\n  private _removeMouseDownListeners(): void {\n    if (this._screenElement.ownerDocument) {\n      this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n      this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n    }\n    this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer);\n    this._dragScrollIntervalTimer = undefined;\n  }\n\n  /**\n   * Performs an incremental click, setting the selection end position to the mouse\n   * position.\n   * @param event The mouse event.\n   */\n  private _handleIncrementalClick(event: MouseEvent): void {\n    if (this._model.selectionStart) {\n      this._model.selectionEnd = this._getMouseBufferCoords(event);\n    }\n  }\n\n  /**\n   * Performs a single click, resetting relevant state and setting the selection\n   * start position.\n   * @param event The mouse event.\n   */\n  private _handleSingleClick(event: MouseEvent): void {\n    this._model.selectionStartLength = 0;\n    this._model.isSelectAllActive = false;\n    this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n    // Initialize the new selection\n    this._model.selectionStart = this._getMouseBufferCoords(event);\n    if (!this._model.selectionStart) {\n      return;\n    }\n    this._model.selectionEnd = undefined;\n\n    // Ensure the line exists\n    const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n    if (!line) {\n      return;\n    }\n\n    // Return early if the click event is not in the buffer (eg. in scroll bar)\n    if (line.length === this._model.selectionStart[0]) {\n      return;\n    }\n\n    // If the mouse is over the second half of a wide character, adjust the\n    // selection to cover the whole character\n    if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n      this._model.selectionStart[0]++;\n    }\n  }\n\n  /**\n   * Performs a double click, selecting the current word.\n   * @param event The mouse event.\n   */\n  private _handleDoubleClick(event: MouseEvent): void {\n    if (this._selectWordAtCursor(event, true)) {\n      this._activeSelectionMode = SelectionMode.WORD;\n    }\n  }\n\n  /**\n   * Performs a triple click, selecting the current line and activating line\n   * select mode.\n   * @param event The mouse event.\n   */\n  private _handleTripleClick(event: MouseEvent): void {\n    const coords = this._getMouseBufferCoords(event);\n    if (coords) {\n      this._activeSelectionMode = SelectionMode.LINE;\n      this._selectLineAt(coords[1]);\n    }\n  }\n\n  /**\n   * Returns whether the selection manager should operate in column select mode\n   * @param event the mouse or keyboard event\n   */\n  public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n    return event.altKey && !(Browser.isMac && this._optionsService.rawOptions.macOptionClickForcesSelection);\n  }\n\n  /**\n   * Handles the mousemove event when the mouse button is down, recording the\n   * end of the selection and refreshing the selection.\n   * @param event The mousemove event.\n   */\n  private _handleMouseMove(event: MouseEvent): void {\n    // If the mousemove listener is active it means that a selection is\n    // currently being made, we should stop propagation to prevent mouse events\n    // to be sent to the pty.\n    event.stopImmediatePropagation();\n\n    // Do nothing if there is no selection start, this can happen if the first\n    // click in the terminal is an incremental click\n    if (!this._model.selectionStart) {\n      return;\n    }\n\n    // Record the previous position so we know whether to redraw the selection\n    // at the end.\n    const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n    // Set the initial selection end based on the mouse coordinates\n    this._model.selectionEnd = this._getMouseBufferCoords(event);\n    if (!this._model.selectionEnd) {\n      this.refresh(true);\n      return;\n    }\n\n    // Select the entire line if line select mode is active.\n    if (this._activeSelectionMode === SelectionMode.LINE) {\n      if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n        this._model.selectionEnd[0] = 0;\n      } else {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      }\n    } else if (this._activeSelectionMode === SelectionMode.WORD) {\n      this._selectToWordAt(this._model.selectionEnd);\n    }\n\n    // Determine the amount of scrolling that will happen.\n    this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n    // If the cursor was above or below the viewport, make sure it's at the\n    // start or end of the viewport respectively. This should only happen when\n    // NOT in column select mode.\n    if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n      if (this._dragScrollAmount > 0) {\n        this._model.selectionEnd[0] = this._bufferService.cols;\n      } else if (this._dragScrollAmount < 0) {\n        this._model.selectionEnd[0] = 0;\n      }\n    }\n\n    // If the character is a wide character include the cell to the right in the\n    // selection. Note that selections at the very end of the line will never\n    // have a character.\n    const buffer = this._bufferService.buffer;\n    if (this._model.selectionEnd[1] < buffer.lines.length) {\n      const line = buffer.lines.get(this._model.selectionEnd[1]);\n      if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n        this._model.selectionEnd[0]++;\n      }\n    }\n\n    // Only draw here if the selection changes.\n    if (!previousSelectionEnd ||\n      previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n      previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n      this.refresh(true);\n    }\n  }\n\n  /**\n   * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n   * scrolling of the viewport.\n   */\n  private _dragScroll(): void {\n    if (!this._model.selectionEnd || !this._model.selectionStart) {\n      return;\n    }\n    if (this._dragScrollAmount) {\n      this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n      // Re-evaluate selection\n      // If the cursor was above or below the viewport, make sure it's at the\n      // start or end of the viewport respectively. This should only happen when\n      // NOT in column select mode.\n      const buffer = this._bufferService.buffer;\n      if (this._dragScrollAmount > 0) {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = this._bufferService.cols;\n        }\n        this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n      } else {\n        if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n          this._model.selectionEnd[0] = 0;\n        }\n        this._model.selectionEnd[1] = buffer.ydisp;\n      }\n      this.refresh();\n    }\n  }\n\n  /**\n   * Handles the mouseup event, removing the mousedown listeners.\n   * @param event The mouseup event.\n   */\n  private _handleMouseUp(event: MouseEvent): void {\n    const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n    this._removeMouseDownListeners();\n\n    if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey && this._optionsService.rawOptions.altClickMovesCursor) {\n      if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n        const coordinates = this._mouseService.getCoords(\n          event,\n          this._element,\n          this._bufferService.cols,\n          this._bufferService.rows,\n          false\n        );\n        if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n          const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n          this._coreService.triggerDataEvent(sequence, true);\n        }\n      }\n    } else {\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  private _fireEventIfSelectionChanged(): void {\n    const start = this._model.finalSelectionStart;\n    const end = this._model.finalSelectionEnd;\n    const hasSelection = !!start && !!end && (start[0] !== end[0] || start[1] !== end[1]);\n\n    if (!hasSelection) {\n      if (this._oldHasSelection) {\n        this._fireOnSelectionChange(start, end, hasSelection);\n      }\n      return;\n    }\n\n    // Sanity check, these should not be undefined as there is a selection\n    if (!start || !end) {\n      return;\n    }\n\n    if (!this._oldSelectionStart || !this._oldSelectionEnd || (\n      start[0] !== this._oldSelectionStart[0] || start[1] !== this._oldSelectionStart[1] ||\n      end[0] !== this._oldSelectionEnd[0] || end[1] !== this._oldSelectionEnd[1])) {\n\n      this._fireOnSelectionChange(start, end, hasSelection);\n    }\n  }\n\n  private _fireOnSelectionChange(start: [number, number] | undefined, end: [number, number] | undefined, hasSelection: boolean): void {\n    this._oldSelectionStart = start;\n    this._oldSelectionEnd = end;\n    this._oldHasSelection = hasSelection;\n    this._onSelectionChange.fire();\n  }\n\n  private _handleBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n    this.clearSelection();\n    // Only adjust the selection on trim, shiftElements is rarely used (only in\n    // reverseIndex) and delete in a splice is only ever used when the same\n    // number of elements was just added. Given this is could actually be\n    // beneficial to leave the selection as is for these cases.\n    this._trimListener.dispose();\n    this._trimListener = e.activeBuffer.lines.onTrim(amount => this._handleTrim(amount));\n  }\n\n  /**\n   * Converts a viewport column (0 to cols - 1) to the character index on the\n   * buffer line, the latter takes into account wide and null characters.\n   * @param bufferLine The buffer line to use.\n   * @param x The x index in the buffer line to convert.\n   */\n  private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, x: number): number {\n    let charIndex = x;\n    for (let i = 0; x >= i; i++) {\n      const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n      if (this._workCell.getWidth() === 0) {\n        // Wide characters aren't included in the line string so decrement the\n        // index so the index is back on the wide character.\n        charIndex--;\n      } else if (length > 1 && x !== i) {\n        // Emojis take up multiple characters, so adjust accordingly. For these\n        // we don't want ot include the character at the column as we're\n        // returning the start index in the string, not the end index.\n        charIndex += length - 1;\n      }\n    }\n    return charIndex;\n  }\n\n  public setSelection(col: number, row: number, length: number): void {\n    this._model.clearSelection();\n    this._removeMouseDownListeners();\n    this._model.selectionStart = [col, row];\n    this._model.selectionStartLength = length;\n    this.refresh();\n    this._fireEventIfSelectionChanged();\n  }\n\n  public rightClickSelect(ev: MouseEvent): void {\n    if (!this._isClickInSelection(ev)) {\n      if (this._selectWordAtCursor(ev, false)) {\n        this.refresh(true);\n      }\n      this._fireEventIfSelectionChanged();\n    }\n  }\n\n  /**\n   * Gets positional information for the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n    // Ensure coords are within viewport (eg. not within scroll bar)\n    if (coords[0] >= this._bufferService.cols) {\n      return undefined;\n    }\n\n    const buffer = this._bufferService.buffer;\n    const bufferLine = buffer.lines.get(coords[1]);\n    if (!bufferLine) {\n      return undefined;\n    }\n\n    const line = buffer.translateBufferLineToString(coords[1], false);\n\n    // Get actual index, taking into consideration wide characters\n    let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords[0]);\n    let endIndex = startIndex;\n\n    // Record offset to be used later\n    const charOffset = coords[0] - startIndex;\n    let leftWideCharCount = 0;\n    let rightWideCharCount = 0;\n    let leftLongCharOffset = 0;\n    let rightLongCharOffset = 0;\n\n    if (line.charAt(startIndex) === ' ') {\n      // Expand until non-whitespace is hit\n      while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n        startIndex--;\n      }\n      while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n        endIndex++;\n      }\n    } else {\n      // Expand until whitespace is hit. This algorithm works by scanning left\n      // and right from the starting position, keeping both the index format\n      // (line) and the column format (bufferLine) in sync. When a wide\n      // character is hit, it is recorded and the column index is adjusted.\n      let startCol = coords[0];\n      let endCol = coords[0];\n\n      // Consider the initial position, skip it and increment the wide char\n      // variable\n      if (bufferLine.getWidth(startCol) === 0) {\n        leftWideCharCount++;\n        startCol--;\n      }\n      if (bufferLine.getWidth(endCol) === 2) {\n        rightWideCharCount++;\n        endCol++;\n      }\n\n      // Adjust the end index for characters whose length are > 1 (emojis)\n      const length = bufferLine.getString(endCol).length;\n      if (length > 1) {\n        rightLongCharOffset += length - 1;\n        endIndex += length - 1;\n      }\n\n      // Expand the string in both directions until a space is hit\n      while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n        bufferLine.loadCell(startCol - 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 0) {\n          // If the next character is a wide char, record it and skip the column\n          leftWideCharCount++;\n          startCol--;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          leftLongCharOffset += length - 1;\n          startIndex -= length - 1;\n        }\n        startIndex--;\n        startCol--;\n      }\n      while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n        bufferLine.loadCell(endCol + 1, this._workCell);\n        const length = this._workCell.getChars().length;\n        if (this._workCell.getWidth() === 2) {\n          // If the next character is a wide char, record it and skip the column\n          rightWideCharCount++;\n          endCol++;\n        } else if (length > 1) {\n          // If the next character's string is longer than 1 char (eg. emoji),\n          // adjust the index\n          rightLongCharOffset += length - 1;\n          endIndex += length - 1;\n        }\n        endIndex++;\n        endCol++;\n      }\n    }\n\n    // Incremenet the end index so it is at the start of the next character\n    endIndex++;\n\n    // Calculate the start _column_, converting the the string indexes back to\n    // column coordinates.\n    let start =\n        startIndex // The index of the selection's start char in the line string\n        + charOffset // The difference between the initial char's column and index\n        - leftWideCharCount // The number of wide chars left of the initial char\n        + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n    // Calculate the length in _columns_, converting the the string indexes back\n    // to column coordinates.\n    let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n      endIndex // The index of the selection's end char in the line string\n      - startIndex // The index of the selection's start char in the line string\n      + leftWideCharCount // The number of wide chars left of the initial char\n      + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n      - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n      - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n    if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n      return undefined;\n    }\n\n    // Recurse upwards if the line is wrapped and the word wraps to the above line\n    if (followWrappedLinesAbove) {\n      if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n        const previousBufferLine = buffer.lines.get(coords[1] - 1);\n        if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n          const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n          if (previousLineWordPosition) {\n            const offset = this._bufferService.cols - previousLineWordPosition.start;\n            start -= offset;\n            length += offset;\n          }\n        }\n      }\n    }\n\n    // Recurse downwards if the line is wrapped and the word wraps to the next line\n    if (followWrappedLinesBelow) {\n      if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n        const nextBufferLine = buffer.lines.get(coords[1] + 1);\n        if (nextBufferLine?.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n          const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n          if (nextLineWordPosition) {\n            length += nextLineWordPosition.length;\n          }\n        }\n      }\n    }\n\n    return { start, length };\n  }\n\n  /**\n   * Selects the word at the coordinates specified.\n   * @param coords The coordinates to get the word at.\n   * @param allowWhitespaceOnlySelection If whitespace should be selected\n   */\n  protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n    const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n    if (wordPosition) {\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        coords[1]--;\n      }\n      this._model.selectionStart = [wordPosition.start, coords[1]];\n      this._model.selectionStartLength = wordPosition.length;\n    }\n  }\n\n  /**\n   * Sets the selection end to the word at the coordinated specified.\n   * @param coords The coordinates to get the word at.\n   */\n  private _selectToWordAt(coords: [number, number]): void {\n    const wordPosition = this._getWordAt(coords, true);\n    if (wordPosition) {\n      let endRow = coords[1];\n\n      // Adjust negative start value\n      while (wordPosition.start < 0) {\n        wordPosition.start += this._bufferService.cols;\n        endRow--;\n      }\n\n      // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n      // case we're interested in the start of the word, not the end\n      if (!this._model.areSelectionValuesReversed()) {\n        while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n          wordPosition.length -= this._bufferService.cols;\n          endRow++;\n        }\n      }\n\n      this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n    }\n  }\n\n  /**\n   * Gets whether the character is considered a word separator by the select\n   * word logic.\n   * @param cell The cell to check.\n   */\n  private _isCharWordSeparator(cell: CellData): boolean {\n    // Zero width characters are never separators as they are always to the\n    // right of wide characters\n    if (cell.getWidth() === 0) {\n      return false;\n    }\n    return this._optionsService.rawOptions.wordSeparator.indexOf(cell.getChars()) >= 0;\n  }\n\n  /**\n   * Selects the line specified.\n   * @param line The line index.\n   */\n  protected _selectLineAt(line: number): void {\n    const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n    const range: IBufferRange = {\n      start: { x: 0, y: wrappedRange.first },\n      end: { x: this._bufferService.cols - 1, y: wrappedRange.last }\n    };\n    this._model.selectionStart = [0, wrappedRange.first];\n    this._model.selectionEnd = undefined;\n    this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols);\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { AllColorIndex, IDisposable } from 'common/Types';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n  serviceBrand: undefined;\n\n  readonly width: number;\n  readonly height: number;\n  readonly hasValidSize: boolean;\n\n  readonly onCharSizeChange: IEvent<void>;\n\n  measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n  serviceBrand: undefined;\n\n  readonly isFocused: boolean;\n  /**\n   * Parent window that the terminal is rendered into. DOM and rendering APIs\n   * (e.g. requestAnimationFrame) should be invoked in the context of this\n   * window.\n   */\n  readonly window: Window & typeof globalThis;\n  /**\n   * Helper for getting the devicePixelRatio of the parent window.\n   */\n  readonly dpr: number;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n  serviceBrand: undefined;\n\n  getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n  getMouseReportCoords(event: MouseEvent, element: HTMLElement): { col: number, row: number, x: number, y: number } | undefined;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n  serviceBrand: undefined;\n\n  onDimensionsChange: IEvent<IRenderDimensions>;\n  /**\n   * Fires when buffer changes are rendered. This does not fire when only cursor\n   * or selections are rendered.\n   */\n  onRenderedViewportChange: IEvent<{ start: number, end: number }>;\n  /**\n   * Fires on render\n   */\n  onRender: IEvent<{ start: number, end: number }>;\n  onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n  dimensions: IRenderDimensions;\n\n  addRefreshCallback(callback: FrameRequestCallback): number;\n\n  refreshRows(start: number, end: number): void;\n  clearTextureAtlas(): void;\n  resize(cols: number, rows: number): void;\n  hasRenderer(): boolean;\n  setRenderer(renderer: IRenderer): void;\n  handleDevicePixelRatioChange(): void;\n  handleResize(cols: number, rows: number): void;\n  handleCharSizeChanged(): void;\n  handleBlur(): void;\n  handleFocus(): void;\n  handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n  handleCursorMove(): void;\n  clear(): void;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n  serviceBrand: undefined;\n\n  readonly selectionText: string;\n  readonly hasSelection: boolean;\n  readonly selectionStart: [number, number] | undefined;\n  readonly selectionEnd: [number, number] | undefined;\n\n  readonly onLinuxMouseSelection: IEvent<string>;\n  readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n  readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n  readonly onSelectionChange: IEvent<void>;\n\n  disable(): void;\n  enable(): void;\n  reset(): void;\n  setSelection(row: number, col: number, length: number): void;\n  selectAll(): void;\n  selectLines(start: number, end: number): void;\n  clearSelection(): void;\n  rightClickSelect(event: MouseEvent): void;\n  shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n  shouldForceSelection(event: MouseEvent): boolean;\n  refresh(isLinuxMouseSelection?: boolean): void;\n  handleMouseDown(event: MouseEvent): void;\n  isCellInSelection(x: number, y: number): boolean;\n}\n\nexport const ICharacterJoinerService = createDecorator<ICharacterJoinerService>('CharacterJoinerService');\nexport interface ICharacterJoinerService {\n  serviceBrand: undefined;\n\n  register(handler: (text: string) => [number, number][]): number;\n  deregister(joinerId: number): boolean;\n  getJoinedCharacters(row: number): [number, number][];\n}\n\nexport const IThemeService = createDecorator<IThemeService>('ThemeService');\nexport interface IThemeService {\n  serviceBrand: undefined;\n\n  readonly colors: ReadonlyColorSet;\n\n  readonly onChangeColors: IEvent<ReadonlyColorSet>;\n\n  restoreColor(slot?: AllColorIndex): void;\n  /**\n   * Allows external modifying of colors in the theme, this is used instead of {@link colors} to\n   * prevent accidental writes.\n   */\n  modifyColors(callback: (colors: IColorSet) => void): void;\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\nimport { IThemeService } from 'browser/services/Services';\nimport { IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { channels, color, css, NULL_COLOR } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IOptionsService, ITheme } from 'common/services/Services';\nimport { AllColorIndex, IColor, SpecialColorIndex } from 'common/Types';\n\ninterface IRestoreColorSet {\n  foreground: IColor;\n  background: IColor;\n  cursor: IColor;\n  ansi: IColor[];\n}\n\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = css.toColor('#000000');\nconst DEFAULT_SELECTION = {\n  css: 'rgba(255, 255, 255, 0.3)',\n  rgba: 0xFFFFFF4D\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS.\nexport const DEFAULT_ANSI_COLORS = Object.freeze((() => {\n  const colors = [\n    // dark:\n    css.toColor('#2e3436'),\n    css.toColor('#cc0000'),\n    css.toColor('#4e9a06'),\n    css.toColor('#c4a000'),\n    css.toColor('#3465a4'),\n    css.toColor('#75507b'),\n    css.toColor('#06989a'),\n    css.toColor('#d3d7cf'),\n    // bright:\n    css.toColor('#555753'),\n    css.toColor('#ef2929'),\n    css.toColor('#8ae234'),\n    css.toColor('#fce94f'),\n    css.toColor('#729fcf'),\n    css.toColor('#ad7fa8'),\n    css.toColor('#34e2e2'),\n    css.toColor('#eeeeec')\n  ];\n\n  // Fill in the remaining 240 ANSI colors.\n  // Generate colors (16-231)\n  const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n  for (let i = 0; i < 216; i++) {\n    const r = v[(i / 36) % 6 | 0];\n    const g = v[(i / 6) % 6 | 0];\n    const b = v[i % 6];\n    colors.push({\n      css: channels.toCss(r, g, b),\n      rgba: channels.toRgba(r, g, b)\n    });\n  }\n\n  // Generate greys (232-255)\n  for (let i = 0; i < 24; i++) {\n    const c = 8 + i * 10;\n    colors.push({\n      css: channels.toCss(c, c, c),\n      rgba: channels.toRgba(c, c, c)\n    });\n  }\n\n  return colors;\n})());\n\nexport class ThemeService extends Disposable implements IThemeService {\n  public serviceBrand: undefined;\n\n  private _colors: IColorSet;\n  private _contrastCache: IColorContrastCache = new ColorContrastCache();\n  private _halfContrastCache: IColorContrastCache = new ColorContrastCache();\n  private _restoreColors!: IRestoreColorSet;\n\n  public get colors(): ReadonlyColorSet { return this._colors; }\n\n  private readonly _onChangeColors = this.register(new EventEmitter<ReadonlyColorSet>());\n  public readonly onChangeColors = this._onChangeColors.event;\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n\n    this._colors = {\n      foreground: DEFAULT_FOREGROUND,\n      background: DEFAULT_BACKGROUND,\n      cursor: DEFAULT_CURSOR,\n      cursorAccent: DEFAULT_CURSOR_ACCENT,\n      selectionForeground: undefined,\n      selectionBackgroundTransparent: DEFAULT_SELECTION,\n      selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      selectionInactiveBackgroundTransparent: DEFAULT_SELECTION,\n      selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n      ansi: DEFAULT_ANSI_COLORS.slice(),\n      contrastCache: this._contrastCache,\n      halfContrastCache: this._halfContrastCache\n    };\n    this._updateRestoreColors();\n    this._setTheme(this._optionsService.rawOptions.theme);\n\n    this.register(this._optionsService.onSpecificOptionChange('minimumContrastRatio', () => this._contrastCache.clear()));\n    this.register(this._optionsService.onSpecificOptionChange('theme', () => this._setTheme(this._optionsService.rawOptions.theme)));\n  }\n\n  /**\n   * Sets the terminal's theme.\n   * @param theme The  theme to use. If a partial theme is provided then default\n   * colors will be used where colors are not defined.\n   */\n  private _setTheme(theme: ITheme = {}): void {\n    const colors = this._colors;\n    colors.foreground = parseColor(theme.foreground, DEFAULT_FOREGROUND);\n    colors.background = parseColor(theme.background, DEFAULT_BACKGROUND);\n    colors.cursor = parseColor(theme.cursor, DEFAULT_CURSOR);\n    colors.cursorAccent = parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT);\n    colors.selectionBackgroundTransparent = parseColor(theme.selectionBackground, DEFAULT_SELECTION);\n    colors.selectionBackgroundOpaque = color.blend(colors.background, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundTransparent = parseColor(theme.selectionInactiveBackground, colors.selectionBackgroundTransparent);\n    colors.selectionInactiveBackgroundOpaque = color.blend(colors.background, colors.selectionInactiveBackgroundTransparent);\n    colors.selectionForeground = theme.selectionForeground ? parseColor(theme.selectionForeground, NULL_COLOR) : undefined;\n    if (colors.selectionForeground === NULL_COLOR) {\n      colors.selectionForeground = undefined;\n    }\n\n    /**\n     * If selection color is opaque, blend it with background with 0.3 opacity\n     * Issue #2737\n     */\n    if (color.isOpaque(colors.selectionBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionBackgroundTransparent = color.opacity(colors.selectionBackgroundTransparent, opacity);\n    }\n    if (color.isOpaque(colors.selectionInactiveBackgroundTransparent)) {\n      const opacity = 0.3;\n      colors.selectionInactiveBackgroundTransparent = color.opacity(colors.selectionInactiveBackgroundTransparent, opacity);\n    }\n    colors.ansi = DEFAULT_ANSI_COLORS.slice();\n    colors.ansi[0] = parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n    colors.ansi[1] = parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n    colors.ansi[2] = parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n    colors.ansi[3] = parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n    colors.ansi[4] = parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n    colors.ansi[5] = parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n    colors.ansi[6] = parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n    colors.ansi[7] = parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n    colors.ansi[8] = parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n    colors.ansi[9] = parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n    colors.ansi[10] = parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n    colors.ansi[11] = parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n    colors.ansi[12] = parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n    colors.ansi[13] = parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n    colors.ansi[14] = parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n    colors.ansi[15] = parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n    if (theme.extendedAnsi) {\n      const colorCount = Math.min(colors.ansi.length - 16, theme.extendedAnsi.length);\n      for (let i = 0; i < colorCount; i++) {\n        colors.ansi[i + 16] = parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]);\n      }\n    }\n    // Clear our the cache\n    this._contrastCache.clear();\n    this._halfContrastCache.clear();\n    this._updateRestoreColors();\n    this._onChangeColors.fire(this.colors);\n  }\n\n  public restoreColor(slot?: AllColorIndex): void {\n    this._restoreColor(slot);\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _restoreColor(slot: AllColorIndex | undefined): void {\n    // unset slot restores all ansi colors\n    if (slot === undefined) {\n      for (let i = 0; i < this._restoreColors.ansi.length; ++i) {\n        this._colors.ansi[i] = this._restoreColors.ansi[i];\n      }\n      return;\n    }\n    switch (slot) {\n      case SpecialColorIndex.FOREGROUND:\n        this._colors.foreground = this._restoreColors.foreground;\n        break;\n      case SpecialColorIndex.BACKGROUND:\n        this._colors.background = this._restoreColors.background;\n        break;\n      case SpecialColorIndex.CURSOR:\n        this._colors.cursor = this._restoreColors.cursor;\n        break;\n      default:\n        this._colors.ansi[slot] = this._restoreColors.ansi[slot];\n    }\n  }\n\n  public modifyColors(callback: (colors: IColorSet) => void): void {\n    callback(this._colors);\n    // Assume the change happened\n    this._onChangeColors.fire(this.colors);\n  }\n\n  private _updateRestoreColors(): void {\n    this._restoreColors = {\n      foreground: this._colors.foreground,\n      background: this._colors.background,\n      cursor: this._colors.cursor,\n      ansi: this._colors.ansi.slice()\n    };\n  }\n}\n\nfunction parseColor(\n  cssString: string | undefined,\n  fallback: IColor\n): IColor {\n  if (cssString !== undefined) {\n    try {\n      return css.toColor(cssString);\n    } catch {\n      // no-op\n    }\n  }\n  return fallback;\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\n\nexport interface IInsertEvent {\n  index: number;\n  amount: number;\n}\n\nexport interface IDeleteEvent {\n  index: number;\n  amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> extends Disposable implements ICircularList<T> {\n  protected _array: (T | undefined)[];\n  private _startIndex: number;\n  private _length: number;\n\n  public readonly onDeleteEmitter = this.register(new EventEmitter<IDeleteEvent>());\n  public readonly onDelete = this.onDeleteEmitter.event;\n  public readonly onInsertEmitter = this.register(new EventEmitter<IInsertEvent>());\n  public readonly onInsert = this.onInsertEmitter.event;\n  public readonly onTrimEmitter = this.register(new EventEmitter<number>());\n  public readonly onTrim = this.onTrimEmitter.event;\n\n  constructor(\n    private _maxLength: number\n  ) {\n    super();\n    this._array = new Array<T>(this._maxLength);\n    this._startIndex = 0;\n    this._length = 0;\n  }\n\n  public get maxLength(): number {\n    return this._maxLength;\n  }\n\n  public set maxLength(newMaxLength: number) {\n    // There was no change in maxLength, return early.\n    if (this._maxLength === newMaxLength) {\n      return;\n    }\n\n    // Reconstruct array, starting at index 0. Only transfer values from the\n    // indexes 0 to length.\n    const newArray = new Array<T | undefined>(newMaxLength);\n    for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n      newArray[i] = this._array[this._getCyclicIndex(i)];\n    }\n    this._array = newArray;\n    this._maxLength = newMaxLength;\n    this._startIndex = 0;\n  }\n\n  public get length(): number {\n    return this._length;\n  }\n\n  public set length(newLength: number) {\n    if (newLength > this._length) {\n      for (let i = this._length; i < newLength; i++) {\n        this._array[i] = undefined;\n      }\n    }\n    this._length = newLength;\n  }\n\n  /**\n   * Gets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index of the value to get.\n   * @returns The value corresponding to the index.\n   */\n  public get(index: number): T | undefined {\n    return this._array[this._getCyclicIndex(index)];\n  }\n\n  /**\n   * Sets the value at an index.\n   *\n   * Note that for performance reasons there is no bounds checking here, the index reference is\n   * circular so this should always return a value and never throw.\n   * @param index The index to set.\n   * @param value The value to set.\n   */\n  public set(index: number, value: T | undefined): void {\n    this._array[this._getCyclicIndex(index)] = value;\n  }\n\n  /**\n   * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n   * if the maximum length is reached.\n   * @param value The value to push onto the list.\n   */\n  public push(value: T): void {\n    this._array[this._getCyclicIndex(this._length)] = value;\n    if (this._length === this._maxLength) {\n      this._startIndex = ++this._startIndex % this._maxLength;\n      this.onTrimEmitter.fire(1);\n    } else {\n      this._length++;\n    }\n  }\n\n  /**\n   * Advance ringbuffer index and return current element for recycling.\n   * Note: The buffer must be full for this method to work.\n   * @throws When the buffer is not full.\n   */\n  public recycle(): T {\n    if (this._length !== this._maxLength) {\n      throw new Error('Can only recycle when the buffer is full');\n    }\n    this._startIndex = ++this._startIndex % this._maxLength;\n    this.onTrimEmitter.fire(1);\n    return this._array[this._getCyclicIndex(this._length - 1)]!;\n  }\n\n  /**\n   * Ringbuffer is at max length.\n   */\n  public get isFull(): boolean {\n    return this._length === this._maxLength;\n  }\n\n  /**\n   * Removes and returns the last value on the list.\n   * @returns The popped value.\n   */\n  public pop(): T | undefined {\n    return this._array[this._getCyclicIndex(this._length-- - 1)];\n  }\n\n  /**\n   * Deletes and/or inserts items at a particular index (in that order). Unlike\n   * Array.prototype.splice, this operation does not return the deleted items as a new array in\n   * order to save creating a new array. Note that this operation may shift all values in the list\n   * in the worst case.\n   * @param start The index to delete and/or insert.\n   * @param deleteCount The number of elements to delete.\n   * @param items The items to insert.\n   */\n  public splice(start: number, deleteCount: number, ...items: T[]): void {\n    // Delete items\n    if (deleteCount) {\n      for (let i = start; i < this._length - deleteCount; i++) {\n        this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n      }\n      this._length -= deleteCount;\n      this.onDeleteEmitter.fire({ index: start, amount: deleteCount });\n    }\n\n    // Add items\n    for (let i = this._length - 1; i >= start; i--) {\n      this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n    }\n    for (let i = 0; i < items.length; i++) {\n      this._array[this._getCyclicIndex(start + i)] = items[i];\n    }\n    if (items.length) {\n      this.onInsertEmitter.fire({ index: start, amount: items.length });\n    }\n\n    // Adjust length as needed\n    if (this._length + items.length > this._maxLength) {\n      const countToTrim = (this._length + items.length) - this._maxLength;\n      this._startIndex += countToTrim;\n      this._length = this._maxLength;\n      this.onTrimEmitter.fire(countToTrim);\n    } else {\n      this._length += items.length;\n    }\n  }\n\n  /**\n   * Trims a number of items from the start of the list.\n   * @param count The number of items to remove.\n   */\n  public trimStart(count: number): void {\n    if (count > this._length) {\n      count = this._length;\n    }\n    this._startIndex += count;\n    this._length -= count;\n    this.onTrimEmitter.fire(count);\n  }\n\n  public shiftElements(start: number, count: number, offset: number): void {\n    if (count <= 0) {\n      return;\n    }\n    if (start < 0 || start >= this._length) {\n      throw new Error('start argument out of range');\n    }\n    if (start + offset < 0) {\n      throw new Error('Cannot shift elements in list beyond index 0');\n    }\n\n    if (offset > 0) {\n      for (let i = count - 1; i >= 0; i--) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n      const expandListBy = (start + count + offset) - this._length;\n      if (expandListBy > 0) {\n        this._length += expandListBy;\n        while (this._length > this._maxLength) {\n          this._length--;\n          this._startIndex++;\n          this.onTrimEmitter.fire(1);\n        }\n      }\n    } else {\n      for (let i = 0; i < count; i++) {\n        this.set(start + i + offset, this.get(start + i));\n      }\n    }\n  }\n\n  /**\n   * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n   * backing array to get the element associated with the regular index.\n   * @param index The regular index.\n   * @returns The cyclic index.\n   */\n  private _getCyclicIndex(index: number): number {\n    return (this._startIndex + index) % this._maxLength;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n  if (typeof val !== 'object') {\n    return val;\n  }\n\n  // If we're cloning an array, use an array as the base, otherwise use an object\n  const clonedObject: any = Array.isArray(val) ? [] : {};\n\n  for (const key in val) {\n    // Recursively clone eack item unless we're at the maximum depth\n    clonedObject[key] = depth <= 1 ? val[key] : (val[key] && clone(val[key], depth - 1));\n  }\n\n  return clonedObject as T;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n  css: '#00000000',\n  rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n  export function toCss(r: number, g: number, b: number, a?: number): string {\n    if (a !== undefined) {\n      return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n    }\n    return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n  }\n\n  export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n    // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n    // on LE systems, before it can be used for direct 32-bit buffer writes.\n    // >>> 0 forces an unsigned int\n    return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n  }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n  export function blend(bg: IColor, fg: IColor): IColor {\n    $a = (fg.rgba & 0xFF) / 255;\n    if ($a === 1) {\n      return {\n        css: fg.css,\n        rgba: fg.rgba\n      };\n    }\n    const fgR = (fg.rgba >> 24) & 0xFF;\n    const fgG = (fg.rgba >> 16) & 0xFF;\n    const fgB = (fg.rgba >> 8) & 0xFF;\n    const bgR = (bg.rgba >> 24) & 0xFF;\n    const bgG = (bg.rgba >> 16) & 0xFF;\n    const bgB = (bg.rgba >> 8) & 0xFF;\n    $r = bgR + Math.round((fgR - bgR) * $a);\n    $g = bgG + Math.round((fgG - bgG) * $a);\n    $b = bgB + Math.round((fgB - bgB) * $a);\n    const css = channels.toCss($r, $g, $b);\n    const rgba = channels.toRgba($r, $g, $b);\n    return { css, rgba };\n  }\n\n  export function isOpaque(color: IColor): boolean {\n    return (color.rgba & 0xFF) === 0xFF;\n  }\n\n  export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n    const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n    if (!result) {\n      return undefined;\n    }\n    return rgba.toColor(\n      (result >> 24 & 0xFF),\n      (result >> 16 & 0xFF),\n      (result >> 8  & 0xFF)\n    );\n  }\n\n  export function opaque(color: IColor): IColor {\n    const rgbaColor = (color.rgba | 0xFF) >>> 0;\n    [$r, $g, $b] = rgba.toChannels(rgbaColor);\n    return {\n      css: channels.toCss($r, $g, $b),\n      rgba: rgbaColor\n    };\n  }\n\n  export function opacity(color: IColor, opacity: number): IColor {\n    $a = Math.round(opacity * 0xFF);\n    [$r, $g, $b] = rgba.toChannels(color.rgba);\n    return {\n      css: channels.toCss($r, $g, $b, $a),\n      rgba: channels.toRgba($r, $g, $b, $a)\n    };\n  }\n\n  export function multiplyOpacity(color: IColor, factor: number): IColor {\n    $a = color.rgba & 0xFF;\n    return opacity(color, ($a * factor) / 0xFF);\n  }\n\n  export function toColorRGB(color: IColor): IColorRGB {\n    return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n  }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n  let $ctx: CanvasRenderingContext2D | undefined;\n  let $litmusColor: CanvasGradient | undefined;\n  if (!isNode) {\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    const ctx = canvas.getContext('2d', {\n      willReadFrequently: true\n    });\n    if (ctx) {\n      $ctx = ctx;\n      $ctx.globalCompositeOperation = 'copy';\n      $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n    }\n  }\n\n  /**\n   * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n   * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n   *\n   * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n   * environment.\n   */\n  export function toColor(css: string): IColor {\n    // Formats: #rgb[a] and #rrggbb[aa]\n    if (css.match(/#[\\da-f]{3,8}/i)) {\n      switch (css.length) {\n        case 4: { // #rgb\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          return rgba.toColor($r, $g, $b);\n        }\n        case 5: { // #rgba\n          $r = parseInt(css.slice(1, 2).repeat(2), 16);\n          $g = parseInt(css.slice(2, 3).repeat(2), 16);\n          $b = parseInt(css.slice(3, 4).repeat(2), 16);\n          $a = parseInt(css.slice(4, 5).repeat(2), 16);\n          return rgba.toColor($r, $g, $b, $a);\n        }\n        case 7: // #rrggbb\n          return {\n            css,\n            rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n          };\n        case 9: // #rrggbbaa\n          return {\n            css,\n            rgba: parseInt(css.slice(1), 16) >>> 0\n          };\n      }\n    }\n\n    // Formats: rgb() or rgba()\n    const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n    if (rgbaMatch) {\n      $r = parseInt(rgbaMatch[1]);\n      $g = parseInt(rgbaMatch[2]);\n      $b = parseInt(rgbaMatch[3]);\n      $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n      return rgba.toColor($r, $g, $b, $a);\n    }\n\n    // Validate the context is available for canvas-based color parsing\n    if (!$ctx || !$litmusColor) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Validate the color using canvas fillStyle\n    // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n    $ctx.fillStyle = $litmusColor;\n    $ctx.fillStyle = css;\n    if (typeof $ctx.fillStyle !== 'string') {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    $ctx.fillRect(0, 0, 1, 1);\n    [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n    // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n    if ($a !== 0xFF) {\n      throw new Error('css.toColor: Unsupported css format');\n    }\n\n    // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n    // format\n    // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n    return {\n      rgba: channels.toRgba($r, $g, $b, $a),\n      css\n    };\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param rgb The color to use.\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance(rgb: number): number {\n    return relativeLuminance2(\n      (rgb >> 16) & 0xFF,\n      (rgb >> 8 ) & 0xFF,\n      (rgb      ) & 0xFF);\n  }\n\n  /**\n   * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n   * between two colors.\n   * @param r The red channel (0x00 to 0xFF).\n   * @param g The green channel (0x00 to 0xFF).\n   * @param b The blue channel (0x00 to 0xFF).\n   * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n   */\n  export function relativeLuminance2(r: number, g: number, b: number): number {\n    const rs = r / 255;\n    const gs = g / 255;\n    const bs = b / 255;\n    const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n    const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n    const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n    return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n  }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n  /**\n   * Given a foreground color and a background color, either increase or reduce the luminance of the\n   * foreground color until the specified contrast ratio is met. If pure white or black is hit\n   * without the contrast ratio being met, go the other direction using the background color as the\n   * foreground color and take either the first or second result depending on which has the higher\n   * contrast ratio.\n   *\n   * `undefined` will be returned if the contrast ratio is already met.\n   *\n   * @param bgRgba The background color in rgba format.\n   * @param fgRgba The foreground color in rgba format.\n   * @param ratio The contrast ratio to achieve.\n   */\n  export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n    const bgL = rgb.relativeLuminance(bgRgba >> 8);\n    const fgL = rgb.relativeLuminance(fgRgba >> 8);\n    const cr = contrastRatio(bgL, fgL);\n    if (cr < ratio) {\n      if (fgL < bgL) {\n        const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n        if (resultARatio < ratio) {\n          const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n          const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n          return resultARatio > resultBRatio ? resultA : resultB;\n        }\n        return resultA;\n      }\n      const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n      const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n      if (resultARatio < ratio) {\n        const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n        const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n        return resultARatio > resultBRatio ? resultA : resultB;\n      }\n      return resultA;\n    }\n    return undefined;\n  }\n\n  export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to reducing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n      // Reduce by 10% until the ratio is hit\n      fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n      fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n      fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n    // This is a naive but fast approach to increasing luminance as converting to\n    // HSL and back is expensive\n    const bgR = (bgRgba >> 24) & 0xFF;\n    const bgG = (bgRgba >> 16) & 0xFF;\n    const bgB = (bgRgba >>  8) & 0xFF;\n    let fgR = (fgRgba >> 24) & 0xFF;\n    let fgG = (fgRgba >> 16) & 0xFF;\n    let fgB = (fgRgba >>  8) & 0xFF;\n    let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n      // Increase by 10% until the ratio is hit\n      fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n      fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n      fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n      cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n    }\n    return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n  }\n\n  // FIXME: Move this to channels NS?\n  export function toChannels(value: number): [number, number, number, number] {\n    return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n  }\n\n  export function toColor(r: number, g: number, b: number, a?: number): IColor {\n    return {\n      css: channels.toCss(r, g, b, a),\n      rgba: channels.toRgba(r, g, b, a)\n    };\n  }\n}\n\nexport function toPaddedHex(c: number): string {\n  const s = c.toString(16);\n  return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n  if (l1 < l2) {\n    return (l2 + 0.05) / (l1 + 0.05);\n  }\n  return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n *\n * Terminal Emulation References:\n *   http://vt100.net/\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n *   http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n *   http://invisible-island.net/vttest/\n *   http://www.inwap.com/pdp10/ansicode.txt\n *   http://linux.die.net/man/4/console_codes\n *   http://linux.die.net/man/7/urxvt\n */\n\nimport { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent, ScrollSource } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\nimport { OscLinkService } from 'common/services/OscLinkService';\n\n// Only trigger this warning a single time per session\nlet hasWriteSyncWarnHappened = false;\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n  protected readonly _instantiationService: IInstantiationService;\n  protected readonly _bufferService: IBufferService;\n  protected readonly _logService: ILogService;\n  protected readonly _charsetService: ICharsetService;\n  protected readonly _oscLinkService: IOscLinkService;\n\n  public readonly coreMouseService: ICoreMouseService;\n  public readonly coreService: ICoreService;\n  public readonly unicodeService: IUnicodeService;\n  public readonly optionsService: IOptionsService;\n\n  protected _inputHandler: InputHandler;\n  private _writeBuffer: WriteBuffer;\n  private _windowsWrappingHeuristics = this.register(new MutableDisposable());\n\n  private readonly _onBinary = this.register(new EventEmitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onData = this.register(new EventEmitter<string>());\n  public readonly onData = this._onData.event;\n  protected _onLineFeed = this.register(new EventEmitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());\n  public readonly onResize = this._onResize.event;\n  protected readonly _onWriteParsed = this.register(new EventEmitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  /**\n   * Internally we track the source of the scroll but this is meaningless outside the library so\n   * it's filtered out.\n   */\n  protected _onScrollApi?: EventEmitter<number, void>;\n  protected _onScroll = this.register(new EventEmitter<IScrollEvent, void>());\n  public get onScroll(): IEvent<number, void> {\n    if (!this._onScrollApi) {\n      this._onScrollApi = this.register(new EventEmitter<number, void>());\n      this._onScroll.event(ev => {\n        this._onScrollApi?.fire(ev.position);\n      });\n    }\n    return this._onScrollApi.event;\n  }\n\n  public get cols(): number { return this._bufferService.cols; }\n  public get rows(): number { return this._bufferService.rows; }\n  public get buffers(): IBufferSet { return this._bufferService.buffers; }\n  public get options(): Required<ITerminalOptions> { return this.optionsService.options; }\n  public set options(options: ITerminalOptions) {\n    for (const key in options) {\n      this.optionsService.options[key] = options[key];\n    }\n  }\n\n  constructor(\n    options: Partial<ITerminalOptions>\n  ) {\n    super();\n\n    // Setup and initialize services\n    this._instantiationService = new InstantiationService();\n    this.optionsService = this.register(new OptionsService(options));\n    this._instantiationService.setService(IOptionsService, this.optionsService);\n    this._bufferService = this.register(this._instantiationService.createInstance(BufferService));\n    this._instantiationService.setService(IBufferService, this._bufferService);\n    this._logService = this.register(this._instantiationService.createInstance(LogService));\n    this._instantiationService.setService(ILogService, this._logService);\n    this.coreService = this.register(this._instantiationService.createInstance(CoreService));\n    this._instantiationService.setService(ICoreService, this.coreService);\n    this.coreMouseService = this.register(this._instantiationService.createInstance(CoreMouseService));\n    this._instantiationService.setService(ICoreMouseService, this.coreMouseService);\n    this.unicodeService = this.register(this._instantiationService.createInstance(UnicodeService));\n    this._instantiationService.setService(IUnicodeService, this.unicodeService);\n    this._charsetService = this._instantiationService.createInstance(CharsetService);\n    this._instantiationService.setService(ICharsetService, this._charsetService);\n    this._oscLinkService = this._instantiationService.createInstance(OscLinkService);\n    this._instantiationService.setService(IOscLinkService, this._oscLinkService);\n\n    // Register input handler and handle/forward events\n    this._inputHandler = this.register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService));\n    this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));\n    this.register(this._inputHandler);\n\n    // Setup listeners\n    this.register(forwardEvent(this._bufferService.onResize, this._onResize));\n    this.register(forwardEvent(this.coreService.onData, this._onData));\n    this.register(forwardEvent(this.coreService.onBinary, this._onBinary));\n    this.register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom()));\n    this.register(this.coreService.onUserInput(() =>  this._writeBuffer.handleUserInput()));\n    this.register(this.optionsService.onMultipleOptionChange(['windowsMode', 'windowsPty'], () => this._handleWindowsPtyOptionChange()));\n    this.register(this._bufferService.onScroll(event => {\n      this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n      this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n    }));\n    this.register(this._inputHandler.onScroll(event => {\n      this._onScroll.fire({ position: this._bufferService.buffer.ydisp, source: ScrollSource.TERMINAL });\n      this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop, this._bufferService.buffer.scrollBottom);\n    }));\n\n    // Setup WriteBuffer\n    this._writeBuffer = this.register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));\n    this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._writeBuffer.write(data, callback);\n  }\n\n  /**\n   * Write data to terminal synchonously.\n   *\n   * This method is unreliable with async parser handlers, thus should not\n   * be used anymore. If you need blocking semantics on data input consider\n   * `write` with a callback instead.\n   *\n   * @deprecated Unreliable, will be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    if (this._logService.logLevel <= LogLevelEnum.WARN && !hasWriteSyncWarnHappened) {\n      this._logService.warn('writeSync is unreliable and will be removed soon.');\n      hasWriteSyncWarnHappened = true;\n    }\n    this._writeBuffer.writeSync(data, maxSubsequentCalls);\n  }\n\n  public resize(x: number, y: number): void {\n    if (isNaN(x) || isNaN(y)) {\n      return;\n    }\n\n    x = Math.max(x, MINIMUM_COLS);\n    y = Math.max(y, MINIMUM_ROWS);\n\n    this._bufferService.resize(x, y);\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    this._bufferService.scroll(eraseAttr, isWrapped);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used to avoid\n   * unwanted events being handled by the viewport when the event was triggered from the viewport\n   * originally.\n   * @param source Which component the event came from.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n    this._bufferService.scrollLines(disp, suppressScrollEvent, source);\n  }\n\n  public scrollPages(pageCount: number): void {\n    this.scrollLines(pageCount * (this.rows - 1));\n  }\n\n  public scrollToTop(): void {\n    this.scrollLines(-this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToBottom(): void {\n    this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n  }\n\n  public scrollToLine(line: number): void {\n    const scrollAmount = line - this._bufferService.buffer.ydisp;\n    if (scrollAmount !== 0) {\n      this.scrollLines(scrollAmount);\n    }\n  }\n\n  /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerEscHandler(id, callback);\n  }\n\n  /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerDcsHandler(id, callback);\n  }\n\n  /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerCsiHandler(id, callback);\n  }\n\n  /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._inputHandler.registerOscHandler(ident, callback);\n  }\n\n  protected _setup(): void {\n    this._handleWindowsPtyOptionChange();\n  }\n\n  public reset(): void {\n    this._inputHandler.reset();\n    this._bufferService.reset();\n    this._charsetService.reset();\n    this.coreService.reset();\n    this.coreMouseService.reset();\n  }\n\n\n  private _handleWindowsPtyOptionChange(): void {\n    let value = false;\n    const windowsPty = this.optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber !== undefined && windowsPty.buildNumber !== undefined) {\n      value = !!(windowsPty.backend === 'conpty' && windowsPty.buildNumber < 21376);\n    } else if (this.optionsService.rawOptions.windowsMode) {\n      value = true;\n    }\n    if (value) {\n      this._enableWindowsWrappingHeuristics();\n    } else {\n      this._windowsWrappingHeuristics.clear();\n    }\n  }\n\n  protected _enableWindowsWrappingHeuristics(): void {\n    if (!this._windowsWrappingHeuristics.value) {\n      const disposables: IDisposable[] = [];\n      disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n      disposables.push(this.registerCsiHandler({ final: 'H' }, () => {\n        updateWindowsModeWrappedState(this._bufferService);\n        return false;\n      }));\n      this._windowsWrappingHeuristics.value = toDisposable(() => {\n        for (const d of disposables) {\n          d.dispose();\n        }\n      });\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n  (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n  (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n  event: IEvent<T, U>;\n  fire(arg1: T, arg2: U): void;\n  dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n  private _listeners: IListener<T, U>[] = [];\n  private _event?: IEvent<T, U>;\n  private _disposed: boolean = false;\n\n  public get event(): IEvent<T, U> {\n    if (!this._event) {\n      this._event = (listener: (arg1: T, arg2: U) => any) => {\n        this._listeners.push(listener);\n        const disposable = {\n          dispose: () => {\n            if (!this._disposed) {\n              for (let i = 0; i < this._listeners.length; i++) {\n                if (this._listeners[i] === listener) {\n                  this._listeners.splice(i, 1);\n                  return;\n                }\n              }\n            }\n          }\n        };\n        return disposable;\n      };\n    }\n    return this._event;\n  }\n\n  public fire(arg1: T, arg2: U): void {\n    const queue: IListener<T, U>[] = [];\n    for (let i = 0; i < this._listeners.length; i++) {\n      queue.push(this._listeners[i]);\n    }\n    for (let i = 0; i < queue.length; i++) {\n      queue[i].call(undefined, arg1, arg2);\n    }\n  }\n\n  public dispose(): void {\n    this.clearListeners();\n    this._disposed = true;\n  }\n\n  public clearListeners(): void {\n    if (this._listeners) {\n      this._listeners.length = 0;\n    }\n  }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n  return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, ICoreMouseService, ICharsetService, IUnicodeService, LogLevelEnum, IOscLinkService } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\nimport { IBuffer } from 'common/buffer/Types';\nimport { parseColor } from 'common/input/XParseColor';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2 };\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y   ESC   CSI   \"Control Sequence Introducer\"   \"ESC [\"   \"Start of a CSI sequence.\"\n// @vt: #Y   ESC   OSC   \"Operating System Command\"      \"ESC ]\"   \"Start of an OSC sequence.\"\n// @vt: #Y   ESC   DCS   \"Device Control String\"         \"ESC P\"   \"Start of a DCS sequence.\"\n// @vt: #Y   ESC   ST    \"String Terminator\"             \"ESC \\\"   \"Terminator used for string type sequences.\"\n// @vt: #Y   ESC   PM    \"Privacy Message\"               \"ESC ^\"   \"Start of a privacy message.\"\n// @vt: #Y   ESC   APC   \"Application Program Command\"   \"ESC _\"   \"Start of an APC sequence.\"\n// @vt: #Y   C1    CSI   \"Control Sequence Introducer\"   \"\\x9B\"    \"Start of a CSI sequence.\"\n// @vt: #Y   C1    OSC   \"Operating System Command\"      \"\\x9D\"    \"Start of an OSC sequence.\"\n// @vt: #Y   C1    DCS   \"Device Control String\"         \"\\x90\"    \"Start of a DCS sequence.\"\n// @vt: #Y   C1    ST    \"String Terminator\"             \"\\x9C\"    \"Terminator used for string type sequences.\"\n// @vt: #Y   C1    PM    \"Privacy Message\"               \"\\x9E\"    \"Start of a privacy message.\"\n// @vt: #Y   C1    APC   \"Application Program Command\"   \"\\x9F\"    \"Start of an APC sequence.\"\n// @vt: #Y   C0    NUL   \"Null\"                          \"\\0, \\x00\"  \"NUL is ignored.\"\n// @vt: #Y   C0    ESC   \"Escape\"                        \"\\e, \\x1B\"  \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document xterm VT features here that are currently unsupported\n */\n// @vt: #E[Supported via xterm-addon-image.]  DCS   SIXEL       \"SIXEL Graphics\"          \"DCS Ps ; Ps ; Ps ; q \tPt ST\"  \"Draw SIXEL image.\"\n// @vt: #N  DCS   DECUDK      \"User Defined Keys\"       \"DCS Ps ; Ps \\| Pt ST\"           \"Definitions for user-defined keys.\"\n// @vt: #N  DCS   XTGETTCAP   \"Request Terminfo String\" \"DCS + q Pt ST\"                 \"Request Terminfo String.\"\n// @vt: #N  DCS   XTSETTCAP   \"Set Terminfo Data\"       \"DCS + p Pt ST\"                 \"Set Terminfo Data.\"\n// @vt: #N  OSC   1           \"Set Icon Name\"           \"OSC 1 ; Pt BEL\"                \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n  if (n > 24) {\n    return opts.setWinLines || false;\n  }\n  switch (n) {\n    case 1: return !!opts.restoreWin;\n    case 2: return !!opts.minimizeWin;\n    case 3: return !!opts.setWinPosition;\n    case 4: return !!opts.setWinSizePixels;\n    case 5: return !!opts.raiseWin;\n    case 6: return !!opts.lowerWin;\n    case 7: return !!opts.refreshWin;\n    case 8: return !!opts.setWinSizeChars;\n    case 9: return !!opts.maximizeWin;\n    case 10: return !!opts.fullscreenWin;\n    case 11: return !!opts.getWinState;\n    case 13: return !!opts.getWinPosition;\n    case 14: return !!opts.getWinSizePixels;\n    case 15: return !!opts.getScreenSizePixels;\n    case 16: return !!opts.getCellSizePixels;\n    case 18: return !!opts.getWinSizeChars;\n    case 19: return !!opts.getScreenSizeChars;\n    case 20: return !!opts.getIconTitle;\n    case 21: return !!opts.getWinTitle;\n    case 22: return !!opts.pushTitle;\n    case 23: return !!opts.popTitle;\n    case 24: return !!opts.setWinLines;\n  }\n  return false;\n}\n\nexport enum WindowsOptionsReportType {\n  GET_WIN_SIZE_PIXELS = 0,\n  GET_CELL_SIZE_PIXELS = 1\n}\n\n// create a warning log if an async handler takes longer than the limit (in ms)\nconst SLOW_ASYNC_LIMIT = 5000;\n\n// Work variables to avoid garbage collection\nlet $temp = 0;\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n  private _parseBuffer: Uint32Array = new Uint32Array(4096);\n  private _stringDecoder: StringToUtf32 = new StringToUtf32();\n  private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n  private _workCell: CellData = new CellData();\n  private _windowTitle = '';\n  private _iconName = '';\n  private _dirtyRowTracker: IDirtyRowTracker;\n  protected _windowTitleStack: string[] = [];\n  protected _iconNameStack: string[] = [];\n\n  private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n  public getAttrData(): IAttributeData { return this._curAttrData; }\n  private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n  private _activeBuffer: IBuffer;\n\n  private readonly _onRequestBell = this.register(new EventEmitter<void>());\n  public readonly onRequestBell = this._onRequestBell.event;\n  private readonly _onRequestRefreshRows = this.register(new EventEmitter<number, number>());\n  public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;\n  private readonly _onRequestReset = this.register(new EventEmitter<void>());\n  public readonly onRequestReset = this._onRequestReset.event;\n  private readonly _onRequestSendFocus = this.register(new EventEmitter<void>());\n  public readonly onRequestSendFocus = this._onRequestSendFocus.event;\n  private readonly _onRequestSyncScrollBar = this.register(new EventEmitter<void>());\n  public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;\n  private readonly _onRequestWindowsOptionsReport = this.register(new EventEmitter<WindowsOptionsReportType>());\n  public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;\n\n  private readonly _onA11yChar = this.register(new EventEmitter<string>());\n  public readonly onA11yChar = this._onA11yChar.event;\n  private readonly _onA11yTab = this.register(new EventEmitter<number>());\n  public readonly onA11yTab = this._onA11yTab.event;\n  private readonly _onCursorMove = this.register(new EventEmitter<void>());\n  public readonly onCursorMove = this._onCursorMove.event;\n  private readonly _onLineFeed = this.register(new EventEmitter<void>());\n  public readonly onLineFeed = this._onLineFeed.event;\n  private readonly _onScroll = this.register(new EventEmitter<number>());\n  public readonly onScroll = this._onScroll.event;\n  private readonly _onTitleChange = this.register(new EventEmitter<string>());\n  public readonly onTitleChange = this._onTitleChange.event;\n  private readonly _onColor = this.register(new EventEmitter<IColorEvent>());\n  public readonly onColor = this._onColor.event;\n\n  private _parseStack: IParseStack = {\n    paused: false,\n    cursorStartX: 0,\n    cursorStartY: 0,\n    decodedLength: 0,\n    position: 0\n  };\n\n  constructor(\n    private readonly _bufferService: IBufferService,\n    private readonly _charsetService: ICharsetService,\n    private readonly _coreService: ICoreService,\n    private readonly _logService: ILogService,\n    private readonly _optionsService: IOptionsService,\n    private readonly _oscLinkService: IOscLinkService,\n    private readonly _coreMouseService: ICoreMouseService,\n    private readonly _unicodeService: IUnicodeService,\n    private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n  ) {\n    super();\n    this.register(this._parser);\n    this._dirtyRowTracker = new DirtyRowTracker(this._bufferService);\n\n    // Track properties used in performance critical code manually to avoid using slow getters\n    this._activeBuffer = this._bufferService.buffer;\n    this.register(this._bufferService.buffers.onBufferActivate(e => this._activeBuffer = e.activeBuffer));\n\n    /**\n     * custom fallback handlers\n     */\n    this._parser.setCsiHandlerFallback((ident, params) => {\n      this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n    });\n    this._parser.setEscHandlerFallback(ident => {\n      this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n    });\n    this._parser.setExecuteHandlerFallback(code => {\n      this._logService.debug('Unknown EXECUTE code: ', { code });\n    });\n    this._parser.setOscHandlerFallback((identifier, action, data) => {\n      this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n    });\n    this._parser.setDcsHandlerFallback((ident, action, payload) => {\n      if (action === 'HOOK') {\n        payload = payload.toArray();\n      }\n      this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n    });\n\n    /**\n     * print handler\n     */\n    this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n    /**\n     * CSI handler\n     */\n    this._parser.registerCsiHandler({ final: '@' }, params => this.insertChars(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: '@' }, params => this.scrollLeft(params));\n    this._parser.registerCsiHandler({ final: 'A' }, params => this.cursorUp(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'A' }, params => this.scrollRight(params));\n    this._parser.registerCsiHandler({ final: 'B' }, params => this.cursorDown(params));\n    this._parser.registerCsiHandler({ final: 'C' }, params => this.cursorForward(params));\n    this._parser.registerCsiHandler({ final: 'D' }, params => this.cursorBackward(params));\n    this._parser.registerCsiHandler({ final: 'E' }, params => this.cursorNextLine(params));\n    this._parser.registerCsiHandler({ final: 'F' }, params => this.cursorPrecedingLine(params));\n    this._parser.registerCsiHandler({ final: 'G' }, params => this.cursorCharAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'H' }, params => this.cursorPosition(params));\n    this._parser.registerCsiHandler({ final: 'I' }, params => this.cursorForwardTab(params));\n    this._parser.registerCsiHandler({ final: 'J' }, params => this.eraseInDisplay(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'J' }, params => this.eraseInDisplay(params, true));\n    this._parser.registerCsiHandler({ final: 'K' }, params => this.eraseInLine(params, false));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'K' }, params => this.eraseInLine(params, true));\n    this._parser.registerCsiHandler({ final: 'L' }, params => this.insertLines(params));\n    this._parser.registerCsiHandler({ final: 'M' }, params => this.deleteLines(params));\n    this._parser.registerCsiHandler({ final: 'P' }, params => this.deleteChars(params));\n    this._parser.registerCsiHandler({ final: 'S' }, params => this.scrollUp(params));\n    this._parser.registerCsiHandler({ final: 'T' }, params => this.scrollDown(params));\n    this._parser.registerCsiHandler({ final: 'X' }, params => this.eraseChars(params));\n    this._parser.registerCsiHandler({ final: 'Z' }, params => this.cursorBackwardTab(params));\n    this._parser.registerCsiHandler({ final: '`' }, params => this.charPosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'a' }, params => this.hPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'b' }, params => this.repeatPrecedingCharacter(params));\n    this._parser.registerCsiHandler({ final: 'c' }, params => this.sendDeviceAttributesPrimary(params));\n    this._parser.registerCsiHandler({ prefix: '>', final: 'c' }, params => this.sendDeviceAttributesSecondary(params));\n    this._parser.registerCsiHandler({ final: 'd' }, params => this.linePosAbsolute(params));\n    this._parser.registerCsiHandler({ final: 'e' }, params => this.vPositionRelative(params));\n    this._parser.registerCsiHandler({ final: 'f' }, params => this.hVPosition(params));\n    this._parser.registerCsiHandler({ final: 'g' }, params => this.tabClear(params));\n    this._parser.registerCsiHandler({ final: 'h' }, params => this.setMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'h' }, params => this.setModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'l' }, params => this.resetMode(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'l' }, params => this.resetModePrivate(params));\n    this._parser.registerCsiHandler({ final: 'm' }, params => this.charAttributes(params));\n    this._parser.registerCsiHandler({ final: 'n' }, params => this.deviceStatus(params));\n    this._parser.registerCsiHandler({ prefix: '?', final: 'n' }, params => this.deviceStatusPrivate(params));\n    this._parser.registerCsiHandler({ intermediates: '!', final: 'p' }, params => this.softReset(params));\n    this._parser.registerCsiHandler({ intermediates: ' ', final: 'q' }, params => this.setCursorStyle(params));\n    this._parser.registerCsiHandler({ final: 'r' }, params => this.setScrollRegion(params));\n    this._parser.registerCsiHandler({ final: 's' }, params => this.saveCursor(params));\n    this._parser.registerCsiHandler({ final: 't' }, params => this.windowOptions(params));\n    this._parser.registerCsiHandler({ final: 'u' }, params => this.restoreCursor(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '}' }, params => this.insertColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\\'', final: '~' }, params => this.deleteColumns(params));\n    this._parser.registerCsiHandler({ intermediates: '\"', final: 'q' }, params => this.selectProtected(params));\n    this._parser.registerCsiHandler({ intermediates: '$', final: 'p' }, params => this.requestMode(params, true));\n    this._parser.registerCsiHandler({ prefix: '?', intermediates: '$', final: 'p' }, params => this.requestMode(params, false));\n\n    /**\n     * execute handler\n     */\n    this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n    this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n    this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n    this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n    this._parser.setExecuteHandler(C0.HT, () => this.tab());\n    this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n    this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n    // FIXME:   What do to with missing? Old code just added those to print.\n\n    this._parser.setExecuteHandler(C1.IND, () => this.index());\n    this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n    this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n    /**\n     * OSC handler\n     */\n    //   0 - icon name + title\n    this._parser.registerOscHandler(0, new OscHandler(data => { this.setTitle(data); this.setIconName(data); return true; }));\n    //   1 - icon name\n    this._parser.registerOscHandler(1, new OscHandler(data => this.setIconName(data)));\n    //   2 - title\n    this._parser.registerOscHandler(2, new OscHandler(data => this.setTitle(data)));\n    //   3 - set property X in the form \"prop=value\"\n    //   4 - Change Color Number\n    this._parser.registerOscHandler(4, new OscHandler(data => this.setOrReportIndexedColor(data)));\n    //   5 - Change Special Color Number\n    //   6 - Enable/disable Special Color Number c\n    //   7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n    //   8 - create hyperlink (not in xterm spec, see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda)\n    this._parser.registerOscHandler(8, new OscHandler(data => this.setHyperlink(data)));\n    //  10 - Change VT100 text foreground color to Pt.\n    this._parser.registerOscHandler(10, new OscHandler(data => this.setOrReportFgColor(data)));\n    //  11 - Change VT100 text background color to Pt.\n    this._parser.registerOscHandler(11, new OscHandler(data => this.setOrReportBgColor(data)));\n    //  12 - Change text cursor color to Pt.\n    this._parser.registerOscHandler(12, new OscHandler(data => this.setOrReportCursorColor(data)));\n    //  13 - Change mouse foreground color to Pt.\n    //  14 - Change mouse background color to Pt.\n    //  15 - Change Tektronix foreground color to Pt.\n    //  16 - Change Tektronix background color to Pt.\n    //  17 - Change highlight background color to Pt.\n    //  18 - Change Tektronix cursor color to Pt.\n    //  19 - Change highlight foreground color to Pt.\n    //  46 - Change Log File to Pt.\n    //  50 - Set Font to Pt.\n    //  51 - reserved for Emacs shell.\n    //  52 - Manipulate Selection Data.\n    // 104 ; c - Reset Color Number c.\n    this._parser.registerOscHandler(104, new OscHandler(data => this.restoreIndexedColor(data)));\n    // 105 ; c - Reset Special Color Number c.\n    // 106 ; c; f - Enable/disable Special Color Number c.\n    // 110 - Reset VT100 text foreground color.\n    this._parser.registerOscHandler(110, new OscHandler(data => this.restoreFgColor(data)));\n    // 111 - Reset VT100 text background color.\n    this._parser.registerOscHandler(111, new OscHandler(data => this.restoreBgColor(data)));\n    // 112 - Reset text cursor color.\n    this._parser.registerOscHandler(112, new OscHandler(data => this.restoreCursorColor(data)));\n    // 113 - Reset mouse foreground color.\n    // 114 - Reset mouse background color.\n    // 115 - Reset Tektronix foreground color.\n    // 116 - Reset Tektronix background color.\n    // 117 - Reset highlight color.\n    // 118 - Reset Tektronix cursor color.\n    // 119 - Reset highlight foreground color.\n\n    /**\n     * ESC handlers\n     */\n    this._parser.registerEscHandler({ final: '7' }, () => this.saveCursor());\n    this._parser.registerEscHandler({ final: '8' }, () => this.restoreCursor());\n    this._parser.registerEscHandler({ final: 'D' }, () => this.index());\n    this._parser.registerEscHandler({ final: 'E' }, () => this.nextLine());\n    this._parser.registerEscHandler({ final: 'H' }, () => this.tabSet());\n    this._parser.registerEscHandler({ final: 'M' }, () => this.reverseIndex());\n    this._parser.registerEscHandler({ final: '=' }, () => this.keypadApplicationMode());\n    this._parser.registerEscHandler({ final: '>' }, () => this.keypadNumericMode());\n    this._parser.registerEscHandler({ final: 'c' }, () => this.fullReset());\n    this._parser.registerEscHandler({ final: 'n' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: 'o' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '|' }, () => this.setgLevel(3));\n    this._parser.registerEscHandler({ final: '}' }, () => this.setgLevel(2));\n    this._parser.registerEscHandler({ final: '~' }, () => this.setgLevel(1));\n    this._parser.registerEscHandler({ intermediates: '%', final: '@' }, () => this.selectDefaultCharset());\n    this._parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => this.selectDefaultCharset());\n    for (const flag in CHARSETS) {\n      this._parser.registerEscHandler({ intermediates: '(', final: flag }, () => this.selectCharset('(' + flag));\n      this._parser.registerEscHandler({ intermediates: ')', final: flag }, () => this.selectCharset(')' + flag));\n      this._parser.registerEscHandler({ intermediates: '*', final: flag }, () => this.selectCharset('*' + flag));\n      this._parser.registerEscHandler({ intermediates: '+', final: flag }, () => this.selectCharset('+' + flag));\n      this._parser.registerEscHandler({ intermediates: '-', final: flag }, () => this.selectCharset('-' + flag));\n      this._parser.registerEscHandler({ intermediates: '.', final: flag }, () => this.selectCharset('.' + flag));\n      this._parser.registerEscHandler({ intermediates: '/', final: flag }, () => this.selectCharset('/' + flag)); // TODO: supported?\n    }\n    this._parser.registerEscHandler({ intermediates: '#', final: '8' }, () => this.screenAlignmentPattern());\n\n    /**\n     * error handler\n     */\n    this._parser.setErrorHandler((state: IParsingState) => {\n      this._logService.error('Parsing error: ', state);\n      return state;\n    });\n\n    /**\n     * DCS handler\n     */\n    this._parser.registerDcsHandler({ intermediates: '$', final: 'q' }, new DcsHandler((data, params) => this.requestStatusString(data, params)));\n  }\n\n  /**\n   * Async parse support.\n   */\n  private _preserveStack(cursorStartX: number, cursorStartY: number, decodedLength: number, position: number): void {\n    this._parseStack.paused = true;\n    this._parseStack.cursorStartX = cursorStartX;\n    this._parseStack.cursorStartY = cursorStartY;\n    this._parseStack.decodedLength = decodedLength;\n    this._parseStack.position = position;\n  }\n\n  private _logSlowResolvingAsync(p: Promise<boolean>): void {\n    // log a limited warning about an async handler taking too long\n    if (this._logService.logLevel <= LogLevelEnum.WARN) {\n      Promise.race([p, new Promise((res, rej) => setTimeout(() => rej('#SLOW_TIMEOUT'), SLOW_ASYNC_LIMIT))])\n        .catch(err => {\n          if (err !== '#SLOW_TIMEOUT') {\n            throw err;\n          }\n          console.warn(`async parser handler taking longer than ${SLOW_ASYNC_LIMIT} ms`);\n        });\n    }\n  }\n\n  private _getCurrentLinkId(): number {\n    return this._curAttrData.extended.urlId;\n  }\n\n  /**\n   * Parse call with async handler support.\n   *\n   * Whether the stack state got preserved for the next call, is indicated by the return value:\n   * - undefined (void):\n   *   all handlers were sync, no stack save, continue normally with next chunk\n   * - Promise\\<boolean\\>:\n   *   execution stopped at async handler, stack saved, continue with same chunk and the promise\n   *   resolve value as `promiseResult` until the method returns `undefined`\n   *\n   * Note: This method should only be called by `Terminal.write` to ensure correct execution order\n   * and proper continuation of async parser handlers.\n   */\n  public parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise<boolean> {\n    let result: void | Promise<boolean>;\n    let cursorStartX = this._activeBuffer.x;\n    let cursorStartY = this._activeBuffer.y;\n    let start = 0;\n    const wasPaused = this._parseStack.paused;\n\n    if (wasPaused) {\n      // assumption: _parseBuffer never mutates between async calls\n      if (result = this._parser.parse(this._parseBuffer, this._parseStack.decodedLength, promiseResult)) {\n        this._logSlowResolvingAsync(result);\n        return result;\n      }\n      cursorStartX = this._parseStack.cursorStartX;\n      cursorStartY = this._parseStack.cursorStartY;\n      this._parseStack.paused = false;\n      if (data.length > MAX_PARSEBUFFER_LENGTH) {\n        start = this._parseStack.position + MAX_PARSEBUFFER_LENGTH;\n      }\n    }\n\n    // Log debug data, the log level gate is to prevent extra work in this hot path\n    if (this._logService.logLevel <= LogLevelEnum.DEBUG) {\n      this._logService.debug(`parsing data${typeof data === 'string' ? ` \"${data}\"` : ` \"${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}\"`}`, typeof data === 'string'\n        ? data.split('').map(e => e.charCodeAt(0))\n        : data\n      );\n    }\n\n    // resize input buffer if needed\n    if (this._parseBuffer.length < data.length) {\n      if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n        this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n      }\n    }\n\n    // Clear the dirty row service so we know which lines changed as a result of parsing\n    // Important: do not clear between async calls, otherwise we lost pending update information.\n    if (!wasPaused) {\n      this._dirtyRowTracker.clearRange();\n    }\n\n    // process big data in smaller chunks\n    if (data.length > MAX_PARSEBUFFER_LENGTH) {\n      for (let i = start; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n        const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n          : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, i);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    } else {\n      if (!wasPaused) {\n        const len = (typeof data === 'string')\n          ? this._stringDecoder.decode(data, this._parseBuffer)\n          : this._utf8Decoder.decode(data, this._parseBuffer);\n        if (result = this._parser.parse(this._parseBuffer, len)) {\n          this._preserveStack(cursorStartX, cursorStartY, len, 0);\n          this._logSlowResolvingAsync(result);\n          return result;\n        }\n      }\n    }\n\n    if (this._activeBuffer.x !== cursorStartX || this._activeBuffer.y !== cursorStartY) {\n      this._onCursorMove.fire();\n    }\n\n    // Refresh any dirty rows accumulated as part of parsing\n    this._onRequestRefreshRows.fire(this._dirtyRowTracker.start, this._dirtyRowTracker.end);\n  }\n\n  public print(data: Uint32Array, start: number, end: number): void {\n    let code: number;\n    let chWidth: number;\n    const charset = this._charsetService.charset;\n    const screenReaderMode = this._optionsService.rawOptions.screenReaderMode;\n    const cols = this._bufferService.cols;\n    const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n    const insertMode = this._coreService.modes.insertMode;\n    const curAttr = this._curAttrData;\n    let bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n    if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) {\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n    }\n\n    for (let pos = start; pos < end; ++pos) {\n      code = data[pos];\n\n      // calculate print space\n      // expensive call, therefore we save width in line buffer\n      chWidth = this._unicodeService.wcwidth(code);\n\n      // get charset replacement character\n      // charset is only defined for ASCII, therefore we only\n      // search for an replacement char if code < 127\n      if (code < 127 && charset) {\n        const ch = charset[String.fromCharCode(code)];\n        if (ch) {\n          code = ch.charCodeAt(0);\n        }\n      }\n\n      if (screenReaderMode) {\n        this._onA11yChar.fire(stringFromCodePoint(code));\n      }\n      if (this._getCurrentLinkId()) {\n        this._oscLinkService.addLineToLink(this._getCurrentLinkId(), this._activeBuffer.ybase + this._activeBuffer.y);\n      }\n\n      // insert combining char at last cursor position\n      // this._activeBuffer.x should never be 0 for a combining char\n      // since they always follow a cell consuming char\n      // therefore we can test for this._activeBuffer.x to avoid overflow left\n      if (!chWidth && this._activeBuffer.x) {\n        if (!bufferRow.getWidth(this._activeBuffer.x - 1)) {\n          // found empty cell after fullwidth, need to go 2 cells back\n          // it is save to step 2 cells back here\n          // since an empty cell is only set by fullwidth chars\n          bufferRow.addCodepointToCell(this._activeBuffer.x - 2, code);\n        } else {\n          bufferRow.addCodepointToCell(this._activeBuffer.x - 1, code);\n        }\n        continue;\n      }\n\n      // goto next line if ch would overflow\n      // NOTE: To avoid costly width checks here,\n      // the terminal does not allow a cols < 2.\n      if (this._activeBuffer.x + chWidth - 1 >= cols) {\n        // autowrap - DECAWM\n        // automatically wraps to the beginning of the next line\n        if (wraparoundMode) {\n          // clear left over cells to the right\n          while (this._activeBuffer.x < cols) {\n            bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n          }\n          this._activeBuffer.x = 0;\n          this._activeBuffer.y++;\n          if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n            this._activeBuffer.y--;\n            this._bufferService.scroll(this._eraseAttrData(), true);\n          } else {\n            if (this._activeBuffer.y >= this._bufferService.rows) {\n              this._activeBuffer.y = this._bufferService.rows - 1;\n            }\n            // The line already exists (eg. the initial viewport), mark it as a\n            // wrapped line\n            this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = true;\n          }\n          // row changed, get it again\n          bufferRow = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n        } else {\n          this._activeBuffer.x = cols - 1;\n          if (chWidth === 2) {\n            // FIXME: check for xterm behavior\n            // What to do here? We got a wide char that does not fit into last cell\n            continue;\n          }\n        }\n      }\n\n      // insert mode: move characters to right\n      if (insertMode) {\n        // right shift cells according to the width\n        bufferRow.insertCells(this._activeBuffer.x, chWidth, this._activeBuffer.getNullCell(curAttr), curAttr);\n        // test last cell - since the last cell has only room for\n        // a halfwidth char any fullwidth shifted there is lost\n        // and will be set to empty cell\n        if (bufferRow.getWidth(cols - 1) === 2) {\n          bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended);\n        }\n      }\n\n      // write current char to buffer and advance cursor\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended);\n\n      // fullwidth char - also set next cell to placeholder stub and advance cursor\n      // for graphemes bigger than fullwidth we can simply loop to zero\n      // we already made sure above, that this._activeBuffer.x + chWidth will not overflow right\n      if (chWidth > 0) {\n        while (--chWidth) {\n          // other than a regular empty cell a cell following a wide char has no width\n          bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended);\n        }\n      }\n    }\n    // store last char in Parser.precedingCodepoint for REP to work correctly\n    // This needs to check whether:\n    //  - fullwidth + surrogates: reset\n    //  - combining: only base char gets carried on (bug in xterm?)\n    if (end - start > 0) {\n      bufferRow.loadCell(this._activeBuffer.x - 1, this._workCell);\n      if (this._workCell.getWidth() === 2 || this._workCell.getCode() > 0xFFFF) {\n        this._parser.precedingCodepoint = 0;\n      } else if (this._workCell.isCombined()) {\n        this._parser.precedingCodepoint = this._workCell.getChars().charCodeAt(0);\n      } else {\n        this._parser.precedingCodepoint = this._workCell.content;\n      }\n    }\n\n    // handle wide chars: reset cell to the right if it is second cell of a wide char\n    if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) {\n      bufferRow.setCellFromCodePoint(this._activeBuffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n    }\n\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Forward registerCsiHandler from parser.\n   */\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable {\n    if (id.final === 't' && !id.prefix && !id.intermediates) {\n      // security: always check whether window option is allowed\n      return this._parser.registerCsiHandler(id, params => {\n        if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n          return true;\n        }\n        return callback(params);\n      });\n    }\n    return this._parser.registerCsiHandler(id, callback);\n  }\n\n  /**\n   * Forward registerDcsHandler from parser.\n   */\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerDcsHandler(id, new DcsHandler(callback));\n  }\n\n  /**\n   * Forward registerEscHandler from parser.\n   */\n  public registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerEscHandler(id, callback);\n  }\n\n  /**\n   * Forward registerOscHandler from parser.\n   */\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._parser.registerOscHandler(ident, new OscHandler(callback));\n  }\n\n  /**\n   * BEL\n   * Bell (Ctrl-G).\n   *\n   * @vt: #Y   C0    BEL   \"Bell\"  \"\\a, \\x07\"  \"Ring the bell.\"\n   * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n   * and `ITerminalOptions.bellSound`.\n   */\n  public bell(): boolean {\n    this._onRequestBell.fire();\n    return true;\n  }\n\n  /**\n   * LF\n   * Line Feed or New Line (NL).  (LF  is Ctrl-J).\n   *\n   * @vt: #Y   C0    LF   \"Line Feed\"            \"\\n, \\x0A\"  \"Move the cursor one row down, scrolling if needed.\"\n   * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n   *\n   * @vt: #Y   C0    VT   \"Vertical Tabulation\"  \"\\v, \\x0B\"  \"Treated as LF.\"\n   * @vt: #Y   C0    FF   \"Form Feed\"            \"\\f, \\x0C\"  \"Treated as LF.\"\n   */\n  public lineFeed(): boolean {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._optionsService.rawOptions.convertEol) {\n      this._activeBuffer.x = 0;\n    }\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    } else {\n      // There was an explicit line feed (not just a carriage return), so clear the wrapped state of\n      // the line. This is particularly important on conpty/Windows where revisiting lines to\n      // reprint is common, especially on resize. Note that the windowsMode wrapped line heuristics\n      // can mess with this so windowsMode should be disabled, which is recommended on Windows build\n      // 21376 and above.\n      this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n    }\n    // If the end of the line is hit, prevent this action from wrapping around to the next line.\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      this._activeBuffer.x--;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n\n    this._onLineFeed.fire();\n    return true;\n  }\n\n  /**\n   * CR\n   * Carriage Return (Ctrl-M).\n   *\n   * @vt: #Y   C0    CR   \"Carriage Return\"  \"\\r, \\x0D\"  \"Move the cursor to the beginning of the row.\"\n   */\n  public carriageReturn(): boolean {\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * BS\n   * Backspace (Ctrl-H).\n   *\n   * @vt: #Y   C0    BS   \"Backspace\"  \"\\b, \\x08\"  \"Move the cursor one position to the left.\"\n   * By default it is not possible to move the cursor past the leftmost position.\n   * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n   * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n   * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n   * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n   */\n  public backspace(): boolean {\n    // reverse wrap-around is disabled\n    if (!this._coreService.decPrivateModes.reverseWraparound) {\n      this._restrictCursor();\n      if (this._activeBuffer.x > 0) {\n        this._activeBuffer.x--;\n      }\n      return true;\n    }\n\n    // reverse wrap-around is enabled\n    // other than for normal operation mode, reverse wrap-around allows the cursor\n    // to be at x=cols to be able to address the last cell of a row by BS\n    this._restrictCursor(this._bufferService.cols);\n\n    if (this._activeBuffer.x > 0) {\n      this._activeBuffer.x--;\n    } else {\n      /**\n       * reverse wrap-around handling:\n       * Our implementation deviates from xterm on purpose. Details:\n       * - only previous soft NLs can be reversed (isWrapped=true)\n       * - only works within scrollborders (top/bottom, left/right not yet supported)\n       * - cannot peek into scrollbuffer\n       * - any cursor movement sequence keeps working as expected\n       */\n      if (this._activeBuffer.x === 0\n        && this._activeBuffer.y > this._activeBuffer.scrollTop\n        && this._activeBuffer.y <= this._activeBuffer.scrollBottom\n        && this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)?.isWrapped) {\n        this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!.isWrapped = false;\n        this._activeBuffer.y--;\n        this._activeBuffer.x = this._bufferService.cols - 1;\n        // find last taken cell - last cell can have 3 different states:\n        // - hasContent(true) + hasWidth(1): narrow char - we are done\n        // - hasWidth(0): second part of wide char - we are done\n        // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one\n        //   cell further back\n        const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y)!;\n        if (line.hasWidth(this._activeBuffer.x) && !line.hasContent(this._activeBuffer.x)) {\n          this._activeBuffer.x--;\n          // We do this only once, since width=1 + hasContent=false currently happens only once\n          // before early wrapping of a wide char.\n          // This needs to be fixed once we support graphemes taking more than 2 cells.\n        }\n      }\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * TAB\n   * Horizontal Tab (HT) (Ctrl-I).\n   *\n   * @vt: #Y   C0    HT   \"Horizontal Tabulation\"  \"\\t, \\x09\"  \"Move the cursor to the next character tab stop.\"\n   */\n  public tab(): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    const originalX = this._activeBuffer.x;\n    this._activeBuffer.x = this._activeBuffer.nextStop();\n    if (this._optionsService.rawOptions.screenReaderMode) {\n      this._onA11yTab.fire(this._activeBuffer.x - originalX);\n    }\n    return true;\n  }\n\n  /**\n   * SO\n   * Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This invokes the\n   * G1 character set.\n   *\n   * @vt: #P[Only limited ISO-2022 charset support.]  C0    SO   \"Shift Out\"  \"\\x0E\"  \"Switch to an alternative character set.\"\n   */\n  public shiftOut(): boolean {\n    this._charsetService.setgLevel(1);\n    return true;\n  }\n\n  /**\n   * SI\n   * Shift In (Ctrl-O) -> Switch to Standard Character Set.  This invokes the G0\n   * character set (the default).\n   *\n   * @vt: #Y   C0    SI   \"Shift In\"   \"\\x0F\"  \"Return to regular character set after Shift Out.\"\n   */\n  public shiftIn(): boolean {\n    this._charsetService.setgLevel(0);\n    return true;\n  }\n\n  /**\n   * Restrict cursor to viewport size / scroll margin (origin mode).\n   */\n  private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n    this._activeBuffer.x = Math.min(maxCol, Math.max(0, this._activeBuffer.x));\n    this._activeBuffer.y = this._coreService.decPrivateModes.origin\n      ? Math.min(this._activeBuffer.scrollBottom, Math.max(this._activeBuffer.scrollTop, this._activeBuffer.y))\n      : Math.min(this._bufferService.rows - 1, Math.max(0, this._activeBuffer.y));\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set absolute cursor position.\n   */\n  private _setCursor(x: number, y: number): void {\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    if (this._coreService.decPrivateModes.origin) {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = this._activeBuffer.scrollTop + y;\n    } else {\n      this._activeBuffer.x = x;\n      this._activeBuffer.y = y;\n    }\n    this._restrictCursor();\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n  }\n\n  /**\n   * Set relative cursor position.\n   */\n  private _moveCursor(x: number, y: number): void {\n    // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n    // before calculating the new position\n    this._restrictCursor();\n    this._setCursor(this._activeBuffer.x + x, this._activeBuffer.y + y);\n  }\n\n  /**\n   * CSI Ps A\n   * Cursor Up Ps Times (default = 1) (CUU).\n   *\n   * @vt: #Y CSI CUU   \"Cursor Up\"   \"CSI Ps A\"  \"Move cursor `Ps` times up (default=1).\"\n   * If the cursor would pass the top scroll margin, it will stop there.\n   */\n  public cursorUp(params: IParams): boolean {\n    // stop at scrollTop\n    const diffToTop = this._activeBuffer.y - this._activeBuffer.scrollTop;\n    if (diffToTop >= 0) {\n      this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, -(params.params[0] || 1));\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps B\n   * Cursor Down Ps Times (default = 1) (CUD).\n   *\n   * @vt: #Y CSI CUD   \"Cursor Down\"   \"CSI Ps B\"  \"Move cursor `Ps` times down (default=1).\"\n   * If the cursor would pass the bottom scroll margin, it will stop there.\n   */\n  public cursorDown(params: IParams): boolean {\n    // stop at scrollBottom\n    const diffToBottom = this._activeBuffer.scrollBottom - this._activeBuffer.y;\n    if (diffToBottom >= 0) {\n      this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n    } else {\n      this._moveCursor(0, params.params[0] || 1);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps C\n   * Cursor Forward Ps Times (default = 1) (CUF).\n   *\n   * @vt: #Y CSI CUF   \"Cursor Forward\"    \"CSI Ps C\"  \"Move cursor `Ps` times forward (default=1).\"\n   */\n  public cursorForward(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps D\n   * Cursor Backward Ps Times (default = 1) (CUB).\n   *\n   * @vt: #Y CSI CUB   \"Cursor Backward\"   \"CSI Ps D\"  \"Move cursor `Ps` times backward (default=1).\"\n   */\n  public cursorBackward(params: IParams): boolean {\n    this._moveCursor(-(params.params[0] || 1), 0);\n    return true;\n  }\n\n  /**\n   * CSI Ps E\n   * Cursor Next Line Ps Times (default = 1) (CNL).\n   * Other than cursorDown (CUD) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CNL   \"Cursor Next Line\"  \"CSI Ps E\"  \"Move cursor `Ps` times down (default=1) and to the first column.\"\n   * Same as CUD, additionally places the cursor at the first column.\n   */\n  public cursorNextLine(params: IParams): boolean {\n    this.cursorDown(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps F\n   * Cursor Previous Line Ps Times (default = 1) (CPL).\n   * Other than cursorUp (CUU) also set the cursor to first column.\n   *\n   * @vt: #Y CSI CPL   \"Cursor Backward\"   \"CSI Ps F\"  \"Move cursor `Ps` times up (default=1) and to the first column.\"\n   * Same as CUU, additionally places the cursor at the first column.\n   */\n  public cursorPrecedingLine(params: IParams): boolean {\n    this.cursorUp(params);\n    this._activeBuffer.x = 0;\n    return true;\n  }\n\n  /**\n   * CSI Ps G\n   * Cursor Character Absolute  [column] (default = [row,1]) (CHA).\n   *\n   * @vt: #Y CSI CHA   \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n   */\n  public cursorCharAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps H\n   * Cursor Position [row;column] (default = [1,1]) (CUP).\n   *\n   * @vt: #Y CSI CUP   \"Cursor Position\"   \"CSI Ps ; Ps H\"  \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n   * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n   * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n   * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n   */\n  public cursorPosition(params: IParams): boolean {\n    this._setCursor(\n      // col\n      (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n      // row\n      (params.params[0] || 1) - 1\n    );\n    return true;\n  }\n\n  /**\n   * CSI Pm `  Character Position Absolute\n   *   [column] (default = [row,1]) (HPA).\n   * Currently same functionality as CHA.\n   *\n   * @vt: #Y CSI HPA   \"Horizontal Position Absolute\"  \"CSI Ps ` \" \"Same as CHA.\"\n   */\n  public charPosAbsolute(params: IParams): boolean {\n    this._setCursor((params.params[0] || 1) - 1, this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Pm a  Character Position Relative\n   *   [columns] (default = [row,col+1]) (HPR)\n   *\n   * @vt: #Y CSI HPR   \"Horizontal Position Relative\"  \"CSI Ps a\"  \"Same as CUF.\"\n   */\n  public hPositionRelative(params: IParams): boolean {\n    this._moveCursor(params.params[0] || 1, 0);\n    return true;\n  }\n\n  /**\n   * CSI Pm d  Vertical Position Absolute (VPA)\n   *   [row] (default = [1,column])\n   *\n   * @vt: #Y CSI VPA   \"Vertical Position Absolute\"    \"CSI Ps d\"  \"Move cursor to `Ps`-th row (default=1).\"\n   */\n  public linePosAbsolute(params: IParams): boolean {\n    this._setCursor(this._activeBuffer.x, (params.params[0] || 1) - 1);\n    return true;\n  }\n\n  /**\n   * CSI Pm e  Vertical Position Relative (VPR)\n   *   [rows] (default = [row+1,column])\n   * reuse CSI Ps B ?\n   *\n   * @vt: #Y CSI VPR   \"Vertical Position Relative\"    \"CSI Ps e\"  \"Move cursor `Ps` times down (default=1).\"\n   */\n  public vPositionRelative(params: IParams): boolean {\n    this._moveCursor(0, params.params[0] || 1);\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps f\n   *   Horizontal and Vertical Position [row;column] (default =\n   *   [1,1]) (HVP).\n   *   Same as CUP.\n   *\n   * @vt: #Y CSI HVP   \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\"  \"Same as CUP.\"\n   */\n  public hVPosition(params: IParams): boolean {\n    this.cursorPosition(params);\n    return true;\n  }\n\n  /**\n   * CSI Ps g  Tab Clear (TBC).\n   *     Ps = 0  -> Clear Current Column (default).\n   *     Ps = 3  -> Clear All.\n   * Potentially:\n   *   Ps = 2  -> Clear Stops on Line.\n   *   http://vt100.net/annarbor/aaa-ug/section6.html\n   *\n   * @vt: #Y CSI TBC   \"Tab Clear\" \"CSI Ps g\"  \"Clear tab stops at current position (0) or all (3) (default=0).\"\n   * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n   */\n  public tabClear(params: IParams): boolean {\n    const param = params.params[0];\n    if (param === 0) {\n      delete this._activeBuffer.tabs[this._activeBuffer.x];\n    } else if (param === 3) {\n      this._activeBuffer.tabs = {};\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps I\n   *   Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n   *\n   * @vt: #Y CSI CHT   \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n   */\n  public cursorForwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.nextStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps Z  Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n   *\n   * @vt: #Y CSI CBT   \"Cursor Backward Tabulation\"  \"CSI Ps Z\"  \"Move cursor `Ps` tabs backward (default=1).\"\n   */\n  public cursorBackwardTab(params: IParams): boolean {\n    if (this._activeBuffer.x >= this._bufferService.cols) {\n      return true;\n    }\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.x = this._activeBuffer.prevStop();\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps \" q  Select Character Protection Attribute (DECSCA).\n   *\n   * @vt: #Y CSI DECSCA   \"Select Character Protection Attribute\"  \"CSI Ps \" q\"  \"Whether DECSED and DECSEL can erase (0=default, 2) or not (1).\"\n   */\n  public selectProtected(params: IParams): boolean {\n    const p = params.params[0];\n    if (p === 1) this._curAttrData.bg |= BgFlags.PROTECTED;\n    if (p === 2 || p === 0) this._curAttrData.bg &= ~BgFlags.PROTECTED;\n    return true;\n  }\n\n\n  /**\n   * Helper method to erase cells in a terminal row.\n   * The cell gets replaced with the eraseChar of the terminal.\n   * @param y The row index relative to the viewport.\n   * @param start The start x index of the range to be erased.\n   * @param end The end x index of the range to be erased (exclusive).\n   * @param clearWrap clear the isWrapped flag\n   * @param respectProtect Whether to respect the protection attribute (DECSCA).\n   */\n  private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n    line.replaceCells(\n      start,\n      end,\n      this._activeBuffer.getNullCell(this._eraseAttrData()),\n      this._eraseAttrData(),\n      respectProtect\n    );\n    if (clearWrap) {\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * Helper method to reset cells in a terminal row. The cell gets replaced with the eraseChar of\n   * the terminal and the isWrapped property is set to false.\n   * @param y row index\n   */\n  private _resetBufferLine(y: number, respectProtect: boolean = false): void {\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y);\n    if (line) {\n      line.fill(this._activeBuffer.getNullCell(this._eraseAttrData()), respectProtect);\n      this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase + y);\n      line.isWrapped = false;\n    }\n  }\n\n  /**\n   * CSI Ps J  Erase in Display (ED).\n   *     Ps = 0  -> Erase Below (default).\n   *     Ps = 1  -> Erase Above.\n   *     Ps = 2  -> Erase All.\n   *     Ps = 3  -> Erase Saved Lines (xterm).\n   * CSI ? Ps J\n   *   Erase in Display (DECSED).\n   *     Ps = 0  -> Selective Erase Below (default).\n   *     Ps = 1  -> Selective Erase Above.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI ED  \"Erase In Display\"  \"CSI Ps J\"  \"Erase various parts of the viewport.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                       |\n   * | -- | ------------------------------------------------------------ |\n   * | 0  | Erase from the cursor through the end of the viewport.       |\n   * | 1  | Erase from the beginning of the viewport through the cursor. |\n   * | 2  | Erase complete viewport.                                     |\n   * | 3  | Erase scrollback.                                            |\n   *\n   * @vt: #Y CSI DECSED   \"Selective Erase In Display\"  \"CSI ? Ps J\"  \"Same as ED with respecting protection flag.\"\n   */\n  public eraseInDisplay(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    let j;\n    switch (params.params[0]) {\n      case 0:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        this._eraseInBufferLine(j++, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        for (; j < this._bufferService.rows; j++) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(j);\n        break;\n      case 1:\n        j = this._activeBuffer.y;\n        this._dirtyRowTracker.markDirty(j);\n        // Deleted front part of line and everything before. This line will no longer be wrapped.\n        this._eraseInBufferLine(j, 0, this._activeBuffer.x + 1, true, respectProtect);\n        if (this._activeBuffer.x + 1 >= this._bufferService.cols) {\n          // Deleted entire previous line. This next line can no longer be wrapped.\n          this._activeBuffer.lines.get(j + 1)!.isWrapped = false;\n        }\n        while (j--) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(0);\n        break;\n      case 2:\n        j = this._bufferService.rows;\n        this._dirtyRowTracker.markDirty(j - 1);\n        while (j--) {\n          this._resetBufferLine(j, respectProtect);\n        }\n        this._dirtyRowTracker.markDirty(0);\n        break;\n      case 3:\n        // Clear scrollback (everything not in viewport)\n        const scrollBackSize = this._activeBuffer.lines.length - this._bufferService.rows;\n        if (scrollBackSize > 0) {\n          this._activeBuffer.lines.trimStart(scrollBackSize);\n          this._activeBuffer.ybase = Math.max(this._activeBuffer.ybase - scrollBackSize, 0);\n          this._activeBuffer.ydisp = Math.max(this._activeBuffer.ydisp - scrollBackSize, 0);\n          // Force a scroll event to refresh viewport\n          this._onScroll.fire(0);\n        }\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps K  Erase in Line (EL).\n   *     Ps = 0  -> Erase to Right (default).\n   *     Ps = 1  -> Erase to Left.\n   *     Ps = 2  -> Erase All.\n   * CSI ? Ps K\n   *   Erase in Line (DECSEL).\n   *     Ps = 0  -> Selective Erase to Right (default).\n   *     Ps = 1  -> Selective Erase to Left.\n   *     Ps = 2  -> Selective Erase All.\n   *\n   * @vt: #Y CSI EL    \"Erase In Line\"  \"CSI Ps K\"  \"Erase various parts of the active row.\"\n   * Supported param values:\n   *\n   * | Ps | Effect                                                   |\n   * | -- | -------------------------------------------------------- |\n   * | 0  | Erase from the cursor through the end of the row.        |\n   * | 1  | Erase from the beginning of the line through the cursor. |\n   * | 2  | Erase complete line.                                     |\n   *\n   * @vt: #Y CSI DECSEL   \"Selective Erase In Line\"  \"CSI ? Ps K\"  \"Same as EL with respecting protecting flag.\"\n   */\n  public eraseInLine(params: IParams, respectProtect: boolean = false): boolean {\n    this._restrictCursor(this._bufferService.cols);\n    switch (params.params[0]) {\n      case 0:\n        this._eraseInBufferLine(this._activeBuffer.y, this._activeBuffer.x, this._bufferService.cols, this._activeBuffer.x === 0, respectProtect);\n        break;\n      case 1:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._activeBuffer.x + 1, false, respectProtect);\n        break;\n      case 2:\n        this._eraseInBufferLine(this._activeBuffer.y, 0, this._bufferService.cols, true, respectProtect);\n        break;\n    }\n    this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    return true;\n  }\n\n  /**\n   * CSI Ps L\n   * Insert Ps Line(s) (default = 1) (IL).\n   *\n   * @vt: #Y CSI IL  \"Insert Line\"   \"CSI Ps L\"  \"Insert `Ps` blank lines at active row (default=1).\"\n   * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n   * The cursor is set to the first column.\n   * IL has no effect if the cursor is outside the scroll margins.\n   */\n  public insertLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    const scrollBottomRowsOffset = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    const scrollBottomAbsolute = this._bufferService.rows - 1 + this._activeBuffer.ybase - scrollBottomRowsOffset + 1;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1L\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(scrollBottomAbsolute - 1, 1);\n      this._activeBuffer.lines.splice(row, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps M\n   * Delete Ps Line(s) (default = 1) (DL).\n   *\n   * @vt: #Y CSI DL  \"Delete Line\"   \"CSI Ps M\"  \"Delete `Ps` lines at active row (default=1).\"\n   * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n   * The cursor is set to the first column.\n   * DL has no effect if the cursor is outside the scroll margins.\n   */\n  public deleteLines(params: IParams): boolean {\n    this._restrictCursor();\n    let param = params.params[0] || 1;\n\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n\n    const row: number = this._activeBuffer.ybase + this._activeBuffer.y;\n\n    let j: number;\n    j = this._bufferService.rows - 1 - this._activeBuffer.scrollBottom;\n    j = this._bufferService.rows - 1 + this._activeBuffer.ybase - j;\n    while (param--) {\n      // test: echo -e '\\e[44m\\e[1M\\e[0m'\n      // blankLine(true) - xterm/linux behavior\n      this._activeBuffer.lines.splice(row, 1);\n      this._activeBuffer.lines.splice(j, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y, this._activeBuffer.scrollBottom);\n    this._activeBuffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n    return true;\n  }\n\n  /**\n   * CSI Ps @\n   * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n   *\n   * @vt: #Y CSI ICH  \"Insert Characters\"   \"CSI Ps @\"  \"Insert `Ps` (blank) characters (default = 1).\"\n   * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the\n   * blank characters. Text between the cursor and right margin moves to the right. Characters moved\n   * past the right margin are lost.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public insertChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.insertCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps P\n   * Delete Ps Character(s) (default = 1) (DCH).\n   *\n   * @vt: #Y CSI DCH   \"Delete Character\"  \"CSI Ps P\"  \"Delete `Ps` characters (default=1).\"\n   * As characters are deleted, the remaining characters between the cursor and right margin move to\n   * the left. Character attributes move with the characters. The terminal adds blank characters at\n   * the right margin.\n   *\n   *\n   * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n   */\n  public deleteChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.deleteCells(\n        this._activeBuffer.x,\n        params.params[0] || 1,\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps S  Scroll up Ps lines (default = 1) (SU).\n   *\n   * @vt: #Y CSI SU  \"Scroll Up\"   \"CSI Ps S\"  \"Scroll `Ps` lines up (default=1).\"\n   *\n   *\n   * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n   */\n  public scrollUp(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 0, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps T  Scroll down Ps lines (default = 1) (SD).\n   *\n   * @vt: #Y CSI SD  \"Scroll Down\"   \"CSI Ps T\"  \"Scroll `Ps` lines down (default=1).\"\n   */\n  public scrollDown(params: IParams): boolean {\n    let param = params.params[0] || 1;\n\n    while (param--) {\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollBottom, 1);\n      this._activeBuffer.lines.splice(this._activeBuffer.ybase + this._activeBuffer.scrollTop, 0, this._activeBuffer.getBlankLine(DEFAULT_ATTR_DATA));\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP @  Scroll left Ps columns (default = 1) (SL) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/00\n   * Parameter default value: Pn = 1\n   * SL causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always left shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SL  \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollLeft(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps SP A  Scroll right Ps columns (default = 1) (SR) ECMA-48\n   *\n   * Notation: (Pn)\n   * Representation: CSI Pn 02/00 04/01\n   * Parameter default value: Pn = 1\n   * SR causes the data in the presentation component to be moved by n character positions\n   * if the line orientation is horizontal, or by n line positions if the line orientation\n   * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n   * The active presentation position is not affected by this control function.\n   *\n   * Supported:\n   *   - always right shift (no line orientation setting respected)\n   *\n   * @vt: #Y CSI SR  \"Scroll Right\"  \"CSI Ps SP A\"   \"Scroll viewport `Ps` times to the right.\"\n   * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n   * Content at the right margin is lost.\n   * SL has no effect outside of the scroll margins.\n   */\n  public scrollRight(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' }\n   * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n   *\n   * @vt: #Y CSI DECIC \"Insert Columns\"  \"CSI Ps ' }\"  \"Insert `Ps` columns at cursor position.\"\n   * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll\n   * margins, moving content to the right. Content at the right margin is lost. DECIC has no effect\n   * outside the scrolling margins.\n   */\n  public insertColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Pm ' ~\n   * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n   *\n   * @vt: #Y CSI DECDC \"Delete Columns\"  \"CSI Ps ' ~\"  \"Delete `Ps` columns at cursor position.\"\n   * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n   * moving content to the left. Blank columns are added at the right margin.\n   * DECDC has no effect outside the scrolling margins.\n   */\n  public deleteColumns(params: IParams): boolean {\n    if (this._activeBuffer.y > this._activeBuffer.scrollBottom || this._activeBuffer.y < this._activeBuffer.scrollTop) {\n      return true;\n    }\n    const param = params.params[0] || 1;\n    for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) {\n      const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!;\n      line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n      line.isWrapped = false;\n    }\n    this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    return true;\n  }\n\n  /**\n   * CSI Ps X\n   * Erase Ps Character(s) (default = 1) (ECH).\n   *\n   * @vt: #Y CSI ECH   \"Erase Character\"   \"CSI Ps X\"  \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n   * ED erases `Ps` characters from current cursor position to the right.\n   * ED works inside or outside the scrolling margins.\n   */\n  public eraseChars(params: IParams): boolean {\n    this._restrictCursor();\n    const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + this._activeBuffer.y);\n    if (line) {\n      line.replaceCells(\n        this._activeBuffer.x,\n        this._activeBuffer.x + (params.params[0] || 1),\n        this._activeBuffer.getNullCell(this._eraseAttrData()),\n        this._eraseAttrData()\n      );\n      this._dirtyRowTracker.markDirty(this._activeBuffer.y);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps b  Repeat the preceding graphic character Ps times (REP).\n   * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n   *    Notation: (Pn)\n   *    Representation: CSI Pn 06/02\n   *    Parameter default value: Pn = 1\n   *    REP is used to indicate that the preceding character in the data stream,\n   *    if it is a graphic character (represented by one or more bit combinations) including SPACE,\n   *    is to be repeated n times, where n equals the value of Pn.\n   *    If the character preceding REP is a control function or part of a control function,\n   *    the effect of REP is not defined by this Standard.\n   *\n   * Since we propagate the terminal as xterm-256color we have to follow xterm's behavior:\n   *    - fullwidth + surrogate chars are ignored\n   *    - for combining chars only the base char gets repeated\n   *    - text attrs are applied normally\n   *    - wrap around is respected\n   *    - any valid sequence resets the carried forward char\n   *\n   * Note: To get reset on a valid sequence working correctly without much runtime penalty, the\n   * preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n   *\n   * @vt: #Y CSI REP   \"Repeat Preceding Character\"    \"CSI Ps b\"  \"Repeat preceding character `Ps` times (default=1).\"\n   * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is\n   * set. REP has no effect if the sequence does not follow a printable ASCII character\n   * (NOOP for any other sequence in between or NON ASCII characters).\n   */\n  public repeatPrecedingCharacter(params: IParams): boolean {\n    if (!this._parser.precedingCodepoint) {\n      return true;\n    }\n    // call print to insert the chars and handle correct wrapping\n    const length = params.params[0] || 1;\n    const data = new Uint32Array(length);\n    for (let i = 0; i < length; ++i) {\n      data[i] = this._parser.precedingCodepoint;\n    }\n    this.print(data, 0, data.length);\n    return true;\n  }\n\n  /**\n   * CSI Ps c  Send Device Attributes (Primary DA).\n   *     Ps = 0  or omitted -> request attributes from terminal.  The\n   *     response depends on the decTerminalID resource setting.\n   *     -> CSI ? 1 ; 2 c  (``VT100 with Advanced Video Option'')\n   *     -> CSI ? 1 ; 0 c  (``VT101 with No Options'')\n   *     -> CSI ? 6 c  (``VT102'')\n   *     -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c  (``VT220'')\n   *   The VT100-style response parameters do not mean anything by\n   *   themselves.  VT220 parameters do, telling the host what fea-\n   *   tures the terminal supports:\n   *     Ps = 1  -> 132-columns.\n   *     Ps = 2  -> Printer.\n   *     Ps = 6  -> Selective erase.\n   *     Ps = 8  -> User-defined keys.\n   *     Ps = 9  -> National replacement character sets.\n   *     Ps = 1 5  -> Technical characters.\n   *     Ps = 2 2  -> ANSI color, e.g., VT525.\n   *     Ps = 2 9  -> ANSI text locator (i.e., DEC Locator mode).\n   *\n   * @vt: #Y CSI DA1   \"Primary Device Attributes\"     \"CSI c\"  \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesPrimary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n    } else if (this._is('linux')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n    }\n    return true;\n  }\n\n  /**\n   * CSI > Ps c\n   *   Send Device Attributes (Secondary DA).\n   *     Ps = 0  or omitted -> request the terminal's identification\n   *     code.  The response depends on the decTerminalID resource set-\n   *     ting.  It should apply only to VT220 and up, but xterm extends\n   *     this to VT100.\n   *     -> CSI  > Pp ; Pv ; Pc c\n   *   where Pp denotes the terminal type\n   *     Pp = 0  -> ``VT100''.\n   *     Pp = 1  -> ``VT220''.\n   *   and Pv is the firmware version (for xterm, this was originally\n   *   the XFree86 patch number, starting with 95).  In a DEC termi-\n   *   nal, Pc indicates the ROM cartridge registration number and is\n   *   always zero.\n   * More information:\n   *   xterm/charproc.c - line 2012, for more information.\n   *   vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n   *\n   * @vt: #Y CSI DA2   \"Secondary Device Attributes\"   \"CSI > c\" \"Send primary device attributes.\"\n   *\n   *\n   * TODO: fix and cleanup response\n   */\n  public sendDeviceAttributesSecondary(params: IParams): boolean {\n    if (params.params[0] > 0) {\n      return true;\n    }\n    // xterm and urxvt\n    // seem to spit this\n    // out around ~370 times (?).\n    if (this._is('xterm')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n    } else if (this._is('rxvt-unicode')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n    } else if (this._is('linux')) {\n      // not supported by linux console.\n      // linux console echoes parameters.\n      this._coreService.triggerDataEvent(params.params[0] + 'c');\n    } else if (this._is('screen')) {\n      this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n    }\n    return true;\n  }\n\n  /**\n   * Evaluate if the current terminal is the given argument.\n   * @param term The terminal name to evaluate\n   */\n  private _is(term: string): boolean {\n    return (this._optionsService.rawOptions.termName + '').indexOf(term) === 0;\n  }\n\n  /**\n   * CSI Pm h  Set Mode (SM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Insert Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Automatic Newline (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI SM    \"Set Mode\"  \"CSI Pm h\"  \"Set various terminal modes.\"\n   * Supported param values by SM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Insert Mode (IRM).                     | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Automatic Newline (LNM).               | #Y      |\n   */\n  public setMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = true;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = true;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm h\n   *   DEC Private Mode Set (DECSET).\n   *     Ps = 1  -> Application Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate USASCII for character sets G0-G3\n   *     (DECANM), and set VT100 mode.\n   *     Ps = 3  -> 132 Column Mode (DECCOLM).\n   *     Ps = 4  -> Smooth (Slow) Scroll (DECSCLM).\n   *     Ps = 5  -> Reverse Video (DECSCNM).\n   *     Ps = 6  -> Origin Mode (DECOM).\n   *     Ps = 7  -> Wraparound Mode (DECAWM).\n   *     Ps = 8  -> Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Send Mouse X & Y on button press.  See the sec-\n   *     tion Mouse Tracking.\n   *     Ps = 1 0  -> Show toolbar (rxvt).\n   *     Ps = 1 2  -> Start Blinking Cursor (att610).\n   *     Ps = 1 8  -> Print form feed (DECPFF).\n   *     Ps = 1 9  -> Set print extent to full screen (DECPEX).\n   *     Ps = 2 5  -> Show Cursor (DECTCEM).\n   *     Ps = 3 0  -> Show scrollbar (rxvt).\n   *     Ps = 3 5  -> Enable font-shifting functions (rxvt).\n   *     Ps = 3 8  -> Enter Tektronix Mode (DECTEK).\n   *     Ps = 4 0  -> Allow 80 -> 132 Mode.\n   *     Ps = 4 1  -> more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Enable Nation Replacement Character sets (DECN-\n   *     RCM).\n   *     Ps = 4 4  -> Turn On Margin Bell.\n   *     Ps = 4 5  -> Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Start Logging.  This is normally disabled by a\n   *     compile-time option.\n   *     Ps = 4 7  -> Use Alternate Screen Buffer.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 6 6  -> Application keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends backspace (DECBKM).\n   *     Ps = 1 0 0 0  -> Send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Enable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Scroll to bottom on tty output (rxvt).\n   *     Ps = 1 0 1 1  -> Scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Interpret \"meta\" key, sets eighth bit.\n   *     (enables the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Enable special modifiers for Alt and Num-\n   *     Lock keys.  (This enables the numLock resource).\n   *     Ps = 1 0 3 6  -> Send ESC   when Meta modifies a key.  (This\n   *     enables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send DEL from the editing-keypad Delete\n   *     key.\n   *     Ps = 1 0 3 9  -> Send ESC  when Alt modifies a key.  (This\n   *     enables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Keep selection even if not highlighted.\n   *     (This enables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the CLIPBOARD selection.  (This enables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Enable Urgency window manager hint when\n   *     Control-G is received.  (This enables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Enable raising of the window when Control-G\n   *     is received.  (enables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Alternate Screen Buffer.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Save cursor as in DECSC.  (This may be dis-\n   *     abled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Save cursor as in DECSC and use Alternate\n   *     Screen Buffer, clearing it first.  (This may be disabled by\n   *     the titeInhibit resource).  This combines the effects of the 1\n   *     0 4 7  and 1 0 4 8  modes.  Use this with terminfo-based\n   *     applications rather than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Set terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Set Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Set HP function-key mode.\n   *     Ps = 1 0 5 3  -> Set SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Set legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Set VT220 keyboard emulation.\n   *     Ps = 2 0 0 4  -> Set bracketed paste mode.\n   * Modes:\n   *   http: *vt100.net/docs/vt220-rm/chapter4.html\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECSET  \"DEC Private Set Mode\" \"CSI ? Pm h\"  \"Set various terminal attributes.\"\n   * Supported param values by DECSET:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | --------|\n   * | 1     | Application Cursor Keys (DECCKM).                       | #Y      |\n   * | 2     | Designate US-ASCII for character sets G0-G3 (DECANM).   | #Y      |\n   * | 3     | 132 Column Mode (DECCOLM).                              | #Y      |\n   * | 6     | Origin Mode (DECOM).                                    | #Y      |\n   * | 7     | Auto-wrap Mode (DECAWM).                                | #Y      |\n   * | 8     | Auto-repeat Keys (DECARM). Always on.                   | #N      |\n   * | 9     | X10 xterm mouse protocol.                               | #Y      |\n   * | 12    | Start Blinking Cursor.                                  | #Y      |\n   * | 25    | Show Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | Reverse wrap-around.                                    | #Y      |\n   * | 47    | Use Alternate Screen Buffer.                            | #Y      |\n   * | 66    | Application keypad (DECNKM).                            | #Y      |\n   * | 1000  | X11 xterm mouse protocol.                               | #Y      |\n   * | 1002  | Use Cell Motion Mouse Tracking.                         | #Y      |\n   * | 1003  | Use All Motion Mouse Tracking.                          | #Y      |\n   * | 1004  | Send FocusIn/FocusOut events                            | #Y      |\n   * | 1005  | Enable UTF-8 Mouse Mode.                                | #N      |\n   * | 1006  | Enable SGR Mouse Mode.                                  | #Y      |\n   * | 1015  | Enable urxvt Mouse Mode.                                | #N      |\n   * | 1016  | Enable SGR-Pixels Mouse Mode.                           | #Y      |\n   * | 1047  | Use Alternate Screen Buffer.                            | #Y      |\n   * | 1048  | Save cursor as in DECSC.                                | #Y      |\n   * | 1049  | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n   * | 2004  | Set bracketed paste mode.                               | #Y      |\n   *\n   *\n   * FIXME: implement DECSCNM, 1049 should clear altbuffer\n   */\n  public setModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = true;\n          break;\n        case 2:\n          this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n          this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n          // set VT100 mode here\n          break;\n        case 3:\n          /**\n           * DECCOLM - 132 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(132, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = true;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = true;\n          break;\n        case 12:\n          this._optionsService.options.cursorBlink = true;\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = true;\n          break;\n        case 66:\n          this._logService.debug('Serial port requested application keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = true;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n          // no release, no motion, no wheel, no modifiers.\n          this._coreMouseService.activeProtocol = 'X10';\n          break;\n        case 1000: // vt200 mouse\n          // no motion.\n          this._coreMouseService.activeProtocol = 'VT200';\n          break;\n        case 1002: // button event mouse\n          this._coreMouseService.activeProtocol = 'DRAG';\n          break;\n        case 1003: // any event mouse\n          // any event - sends motion events,\n          // even if there is no button held down.\n          this._coreMouseService.activeProtocol = 'ANY';\n          break;\n        case 1004: // send focusin/focusout events\n          // focusin: ^[[I\n          // focusout: ^[[O\n          this._coreService.decPrivateModes.sendFocus = true;\n          this._onRequestSendFocus.fire();\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._coreMouseService.activeEncoding = 'SGR';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECSET 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._coreMouseService.activeEncoding = 'SGR_PIXELS';\n          break;\n        case 25: // show cursor\n          this._coreService.isCursorHidden = false;\n          break;\n        case 1048: // alt screen cursor\n          this.saveCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n          this.saveCursor();\n        // FALL-THROUGH\n        case 47: // alt screen buffer\n        case 1047: // alt screen buffer\n          this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = true;\n          break;\n      }\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI Pm l  Reset Mode (RM).\n   *     Ps = 2  -> Keyboard Action Mode (AM).\n   *     Ps = 4  -> Replace Mode (IRM).\n   *     Ps = 1 2  -> Send/receive (SRM).\n   *     Ps = 2 0  -> Normal Linefeed (LNM).\n   *\n   * @vt: #P[Only IRM is supported.]    CSI RM    \"Reset Mode\"  \"CSI Pm l\"  \"Set various terminal attributes.\"\n   * Supported param values by RM:\n   *\n   * | Param | Action                                 | Support |\n   * | ----- | -------------------------------------- | ------- |\n   * | 2     | Keyboard Action Mode (KAM). Always on. | #N      |\n   * | 4     | Replace Mode (IRM). (default)          | #Y      |\n   * | 12    | Send/receive (SRM). Always off.        | #N      |\n   * | 20    | Normal Linefeed (LNM).                 | #Y      |\n   *\n   *\n   * FIXME: why is LNM commented out?\n   */\n  public resetMode(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 4:\n          this._coreService.modes.insertMode = false;\n          break;\n        case 20:\n          this._optionsService.options.convertEol = false;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI ? Pm l\n   *   DEC Private Mode Reset (DECRST).\n   *     Ps = 1  -> Normal Cursor Keys (DECCKM).\n   *     Ps = 2  -> Designate VT52 mode (DECANM).\n   *     Ps = 3  -> 80 Column Mode (DECCOLM).\n   *     Ps = 4  -> Jump (Fast) Scroll (DECSCLM).\n   *     Ps = 5  -> Normal Video (DECSCNM).\n   *     Ps = 6  -> Normal Cursor Mode (DECOM).\n   *     Ps = 7  -> No Wraparound Mode (DECAWM).\n   *     Ps = 8  -> No Auto-repeat Keys (DECARM).\n   *     Ps = 9  -> Don't send Mouse X & Y on button press.\n   *     Ps = 1 0  -> Hide toolbar (rxvt).\n   *     Ps = 1 2  -> Stop Blinking Cursor (att610).\n   *     Ps = 1 8  -> Don't print form feed (DECPFF).\n   *     Ps = 1 9  -> Limit print to scrolling region (DECPEX).\n   *     Ps = 2 5  -> Hide Cursor (DECTCEM).\n   *     Ps = 3 0  -> Don't show scrollbar (rxvt).\n   *     Ps = 3 5  -> Disable font-shifting functions (rxvt).\n   *     Ps = 4 0  -> Disallow 80 -> 132 Mode.\n   *     Ps = 4 1  -> No more(1) fix (see curses resource).\n   *     Ps = 4 2  -> Disable Nation Replacement Character sets (DEC-\n   *     NRCM).\n   *     Ps = 4 4  -> Turn Off Margin Bell.\n   *     Ps = 4 5  -> No Reverse-wraparound Mode.\n   *     Ps = 4 6  -> Stop Logging.  (This is normally disabled by a\n   *     compile-time option).\n   *     Ps = 4 7  -> Use Normal Screen Buffer.\n   *     Ps = 6 6  -> Numeric keypad (DECNKM).\n   *     Ps = 6 7  -> Backarrow key sends delete (DECBKM).\n   *     Ps = 1 0 0 0  -> Don't send Mouse X & Y on button press and\n   *     release.  See the section Mouse Tracking.\n   *     Ps = 1 0 0 1  -> Don't use Hilite Mouse Tracking.\n   *     Ps = 1 0 0 2  -> Don't use Cell Motion Mouse Tracking.\n   *     Ps = 1 0 0 3  -> Don't use All Motion Mouse Tracking.\n   *     Ps = 1 0 0 4  -> Don't send FocusIn/FocusOut events.\n   *     Ps = 1 0 0 5  -> Disable Extended Mouse Mode.\n   *     Ps = 1 0 1 0  -> Don't scroll to bottom on tty output\n   *     (rxvt).\n   *     Ps = 1 0 1 1  -> Don't scroll to bottom on key press (rxvt).\n   *     Ps = 1 0 3 4  -> Don't interpret \"meta\" key.  (This disables\n   *     the eightBitInput resource).\n   *     Ps = 1 0 3 5  -> Disable special modifiers for Alt and Num-\n   *     Lock keys.  (This disables the numLock resource).\n   *     Ps = 1 0 3 6  -> Don't send ESC  when Meta modifies a key.\n   *     (This disables the metaSendsEscape resource).\n   *     Ps = 1 0 3 7  -> Send VT220 Remove from the editing-keypad\n   *     Delete key.\n   *     Ps = 1 0 3 9  -> Don't send ESC  when Alt modifies a key.\n   *     (This disables the altSendsEscape resource).\n   *     Ps = 1 0 4 0  -> Do not keep selection when not highlighted.\n   *     (This disables the keepSelection resource).\n   *     Ps = 1 0 4 1  -> Use the PRIMARY selection.  (This disables\n   *     the selectToClipboard resource).\n   *     Ps = 1 0 4 2  -> Disable Urgency window manager hint when\n   *     Control-G is received.  (This disables the bellIsUrgent\n   *     resource).\n   *     Ps = 1 0 4 3  -> Disable raising of the window when Control-\n   *     G is received.  (This disables the popOnBell resource).\n   *     Ps = 1 0 4 7  -> Use Normal Screen Buffer, clearing screen\n   *     first if in the Alternate Screen.  (This may be disabled by\n   *     the titeInhibit resource).\n   *     Ps = 1 0 4 8  -> Restore cursor as in DECRC.  (This may be\n   *     disabled by the titeInhibit resource).\n   *     Ps = 1 0 4 9  -> Use Normal Screen Buffer and restore cursor\n   *     as in DECRC.  (This may be disabled by the titeInhibit\n   *     resource).  This combines the effects of the 1 0 4 7  and 1 0\n   *     4 8  modes.  Use this with terminfo-based applications rather\n   *     than the 4 7  mode.\n   *     Ps = 1 0 5 0  -> Reset terminfo/termcap function-key mode.\n   *     Ps = 1 0 5 1  -> Reset Sun function-key mode.\n   *     Ps = 1 0 5 2  -> Reset HP function-key mode.\n   *     Ps = 1 0 5 3  -> Reset SCO function-key mode.\n   *     Ps = 1 0 6 0  -> Reset legacy keyboard emulation (X11R6).\n   *     Ps = 1 0 6 1  -> Reset keyboard emulation to Sun/PC style.\n   *     Ps = 2 0 0 4  -> Reset bracketed paste mode.\n   *\n   * @vt: #P[See below for supported modes.]    CSI DECRST  \"DEC Private Reset Mode\" \"CSI ? Pm l\"  \"Reset various terminal attributes.\"\n   * Supported param values by DECRST:\n   *\n   * | param | Action                                                  | Support |\n   * | ----- | ------------------------------------------------------- | ------- |\n   * | 1     | Normal Cursor Keys (DECCKM).                            | #Y      |\n   * | 2     | Designate VT52 mode (DECANM).                           | #N      |\n   * | 3     | 80 Column Mode (DECCOLM).                               | #B[Switches to old column width instead of 80.] |\n   * | 6     | Normal Cursor Mode (DECOM).                             | #Y      |\n   * | 7     | No Wraparound Mode (DECAWM).                            | #Y      |\n   * | 8     | No Auto-repeat Keys (DECARM).                           | #N      |\n   * | 9     | Don't send Mouse X & Y on button press.                 | #Y      |\n   * | 12    | Stop Blinking Cursor.                                   | #Y      |\n   * | 25    | Hide Cursor (DECTCEM).                                  | #Y      |\n   * | 45    | No reverse wrap-around.                                 | #Y      |\n   * | 47    | Use Normal Screen Buffer.                               | #Y      |\n   * | 66    | Numeric keypad (DECNKM).                                | #Y      |\n   * | 1000  | Don't send Mouse reports.                               | #Y      |\n   * | 1002  | Don't use Cell Motion Mouse Tracking.                   | #Y      |\n   * | 1003  | Don't use All Motion Mouse Tracking.                    | #Y      |\n   * | 1004  | Don't send FocusIn/FocusOut events.                     | #Y      |\n   * | 1005  | Disable UTF-8 Mouse Mode.                               | #N      |\n   * | 1006  | Disable SGR Mouse Mode.                                 | #Y      |\n   * | 1015  | Disable urxvt Mouse Mode.                               | #N      |\n   * | 1016  | Disable SGR-Pixels Mouse Mode.                          | #Y      |\n   * | 1047  | Use Normal Screen Buffer (clearing screen if in alt).   | #Y      |\n   * | 1048  | Restore cursor as in DECRC.                             | #Y      |\n   * | 1049  | Use Normal Screen Buffer and restore cursor.            | #Y      |\n   * | 2004  | Reset bracketed paste mode.                             | #Y      |\n   *\n   *\n   * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n   */\n  public resetModePrivate(params: IParams): boolean {\n    for (let i = 0; i < params.length; i++) {\n      switch (params.params[i]) {\n        case 1:\n          this._coreService.decPrivateModes.applicationCursorKeys = false;\n          break;\n        case 3:\n          /**\n           * DECCOLM - 80 column mode.\n           * This is only active if 'SetWinLines' (24) is enabled\n           * through `options.windowsOptions`.\n           */\n          if (this._optionsService.rawOptions.windowOptions.setWinLines) {\n            this._bufferService.resize(80, this._bufferService.rows);\n            this._onRequestReset.fire();\n          }\n          break;\n        case 6:\n          this._coreService.decPrivateModes.origin = false;\n          this._setCursor(0, 0);\n          break;\n        case 7:\n          this._coreService.decPrivateModes.wraparound = false;\n          break;\n        case 12:\n          this._optionsService.options.cursorBlink = false;\n          break;\n        case 45:\n          this._coreService.decPrivateModes.reverseWraparound = false;\n          break;\n        case 66:\n          this._logService.debug('Switching back to normal keypad.');\n          this._coreService.decPrivateModes.applicationKeypad = false;\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 9: // X10 Mouse\n        case 1000: // vt200 mouse\n        case 1002: // button event mouse\n        case 1003: // any event mouse\n          this._coreMouseService.activeProtocol = 'NONE';\n          break;\n        case 1004: // send focusin/focusout events\n          this._coreService.decPrivateModes.sendFocus = false;\n          break;\n        case 1005: // utf8 ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1005 not supported (see #2507)');\n          break;\n        case 1006: // sgr ext mode mouse\n          this._coreMouseService.activeEncoding = 'DEFAULT';\n          break;\n        case 1015: // urxvt ext mode mouse - removed in #2507\n          this._logService.debug('DECRST 1015 not supported (see #2507)');\n          break;\n        case 1016: // sgr pixels mode mouse\n          this._coreMouseService.activeEncoding = 'DEFAULT';\n          break;\n        case 25: // hide cursor\n          this._coreService.isCursorHidden = true;\n          break;\n        case 1048: // alt screen cursor\n          this.restoreCursor();\n          break;\n        case 1049: // alt screen buffer cursor\n        // FALL-THROUGH\n        case 47: // normal screen buffer\n        case 1047: // normal screen buffer - clearing it first\n          // Ensure the selection manager has the correct buffer\n          this._bufferService.buffers.activateNormalBuffer();\n          if (params.params[i] === 1049) {\n            this.restoreCursor();\n          }\n          this._coreService.isCursorInitialized = true;\n          this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n          this._onRequestSyncScrollBar.fire();\n          break;\n        case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n          this._coreService.decPrivateModes.bracketedPasteMode = false;\n          break;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps $ p Request ANSI Mode (DECRQM).\n   *\n   * Reports CSI Ps; Pm $ y (DECRPM), where Ps is the mode number as in SM/RM,\n   * and Pm is the mode value:\n   *    0 - not recognized\n   *    1 - set\n   *    2 - reset\n   *    3 - permanently set\n   *    4 - permanently reset\n   *\n   * @vt: #Y  CSI   DECRQM  \"Request Mode\"  \"CSI Ps $p\"  \"Request mode state.\"\n   * Returns a report as `CSI Ps; Pm $ y` (DECRPM), where `Ps` is the mode number as in SM/RM\n   * or DECSET/DECRST, and `Pm` is the mode value:\n   * - 0: not recognized\n   * - 1: set\n   * - 2: reset\n   * - 3: permanently set\n   * - 4: permanently reset\n   *\n   * For modes not understood xterm.js always returns `notRecognized`. In general this means,\n   * that a certain operation mode is not implemented and cannot be used.\n   *\n   * Modes changing the active terminal buffer (47, 1047, 1049) are not subqueried\n   * and only report, whether the alternate buffer is set.\n   *\n   * Mouse encodings and mouse protocols are handled mutual exclusive,\n   * thus only one of each of those can be set at a given time.\n   *\n   * There is a chance, that some mode reports are not fully in line with xterm.js' behavior,\n   * e.g. if the default implementation already exposes a certain behavior. If you find\n   * discrepancies in the mode reports, please file a bug.\n   */\n  public requestMode(params: IParams, ansi: boolean): boolean {\n    // return value as in DECRPM\n    const enum V {\n      NOT_RECOGNIZED = 0,\n      SET = 1,\n      RESET = 2,\n      PERMANENTLY_SET = 3,\n      PERMANENTLY_RESET = 4\n    }\n\n    // access helpers\n    const dm = this._coreService.decPrivateModes;\n    const { activeProtocol: mouseProtocol, activeEncoding: mouseEncoding } = this._coreMouseService;\n    const cs = this._coreService;\n    const { buffers, cols } = this._bufferService;\n    const { active, alt } = buffers;\n    const opts = this._optionsService.rawOptions;\n\n    const f = (m: number, v: V): boolean => {\n      cs.triggerDataEvent(`${C0.ESC}[${ansi ? '' : '?'}${m};${v}$y`);\n      return true;\n    };\n    const b2v = (value: boolean): V => value ? V.SET : V.RESET;\n\n    const p = params.params[0];\n\n    if (ansi) {\n      if (p === 2) return f(p, V.PERMANENTLY_RESET);\n      if (p === 4) return f(p, b2v(cs.modes.insertMode));\n      if (p === 12) return f(p, V.PERMANENTLY_SET);\n      if (p === 20) return f(p, b2v(opts.convertEol));\n      return f(p, V.NOT_RECOGNIZED);\n    }\n\n    if (p === 1) return f(p, b2v(dm.applicationCursorKeys));\n    if (p === 3) return f(p, opts.windowOptions.setWinLines ? (cols === 80 ? V.RESET : cols === 132 ? V.SET : V.NOT_RECOGNIZED) : V.NOT_RECOGNIZED);\n    if (p === 6) return f(p, b2v(dm.origin));\n    if (p === 7) return f(p, b2v(dm.wraparound));\n    if (p === 8) return f(p, V.PERMANENTLY_SET);\n    if (p === 9) return f(p, b2v(mouseProtocol === 'X10'));\n    if (p === 12) return f(p, b2v(opts.cursorBlink));\n    if (p === 25) return f(p, b2v(!cs.isCursorHidden));\n    if (p === 45) return f(p, b2v(dm.reverseWraparound));\n    if (p === 66) return f(p, b2v(dm.applicationKeypad));\n    if (p === 67) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1000) return f(p, b2v(mouseProtocol === 'VT200'));\n    if (p === 1002) return f(p, b2v(mouseProtocol === 'DRAG'));\n    if (p === 1003) return f(p, b2v(mouseProtocol === 'ANY'));\n    if (p === 1004) return f(p, b2v(dm.sendFocus));\n    if (p === 1005) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1006) return f(p, b2v(mouseEncoding === 'SGR'));\n    if (p === 1015) return f(p, V.PERMANENTLY_RESET);\n    if (p === 1016) return f(p, b2v(mouseEncoding === 'SGR_PIXELS'));\n    if (p === 1048) return f(p, V.SET); // xterm always returns SET here\n    if (p === 47 || p === 1047 || p === 1049) return f(p, b2v(active === alt));\n    if (p === 2004) return f(p, b2v(dm.bracketedPasteMode));\n    return f(p, V.NOT_RECOGNIZED);\n  }\n\n  /**\n   * Helper to write color information packed with color mode.\n   */\n  private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n    if (mode === 2) {\n      color |= Attributes.CM_RGB;\n      color &= ~Attributes.RGB_MASK;\n      color |= AttributeData.fromColorRGB([c1, c2, c3]);\n    } else if (mode === 5) {\n      color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n      color |= Attributes.CM_P256 | (c1 & 0xff);\n    }\n    return color;\n  }\n\n  /**\n   * Helper to extract and apply color params/subparams.\n   * Returns advance for params index.\n   */\n  private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n    // normalize params\n    // meaning: [target, CM, ign, val, val, val]\n    // RGB    : [ 38/48,  2, ign,   r,   g,   b]\n    // P256   : [ 38/48,  5, ign,   v, ign, ign]\n    const accu = [0, 0, -1, 0, 0, 0];\n\n    // alignment placeholder for non color space sequences\n    let cSpace = 0;\n\n    // return advance we took in params\n    let advance = 0;\n\n    do {\n      accu[advance + cSpace] = params.params[pos + advance];\n      if (params.hasSubParams(pos + advance)) {\n        const subparams = params.getSubParams(pos + advance)!;\n        let i = 0;\n        do {\n          if (accu[1] === 5) {\n            cSpace = 1;\n          }\n          accu[advance + i + 1 + cSpace] = subparams[i];\n        } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n        break;\n      }\n      // exit early if can decide color mode with semicolons\n      if ((accu[1] === 5 && advance + cSpace >= 2)\n        || (accu[1] === 2 && advance + cSpace >= 5)) {\n        break;\n      }\n      // offset colorSpace slot for semicolon mode\n      if (accu[1]) {\n        cSpace = 1;\n      }\n    } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n    // set default values to 0\n    for (let i = 2; i < accu.length; ++i) {\n      if (accu[i] === -1) {\n        accu[i] = 0;\n      }\n    }\n\n    // apply colors\n    switch (accu[0]) {\n      case 38:\n        attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 48:\n        attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n        break;\n      case 58:\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n    }\n\n    return advance;\n  }\n\n  /**\n   * SGR 4 subparams:\n   *    4:0   -   equal to SGR 24 (turn off all underline)\n   *    4:1   -   equal to SGR 4 (single underline)\n   *    4:2   -   equal to SGR 21 (double underline)\n   *    4:3   -   curly underline\n   *    4:4   -   dotted underline\n   *    4:5   -   dashed underline\n   */\n  private _processUnderline(style: number, attr: IAttributeData): void {\n    // treat extended attrs as immutable, thus always clone from old one\n    // this is needed since the buffer only holds references to it\n    attr.extended = attr.extended.clone();\n\n    // default to 1 == single underline\n    if (!~style || style > 5) {\n      style = 1;\n    }\n    attr.extended.underlineStyle = style;\n    attr.fg |= FgFlags.UNDERLINE;\n\n    // 0 deactivates underline\n    if (style === 0) {\n      attr.fg &= ~FgFlags.UNDERLINE;\n    }\n\n    // update HAS_EXTENDED in BG\n    attr.updateExtended();\n  }\n\n  private _processSGR0(attr: IAttributeData): void {\n    attr.fg = DEFAULT_ATTR_DATA.fg;\n    attr.bg = DEFAULT_ATTR_DATA.bg;\n    attr.extended = attr.extended.clone();\n    // Reset underline style and color. Note that we don't want to reset other\n    // fields such as the url id.\n    attr.extended.underlineStyle = UnderlineStyle.NONE;\n    attr.extended.underlineColor &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    attr.updateExtended();\n  }\n\n  /**\n   * CSI Pm m  Character Attributes (SGR).\n   *\n   * @vt: #P[See below for supported attributes.]    CSI SGR   \"Select Graphic Rendition\"  \"CSI Pm m\"  \"Set/Reset various text attributes.\"\n   * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n   * are applied in order from left to right. The changed attributes are applied to all new\n   * characters received. If you move characters in the viewport by scrolling or any other means,\n   * then the attributes move with the characters.\n   *\n   * Supported param values by SGR:\n   *\n   * | Param     | Meaning                                                  | Support |\n   * | --------- | -------------------------------------------------------- | ------- |\n   * | 0         | Normal (default). Resets any other preceding SGR.        | #Y      |\n   * | 1         | Bold. (also see `options.drawBoldTextInBrightColors`)    | #Y      |\n   * | 2         | Faint, decreased intensity.                              | #Y      |\n   * | 3         | Italic.                                                  | #Y      |\n   * | 4         | Underlined (see below for style support).                | #Y      |\n   * | 5         | Slowly blinking.                                         | #N      |\n   * | 6         | Rapidly blinking.                                        | #N      |\n   * | 7         | Inverse. Flips foreground and background color.          | #Y      |\n   * | 8         | Invisible (hidden).                                      | #Y      |\n   * | 9         | Crossed-out characters (strikethrough).                  | #Y      |\n   * | 21        | Doubly underlined.                                       | #Y      |\n   * | 22        | Normal (neither bold nor faint).                         | #Y      |\n   * | 23        | No italic.                                               | #Y      |\n   * | 24        | Not underlined.                                          | #Y      |\n   * | 25        | Steady (not blinking).                                   | #Y      |\n   * | 27        | Positive (not inverse).                                  | #Y      |\n   * | 28        | Visible (not hidden).                                    | #Y      |\n   * | 29        | Not Crossed-out (strikethrough).                         | #Y      |\n   * | 30        | Foreground color: Black.                                 | #Y      |\n   * | 31        | Foreground color: Red.                                   | #Y      |\n   * | 32        | Foreground color: Green.                                 | #Y      |\n   * | 33        | Foreground color: Yellow.                                | #Y      |\n   * | 34        | Foreground color: Blue.                                  | #Y      |\n   * | 35        | Foreground color: Magenta.                               | #Y      |\n   * | 36        | Foreground color: Cyan.                                  | #Y      |\n   * | 37        | Foreground color: White.                                 | #Y      |\n   * | 38        | Foreground color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 39        | Foreground color: Default (original).                    | #Y      |\n   * | 40        | Background color: Black.                                 | #Y      |\n   * | 41        | Background color: Red.                                   | #Y      |\n   * | 42        | Background color: Green.                                 | #Y      |\n   * | 43        | Background color: Yellow.                                | #Y      |\n   * | 44        | Background color: Blue.                                  | #Y      |\n   * | 45        | Background color: Magenta.                               | #Y      |\n   * | 46        | Background color: Cyan.                                  | #Y      |\n   * | 47        | Background color: White.                                 | #Y      |\n   * | 48        | Background color: Extended color.                        | #P[Support for RGB and indexed colors, see below.] |\n   * | 49        | Background color: Default (original).                    | #Y      |\n   * | 53        | Overlined.                                               | #Y      |\n   * | 55        | Not Overlined.                                           | #Y      |\n   * | 58        | Underline color: Extended color.                         | #P[Support for RGB and indexed colors, see below.] |\n   * | 90 - 97   | Bright foreground color (analogous to 30 - 37).          | #Y      |\n   * | 100 - 107 | Bright background color (analogous to 40 - 47).          | #Y      |\n   *\n   * Underline supports subparams to denote the style in the form `4 : x`:\n   *\n   * | x      | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | No underline. Same as `SGR 24 m`.                             | #Y      |\n   * | 1      | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   * | 2      | Double underline.                                             | #Y      |\n   * | 3      | Curly underline.                                              | #Y      |\n   * | 4      | Dotted underline.                                             | #Y      |\n   * | 5      | Dashed underline.                                             | #Y      |\n   * | other  | Single underline. Same as `SGR 4 m`.                          | #Y      |\n   *\n   * Extended colors are supported for foreground (Ps=38), background (Ps=48) and underline (Ps=58)\n   * as follows:\n   *\n   * | Ps + 1 | Meaning                                                       | Support |\n   * | ------ | ------------------------------------------------------------- | ------- |\n   * | 0      | Implementation defined.                                       | #N      |\n   * | 1      | Transparent.                                                  | #N      |\n   * | 2      | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`.  | #Y      |\n   * | 3      | CMY color.                                                    | #N      |\n   * | 4      | CMYK color.                                                   | #N      |\n   * | 5      | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y      |\n   *\n   *\n   * FIXME: blinking is implemented in attrs, but not working in renderers?\n   * FIXME: remove dead branch for p=100\n   */\n  public charAttributes(params: IParams): boolean {\n    // Optimize a single SGR0.\n    if (params.length === 1 && params.params[0] === 0) {\n      this._processSGR0(this._curAttrData);\n      return true;\n    }\n\n    const l = params.length;\n    let p;\n    const attr = this._curAttrData;\n\n    for (let i = 0; i < l; i++) {\n      p = params.params[i];\n      if (p >= 30 && p <= 37) {\n        // fg color 8\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 30);\n      } else if (p >= 40 && p <= 47) {\n        // bg color 8\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 40);\n      } else if (p >= 90 && p <= 97) {\n        // fg color 16\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n      } else if (p >= 100 && p <= 107) {\n        // bg color 16\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n        attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n      } else if (p === 0) {\n        // default\n        this._processSGR0(attr);\n      } else if (p === 1) {\n        // bold text\n        attr.fg |= FgFlags.BOLD;\n      } else if (p === 3) {\n        // italic text\n        attr.bg |= BgFlags.ITALIC;\n      } else if (p === 4) {\n        // underlined text\n        attr.fg |= FgFlags.UNDERLINE;\n        this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n      } else if (p === 5) {\n        // blink\n        attr.fg |= FgFlags.BLINK;\n      } else if (p === 7) {\n        // inverse and positive\n        // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n        attr.fg |= FgFlags.INVERSE;\n      } else if (p === 8) {\n        // invisible\n        attr.fg |= FgFlags.INVISIBLE;\n      } else if (p === 9) {\n        // strikethrough\n        attr.fg |= FgFlags.STRIKETHROUGH;\n      } else if (p === 2) {\n        // dimmed text\n        attr.bg |= BgFlags.DIM;\n      } else if (p === 21) {\n        // double underline\n        this._processUnderline(UnderlineStyle.DOUBLE, attr);\n      } else if (p === 22) {\n        // not bold nor faint\n        attr.fg &= ~FgFlags.BOLD;\n        attr.bg &= ~BgFlags.DIM;\n      } else if (p === 23) {\n        // not italic\n        attr.bg &= ~BgFlags.ITALIC;\n      } else if (p === 24) {\n        // not underlined\n        attr.fg &= ~FgFlags.UNDERLINE;\n        this._processUnderline(UnderlineStyle.NONE, attr);\n      } else if (p === 25) {\n        // not blink\n        attr.fg &= ~FgFlags.BLINK;\n      } else if (p === 27) {\n        // not inverse\n        attr.fg &= ~FgFlags.INVERSE;\n      } else if (p === 28) {\n        // not invisible\n        attr.fg &= ~FgFlags.INVISIBLE;\n      } else if (p === 29) {\n        // not strikethrough\n        attr.fg &= ~FgFlags.STRIKETHROUGH;\n      } else if (p === 39) {\n        // reset fg\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 49) {\n        // reset bg\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else if (p === 38 || p === 48 || p === 58) {\n        // fg color 256 and RGB\n        i += this._extractColor(params, i, attr);\n      } else if (p === 53) {\n        // overline\n        attr.bg |= BgFlags.OVERLINE;\n      } else if (p === 55) {\n        // not overline\n        attr.bg &= ~BgFlags.OVERLINE;\n      } else if (p === 59) {\n        attr.extended = attr.extended.clone();\n        attr.extended.underlineColor = -1;\n        attr.updateExtended();\n      } else if (p === 100) { // FIXME: dead branch, p=100 already handled above!\n        // reset fg/bg\n        attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n        attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n        attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n      } else {\n        this._logService.debug('Unknown SGR attribute: %d.', p);\n      }\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps n  Device Status Report (DSR).\n   *     Ps = 5  -> Status Report.  Result (``OK'') is\n   *   CSI 0 n\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column].\n   *   Result is\n   *   CSI r ; c R\n   * CSI ? Ps n\n   *   Device Status Report (DSR, DEC-specific).\n   *     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI\n   *     ? r ; c R (assumes page is zero).\n   *     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready).\n   *     or CSI ? 1 1  n  (not ready).\n   *     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked)\n   *     or CSI ? 2 1  n  (locked).\n   *     Ps = 2 6  -> Report Keyboard status as\n   *   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American).\n   *   The last two parameters apply to VT400 & up, and denote key-\n   *   board ready and LK01 respectively.\n   *     Ps = 5 3  -> Report Locator status as\n   *   CSI ? 5 3  n  Locator available, if compiled-in, or\n   *   CSI ? 5 0  n  No Locator, if not.\n   *\n   * @vt: #Y CSI DSR   \"Device Status Report\"  \"CSI Ps n\"  \"Request cursor position (CPR) with `Ps` = 6.\"\n   */\n  public deviceStatus(params: IParams): boolean {\n    switch (params.params[0]) {\n      case 5:\n        // status report\n        this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n        break;\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n        break;\n    }\n    return true;\n  }\n\n  // @vt: #P[Only CPR is supported.]  CSI DECDSR  \"DEC Device Status Report\"  \"CSI ? Ps n\"  \"Only CPR is supported (same as DSR).\"\n  public deviceStatusPrivate(params: IParams): boolean {\n    // modern xterm doesnt seem to\n    // respond to any of these except ?6, 6, and 5\n    switch (params.params[0]) {\n      case 6:\n        // cursor position\n        const y = this._activeBuffer.y + 1;\n        const x = this._activeBuffer.x + 1;\n        this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n        break;\n      case 15:\n        // no printer\n        // this.handler(C0.ESC + '[?11n');\n        break;\n      case 25:\n        // dont support user defined keys\n        // this.handler(C0.ESC + '[?21n');\n        break;\n      case 26:\n        // north american keyboard\n        // this.handler(C0.ESC + '[?27;1;0;0n');\n        break;\n      case 53:\n        // no dec locator/mouse\n        // this.handler(C0.ESC + '[?50n');\n        break;\n    }\n    return true;\n  }\n\n  /**\n   * CSI ! p   Soft terminal reset (DECSTR).\n   * http://vt100.net/docs/vt220-rm/table4-10.html\n   *\n   * @vt: #Y CSI DECSTR  \"Soft Terminal Reset\"   \"CSI ! p\"   \"Reset several terminal attributes to initial state.\"\n   * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full\n   * terminal bootstrap, DECSTR only resets certain attributes. For most needs DECSTR should be\n   * sufficient.\n   *\n   * The following terminal attributes are reset to default values:\n   * - IRM is reset (dafault = false)\n   * - scroll margins are reset (default = viewport size)\n   * - erase attributes are reset to default\n   * - charsets are reset\n   * - DECSC data is reset to initial values\n   * - DECOM is reset to absolute mode\n   *\n   *\n   * FIXME: there are several more attributes missing (see VT520 manual)\n   */\n  public softReset(params: IParams): boolean {\n    this._coreService.isCursorHidden = false;\n    this._onRequestSyncScrollBar.fire();\n    this._activeBuffer.scrollTop = 0;\n    this._activeBuffer.scrollBottom = this._bufferService.rows - 1;\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._coreService.reset();\n    this._charsetService.reset();\n\n    // reset DECSC data\n    this._activeBuffer.savedX = 0;\n    this._activeBuffer.savedY = this._activeBuffer.ybase;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n\n    // reset DECOM\n    this._coreService.decPrivateModes.origin = false;\n    return true;\n  }\n\n  /**\n   * CSI Ps SP q  Set cursor style (DECSCUSR, VT520).\n   *   Ps = 0  -> blinking block.\n   *   Ps = 1  -> blinking block (default).\n   *   Ps = 2  -> steady block.\n   *   Ps = 3  -> blinking underline.\n   *   Ps = 4  -> steady underline.\n   *   Ps = 5  -> blinking bar (xterm).\n   *   Ps = 6  -> steady bar (xterm).\n   *\n   * @vt: #Y CSI DECSCUSR  \"Set Cursor Style\"  \"CSI Ps SP q\"   \"Set cursor style.\"\n   * Supported cursor styles:\n   *  - empty, 0 or 1: steady block\n   *  - 2: blink block\n   *  - 3: steady underline\n   *  - 4: blink underline\n   *  - 5: steady bar\n   *  - 6: blink bar\n   */\n  public setCursorStyle(params: IParams): boolean {\n    const param = params.params[0] || 1;\n    switch (param) {\n      case 1:\n      case 2:\n        this._optionsService.options.cursorStyle = 'block';\n        break;\n      case 3:\n      case 4:\n        this._optionsService.options.cursorStyle = 'underline';\n        break;\n      case 5:\n      case 6:\n        this._optionsService.options.cursorStyle = 'bar';\n        break;\n    }\n    const isBlinking = param % 2 === 1;\n    this._optionsService.options.cursorBlink = isBlinking;\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps r\n   *   Set Scrolling Region [top;bottom] (default = full size of win-\n   *   dow) (DECSTBM).\n   *\n   * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n   */\n  public setScrollRegion(params: IParams): boolean {\n    const top = params.params[0] || 1;\n    let bottom: number;\n\n    if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n      bottom = this._bufferService.rows;\n    }\n\n    if (bottom > top) {\n      this._activeBuffer.scrollTop = top - 1;\n      this._activeBuffer.scrollBottom = bottom - 1;\n      this._setCursor(0, 0);\n    }\n    return true;\n  }\n\n  /**\n   * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n   *\n   * Note: Only those listed below are supported. All others are left to integrators and\n   * need special treatment based on the embedding environment.\n   *\n   *    Ps = 1 4                                                          supported\n   *      Report xterm text area size in pixels.\n   *      Result is CSI 4 ; height ; width t\n   *    Ps = 14 ; 2                                                       not implemented\n   *    Ps = 16                                                           supported\n   *      Report xterm character cell size in pixels.\n   *      Result is CSI 6 ; height ; width t\n   *    Ps = 18                                                           supported\n   *      Report the size of the text area in characters.\n   *      Result is CSI 8 ; height ; width t\n   *    Ps = 20                                                           supported\n   *      Report xterm window's icon label.\n   *      Result is OSC L label ST\n   *    Ps = 21                                                           supported\n   *      Report xterm window's title.\n   *      Result is OSC l label ST\n   *    Ps = 22 ; 0  -> Save xterm icon and window title on stack.        supported\n   *    Ps = 22 ; 1  -> Save xterm icon title on stack.                   supported\n   *    Ps = 22 ; 2  -> Save xterm window title on stack.                 supported\n   *    Ps = 23 ; 0  -> Restore xterm icon and window title from stack.   supported\n   *    Ps = 23 ; 1  -> Restore xterm icon title from stack.              supported\n   *    Ps = 23 ; 2  -> Restore xterm window title from stack.            supported\n   *    Ps >= 24                                                          not implemented\n   */\n  public windowOptions(params: IParams): boolean {\n    if (!paramToWindowOption(params.params[0], this._optionsService.rawOptions.windowOptions)) {\n      return true;\n    }\n    const second = (params.length > 1) ? params.params[1] : 0;\n    switch (params.params[0]) {\n      case 14:  // GetWinSizePixels, returns CSI 4 ; height ; width t\n        if (second !== 2) {\n          this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n        }\n        break;\n      case 16:  // GetCellSizePixels, returns CSI 6 ; height ; width t\n        this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n        break;\n      case 18:  // GetWinSizeChars, returns CSI 8 ; height ; width t\n        if (this._bufferService) {\n          this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n        }\n        break;\n      case 22:  // PushTitle\n        if (second === 0 || second === 2) {\n          this._windowTitleStack.push(this._windowTitle);\n          if (this._windowTitleStack.length > STACK_LIMIT) {\n            this._windowTitleStack.shift();\n          }\n        }\n        if (second === 0 || second === 1) {\n          this._iconNameStack.push(this._iconName);\n          if (this._iconNameStack.length > STACK_LIMIT) {\n            this._iconNameStack.shift();\n          }\n        }\n        break;\n      case 23:  // PopTitle\n        if (second === 0 || second === 2) {\n          if (this._windowTitleStack.length) {\n            this.setTitle(this._windowTitleStack.pop()!);\n          }\n        }\n        if (second === 0 || second === 1) {\n          if (this._iconNameStack.length) {\n            this.setIconName(this._iconNameStack.pop()!);\n          }\n        }\n        break;\n    }\n    return true;\n  }\n\n\n  /**\n   * CSI s\n   * ESC 7\n   *   Save cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCOSC   \"Save Cursor\"   \"CSI s\"   \"Save cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  SC   \"Save Cursor\"   \"ESC 7\"   \"Save cursor position, charmap and text attributes.\"\n   */\n  public saveCursor(params?: IParams): boolean {\n    this._activeBuffer.savedX = this._activeBuffer.x;\n    this._activeBuffer.savedY = this._activeBuffer.ybase + this._activeBuffer.y;\n    this._activeBuffer.savedCurAttrData.fg = this._curAttrData.fg;\n    this._activeBuffer.savedCurAttrData.bg = this._curAttrData.bg;\n    this._activeBuffer.savedCharset = this._charsetService.charset;\n    return true;\n  }\n\n\n  /**\n   * CSI u\n   * ESC 8\n   *   Restore cursor (ANSI.SYS).\n   *\n   * @vt: #P[TODO...]  CSI SCORC \"Restore Cursor\"  \"CSI u\"   \"Restore cursor position, charmap and text attributes.\"\n   * @vt: #Y ESC  RC \"Restore Cursor\"  \"ESC 8\"   \"Restore cursor position, charmap and text attributes.\"\n   */\n  public restoreCursor(params?: IParams): boolean {\n    this._activeBuffer.x = this._activeBuffer.savedX || 0;\n    this._activeBuffer.y = Math.max(this._activeBuffer.savedY - this._activeBuffer.ybase, 0);\n    this._curAttrData.fg = this._activeBuffer.savedCurAttrData.fg;\n    this._curAttrData.bg = this._activeBuffer.savedCurAttrData.bg;\n    this._charsetService.charset = (this as any)._savedCharset;\n    if (this._activeBuffer.savedCharset) {\n      this._charsetService.charset = this._activeBuffer.savedCharset;\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n\n  /**\n   * OSC 2; <data> ST (set window title)\n   *   Proxy to set window title.\n   *\n   * @vt: #P[Icon name is not exposed.]   OSC    0   \"Set Windows Title and Icon Name\"  \"OSC 0 ; Pt BEL\"  \"Set window title and icon name.\"\n   * Icon name is not supported. For Window Title see below.\n   *\n   * @vt: #Y     OSC    2   \"Set Windows Title\"  \"OSC 2 ; Pt BEL\"  \"Set window title.\"\n   * xterm.js does not manipulate the title directly, instead exposes changes via the event\n   * `Terminal.onTitleChange`.\n   */\n  public setTitle(data: string): boolean {\n    this._windowTitle = data;\n    this._onTitleChange.fire(data);\n    return true;\n  }\n\n  /**\n   * OSC 1; <data> ST\n   * Note: Icon name is not exposed.\n   */\n  public setIconName(data: string): boolean {\n    this._iconName = data;\n    return true;\n  }\n\n  /**\n   * OSC 4; <num> ; <text> ST (set ANSI color <num> to <text>)\n   *\n   * @vt: #Y    OSC    4    \"Set ANSI color\"   \"OSC 4 ; c ; spec BEL\" \"Change color number `c` to the color specified by `spec`.\"\n   * `c` is the color index between 0 and 255. The color format of `spec` is derived from\n   * `XParseColor` (see OSC 10 for supported formats). There may be multipe `c ; spec` pairs present\n   * in the same instruction. If `spec` contains `?` the terminal returns a sequence with the\n   * currently set color.\n   */\n  public setOrReportIndexedColor(data: string): boolean {\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    while (slots.length > 1) {\n      const idx = slots.shift() as string;\n      const spec = slots.shift() as string;\n      if (/^\\d+$/.exec(idx)) {\n        const index = parseInt(idx);\n        if (isValidColorIndex(index)) {\n          if (spec === '?') {\n            event.push({ type: ColorRequestType.REPORT, index });\n          } else {\n            const color = parseColor(spec);\n            if (color) {\n              event.push({ type: ColorRequestType.SET, index, color });\n            }\n          }\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 8 ; <params> ; <uri> ST - create hyperlink\n   * OSC 8 ; ; ST - finish hyperlink\n   *\n   * Test case:\n   *\n   * ```sh\n   * printf '\\e]8;;http://example.com\\e\\\\This is a link\\e]8;;\\e\\\\\\n'\n   * ```\n   *\n   * @vt: #Y    OSC    8    \"Create hyperlink\"   \"OSC 8 ; params ; uri BEL\" \"Create a hyperlink to `uri` using `params`.\"\n   * `uri` is a hyperlink starting with `http://`, `https://`, `ftp://`, `file://` or `mailto://`. `params` is an\n   * optional list of key=value assignments, separated by the : character.\n   * Example: `id=xyz123:foo=bar:baz=quux`.\n   * Currently only the id key is defined. Cells that share the same ID and URI share hover\n   * feedback. Use `OSC 8 ; ; BEL` to finish the current hyperlink.\n   */\n  public setHyperlink(data: string): boolean {\n    const args = data.split(';');\n    if (args.length < 2) {\n      return false;\n    }\n    if (args[1]) {\n      return this._createHyperlink(args[0], args[1]);\n    }\n    if (args[0]) {\n      return false;\n    }\n    return this._finishHyperlink();\n  }\n\n  private _createHyperlink(params: string, uri: string): boolean {\n    // It's legal to open a new hyperlink without explicitly finishing the previous one\n    if (this._getCurrentLinkId()) {\n      this._finishHyperlink();\n    }\n    const parsedParams = params.split(':');\n    let id: string | undefined;\n    const idParamIndex = parsedParams.findIndex(e => e.startsWith('id='));\n    if (idParamIndex !== -1) {\n      id = parsedParams[idParamIndex].slice(3) || undefined;\n    }\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = this._oscLinkService.registerLink({ id, uri });\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  private _finishHyperlink(): boolean {\n    this._curAttrData.extended = this._curAttrData.extended.clone();\n    this._curAttrData.extended.urlId = 0;\n    this._curAttrData.updateExtended();\n    return true;\n  }\n\n  // special colors - OSC 10 | 11 | 12\n  private _specialColors = [SpecialColorIndex.FOREGROUND, SpecialColorIndex.BACKGROUND, SpecialColorIndex.CURSOR];\n\n  /**\n   * Apply colors requests for special colors in OSC 10 | 11 | 12.\n   * Since these commands are stacking from multiple parameters,\n   * we handle them in a loop with an entry offset to `_specialColors`.\n   */\n  private _setOrReportSpecialColor(data: string, offset: number): boolean {\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i, ++offset) {\n      if (offset >= this._specialColors.length) break;\n      if (slots[i] === '?') {\n        this._onColor.fire([{ type: ColorRequestType.REPORT, index: this._specialColors[offset] }]);\n      } else {\n        const color = parseColor(slots[i]);\n        if (color) {\n          this._onColor.fire([{ type: ColorRequestType.SET, index: this._specialColors[offset], color }]);\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * OSC 10 ; <xcolor name>|<?> ST - set or query default foreground color\n   *\n   * @vt: #Y  OSC   10    \"Set or query default foreground color\"   \"OSC 10 ; Pt BEL\"  \"Set or query default foreground color.\"\n   * To set the color, the following color specification formats are supported:\n   * - `rgb:<red>/<green>/<blue>` for  `<red>, <green>, <blue>` in `h | hh | hhh | hhhh`, where\n   *   `h` is a single hexadecimal digit (case insignificant). The different widths scale\n   *   from 4 bit (`h`) to 16 bit (`hhhh`) and get converted to 8 bit (`hh`).\n   * - `#RGB` - 4 bits per channel, expanded to `#R0G0B0`\n   * - `#RRGGBB` - 8 bits per channel\n   * - `#RRRGGGBBB` - 12 bits per channel, truncated to `#RRGGBB`\n   * - `#RRRRGGGGBBBB` - 16 bits per channel, truncated to `#RRGGBB`\n   *\n   * **Note:** X11 named colors are currently unsupported.\n   *\n   * If `Pt` contains `?` instead of a color specification, the terminal\n   * returns a sequence with the current default foreground color\n   * (use that sequence to restore the color after changes).\n   *\n   * **Note:** Other than xterm, xterm.js does not support OSC 12 - 19.\n   * Therefore stacking multiple `Pt` separated by `;` only works for the first two entries.\n   */\n  public setOrReportFgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 0);\n  }\n\n  /**\n   * OSC 11 ; <xcolor name>|<?> ST - set or query default background color\n   *\n   * @vt: #Y  OSC   11    \"Set or query default background color\"   \"OSC 11 ; Pt BEL\"  \"Same as OSC 10, but for default background.\"\n   */\n  public setOrReportBgColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 1);\n  }\n\n  /**\n   * OSC 12 ; <xcolor name>|<?> ST - set or query default cursor color\n   *\n   * @vt: #Y  OSC   12    \"Set or query default cursor color\"   \"OSC 12 ; Pt BEL\"  \"Same as OSC 10, but for default cursor color.\"\n   */\n  public setOrReportCursorColor(data: string): boolean {\n    return this._setOrReportSpecialColor(data, 2);\n  }\n\n  /**\n   * OSC 104 ; <num> ST - restore ANSI color <num>\n   *\n   * @vt: #Y  OSC   104    \"Reset ANSI color\"   \"OSC 104 ; c BEL\" \"Reset color number `c` to themed color.\"\n   * `c` is the color index between 0 and 255. This function restores the default color for `c` as\n   * specified by the loaded theme. Any number of `c` parameters may be given.\n   * If no parameters are given, the entire indexed color table will be reset.\n   */\n  public restoreIndexedColor(data: string): boolean {\n    if (!data) {\n      this._onColor.fire([{ type: ColorRequestType.RESTORE }]);\n      return true;\n    }\n    const event: IColorEvent = [];\n    const slots = data.split(';');\n    for (let i = 0; i < slots.length; ++i) {\n      if (/^\\d+$/.exec(slots[i])) {\n        const index = parseInt(slots[i]);\n        if (isValidColorIndex(index)) {\n          event.push({ type: ColorRequestType.RESTORE, index });\n        }\n      }\n    }\n    if (event.length) {\n      this._onColor.fire(event);\n    }\n    return true;\n  }\n\n  /**\n   * OSC 110 ST - restore default foreground color\n   *\n   * @vt: #Y  OSC   110    \"Restore default foreground color\"   \"OSC 110 BEL\"  \"Restore default foreground to themed color.\"\n   */\n  public restoreFgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.FOREGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 111 ST - restore default background color\n   *\n   * @vt: #Y  OSC   111    \"Restore default background color\"   \"OSC 111 BEL\"  \"Restore default background to themed color.\"\n   */\n  public restoreBgColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.BACKGROUND }]);\n    return true;\n  }\n\n  /**\n   * OSC 112 ST - restore default cursor color\n   *\n   * @vt: #Y  OSC   112    \"Restore default cursor color\"   \"OSC 112 BEL\"  \"Restore default cursor to themed color.\"\n   */\n  public restoreCursorColor(data: string): boolean {\n    this._onColor.fire([{ type: ColorRequestType.RESTORE, index: SpecialColorIndex.CURSOR }]);\n    return true;\n  }\n\n  /**\n   * ESC E\n   * C1.NEL\n   *   DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n   *   Moves cursor to first position on next line.\n   *\n   * @vt: #Y   C1    NEL   \"Next Line\"   \"\\x85\"    \"Move the cursor to the beginning of the next row.\"\n   * @vt: #Y   ESC   NEL   \"Next Line\"   \"ESC E\"   \"Move the cursor to the beginning of the next row.\"\n   */\n  public nextLine(): boolean {\n    this._activeBuffer.x = 0;\n    this.index();\n    return true;\n  }\n\n  /**\n   * ESC =\n   *   DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n   *   Enables the numeric keypad to send application sequences to the host.\n   */\n  public keypadApplicationMode(): boolean {\n    this._logService.debug('Serial port requested application keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = true;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC >\n   *   DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n   *   Enables the keypad to send numeric characters to the host.\n   */\n  public keypadNumericMode(): boolean {\n    this._logService.debug('Switching back to normal keypad.');\n    this._coreService.decPrivateModes.applicationKeypad = false;\n    this._onRequestSyncScrollBar.fire();\n    return true;\n  }\n\n  /**\n   * ESC % @\n   * ESC % G\n   *   Select default character set. UTF-8 is not supported (string are unicode anyways)\n   *   therefore ESC % G does the same.\n   */\n  public selectDefaultCharset(): boolean {\n    this._charsetService.setgLevel(0);\n    this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n    return true;\n  }\n\n  /**\n   * ESC ( C\n   *   Designate G0 Character Set, VT100, ISO 2022.\n   * ESC ) C\n   *   Designate G1 Character Set (ISO 2022, VT100).\n   * ESC * C\n   *   Designate G2 Character Set (ISO 2022, VT220).\n   * ESC + C\n   *   Designate G3 Character Set (ISO 2022, VT220).\n   * ESC - C\n   *   Designate G1 Character Set (VT300).\n   * ESC . C\n   *   Designate G2 Character Set (VT300).\n   * ESC / C\n   *   Designate G3 Character Set (VT300). C = A  -> ISO Latin-1 Supplemental. - Supported?\n   */\n  public selectCharset(collectAndFlag: string): boolean {\n    if (collectAndFlag.length !== 2) {\n      this.selectDefaultCharset();\n      return true;\n    }\n    if (collectAndFlag[0] === '/') {\n      return true;  // TODO: Is this supported?\n    }\n    this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n    return true;\n  }\n\n  /**\n   * ESC D\n   * C1.IND\n   *   DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n   *   Moves the cursor down one line in the same column.\n   *\n   * @vt: #Y   C1    IND   \"Index\"   \"\\x84\"    \"Move the cursor one line down scrolling if needed.\"\n   * @vt: #Y   ESC   IND   \"Index\"   \"ESC D\"   \"Move the cursor one line down scrolling if needed.\"\n   */\n  public index(): boolean {\n    this._restrictCursor();\n    this._activeBuffer.y++;\n    if (this._activeBuffer.y === this._activeBuffer.scrollBottom + 1) {\n      this._activeBuffer.y--;\n      this._bufferService.scroll(this._eraseAttrData());\n    } else if (this._activeBuffer.y >= this._bufferService.rows) {\n      this._activeBuffer.y = this._bufferService.rows - 1;\n    }\n    this._restrictCursor();\n    return true;\n  }\n\n  /**\n   * ESC H\n   * C1.HTS\n   *   DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n   *   Sets a horizontal tab stop at the column position indicated by\n   *   the value of the active column when the terminal receives an HTS.\n   *\n   * @vt: #Y   C1    HTS   \"Horizontal Tabulation Set\" \"\\x88\"    \"Places a tab stop at the current cursor position.\"\n   * @vt: #Y   ESC   HTS   \"Horizontal Tabulation Set\" \"ESC H\"   \"Places a tab stop at the current cursor position.\"\n   */\n  public tabSet(): boolean {\n    this._activeBuffer.tabs[this._activeBuffer.x] = true;\n    return true;\n  }\n\n  /**\n   * ESC M\n   * C1.RI\n   *   DEC mnemonic: HTS\n   *   Moves the cursor up one line in the same column. If the cursor is at the top margin,\n   *   the page scrolls down.\n   *\n   * @vt: #Y ESC  IR \"Reverse Index\" \"ESC M\"  \"Move the cursor one line up scrolling if needed.\"\n   */\n  public reverseIndex(): boolean {\n    this._restrictCursor();\n    if (this._activeBuffer.y === this._activeBuffer.scrollTop) {\n      // possibly move the code below to term.reverseScroll();\n      // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n      // blankLine(true) is xterm/linux behavior\n      const scrollRegionHeight = this._activeBuffer.scrollBottom - this._activeBuffer.scrollTop;\n      this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase + this._activeBuffer.y, scrollRegionHeight, 1);\n      this._activeBuffer.lines.set(this._activeBuffer.ybase + this._activeBuffer.y, this._activeBuffer.getBlankLine(this._eraseAttrData()));\n      this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom);\n    } else {\n      this._activeBuffer.y--;\n      this._restrictCursor(); // quickfix to not run out of bounds\n    }\n    return true;\n  }\n\n  /**\n   * ESC c\n   *   DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n   *   Reset to initial state.\n   */\n  public fullReset(): boolean {\n    this._parser.reset();\n    this._onRequestReset.fire();\n    return true;\n  }\n\n  public reset(): void {\n    this._curAttrData = DEFAULT_ATTR_DATA.clone();\n    this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n  }\n\n  /**\n   * back_color_erase feature for xterm.\n   */\n  private _eraseAttrData(): IAttributeData {\n    this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n    this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n    return this._eraseAttrDataInternal;\n  }\n\n  /**\n   * ESC n\n   * ESC o\n   * ESC |\n   * ESC }\n   * ESC ~\n   *   DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n   *   When you use a locking shift, the character set remains in GL or GR until\n   *   you use another locking shift. (partly supported)\n   */\n  public setgLevel(level: number): boolean {\n    this._charsetService.setgLevel(level);\n    return true;\n  }\n\n  /**\n   * ESC # 8\n   *   DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n   *   This control function fills the complete screen area with\n   *   a test pattern (E) used for adjusting screen alignment.\n   *\n   * @vt: #Y   ESC   DECALN   \"Screen Alignment Pattern\"  \"ESC # 8\"  \"Fill viewport with a test pattern (E).\"\n   */\n  public screenAlignmentPattern(): boolean {\n    // prepare cell data\n    const cell = new CellData();\n    cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n    cell.fg = this._curAttrData.fg;\n    cell.bg = this._curAttrData.bg;\n\n\n    this._setCursor(0, 0);\n    for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n      const row = this._activeBuffer.ybase + this._activeBuffer.y + yOffset;\n      const line = this._activeBuffer.lines.get(row);\n      if (line) {\n        line.fill(cell);\n        line.isWrapped = false;\n      }\n    }\n    this._dirtyRowTracker.markAllDirty();\n    this._setCursor(0, 0);\n    return true;\n  }\n\n\n  /**\n   * DCS $ q Pt ST\n   *   DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n   *   Request Status String (DECRQSS), VT420 and up.\n   *   Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n   *\n   * @vt: #P[Limited support, see below.]  DCS   DECRQSS   \"Request Selection or Setting\"  \"DCS $ q Pt ST\"   \"Request several terminal settings.\"\n   * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the\n   * corresponding CSI string, `ESC P 0 ST` for invalid requests.\n   *\n   * Supported requests and responses:\n   *\n   * | Type                             | Request           | Response (`Pt`)                                       |\n   * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n   * | Graphic Rendition (SGR)          | `DCS $ q m ST`    | always reporting `0m` (currently broken)              |\n   * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST`    | `Ps ; Ps r`                                           |\n   * | Cursor Style (DECSCUSR)          | `DCS $ q SP q ST` | `Ps SP q`                                             |\n   * | Protection Attribute (DECSCA)    | `DCS $ q \" q ST`  | `Ps \" q` (DECSCA 2 is reported as Ps = 0)             |\n   * | Conformance Level (DECSCL)       | `DCS $ q \" p ST`  | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n   *\n   *\n   * TODO:\n   * - fix SGR report\n   * - either check which conformance is better suited or remove the report completely\n   *   --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n   */\n  public requestStatusString(data: string, params: IParams): boolean {\n    const f = (s: string): boolean => {\n      this._coreService.triggerDataEvent(`${C0.ESC}${s}${C0.ESC}\\\\`);\n      return true;\n    };\n\n    // access helpers\n    const b = this._bufferService.buffer;\n    const opts = this._optionsService.rawOptions;\n    const STYLES: { [key: string]: number } = { 'block': 2, 'underline': 4, 'bar': 6 };\n\n    if (data === '\"q') return f(`P1$r${this._curAttrData.isProtected() ? 1 : 0}\"q`);\n    if (data === '\"p') return f(`P1$r61;1\"p`);\n    if (data === 'r') return f(`P1$r${b.scrollTop + 1};${b.scrollBottom + 1}r`);\n    // FIXME: report real SGR settings instead of 0m\n    if (data === 'm') return f(`P1$r0m`);\n    if (data === ' q') return f(`P1$r${STYLES[opts.cursorStyle] - (opts.cursorBlink ? 1 : 0)} q`);\n    return f(`P0$r`);\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    this._dirtyRowTracker.markRangeDirty(y1, y2);\n  }\n}\n\nexport interface IDirtyRowTracker {\n  readonly start: number;\n  readonly end: number;\n\n  clearRange(): void;\n  markDirty(y: number): void;\n  markRangeDirty(y1: number, y2: number): void;\n  markAllDirty(): void;\n}\n\nclass DirtyRowTracker implements IDirtyRowTracker {\n  public start!: number;\n  public end!: number;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n    this.clearRange();\n  }\n\n  public clearRange(): void {\n    this.start = this._bufferService.buffer.y;\n    this.end = this._bufferService.buffer.y;\n  }\n\n  public markDirty(y: number): void {\n    if (y < this.start) {\n      this.start = y;\n    } else if (y > this.end) {\n      this.end = y;\n    }\n  }\n\n  public markRangeDirty(y1: number, y2: number): void {\n    if (y1 > y2) {\n      $temp = y1;\n      y1 = y2;\n      y2 = $temp;\n    }\n    if (y1 < this.start) {\n      this.start = y1;\n    }\n    if (y2 > this.end) {\n      this.end = y2;\n    }\n  }\n\n  public markAllDirty(): void {\n    this.markRangeDirty(0, this._bufferService.rows - 1);\n  }\n}\n\nfunction isValidColorIndex(value: number): value is ColorIndex {\n  return 0 <= value && value < 256;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n  protected _disposables: IDisposable[] = [];\n  protected _isDisposed: boolean = false;\n\n  /**\n   * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n   */\n  public dispose(): void {\n    this._isDisposed = true;\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n    this._disposables.length = 0;\n  }\n\n  /**\n   * Registers a disposable object.\n   * @param d The disposable to register.\n   * @returns The disposable.\n   */\n  public register<T extends IDisposable>(d: T): T {\n    this._disposables.push(d);\n    return d;\n  }\n\n  /**\n   * Unregisters a disposable object if it has been registered, if not do\n   * nothing.\n   * @param d The disposable to unregister.\n   */\n  public unregister<T extends IDisposable>(d: T): void {\n    const index = this._disposables.indexOf(d);\n    if (index !== -1) {\n      this._disposables.splice(index, 1);\n    }\n  }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n  private _value?: T;\n  private _isDisposed = false;\n\n  /**\n   * Gets the value if it exists.\n   */\n  public get value(): T | undefined {\n    return this._isDisposed ? undefined : this._value;\n  }\n\n  /**\n   * Sets the value, disposing of the old value if it exists.\n   */\n  public set value(value: T | undefined) {\n    if (this._isDisposed || value === this._value) {\n      return;\n    }\n    this._value?.dispose();\n    this._value = value;\n  }\n\n  /**\n   * Resets the stored value and disposes of the previously stored value.\n   */\n  public clear(): void {\n    this.value = undefined;\n  }\n\n  public dispose(): void {\n    this._isDisposed = true;\n    this._value?.dispose();\n    this._value = undefined;\n  }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n  return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n  for (const d of disposables) {\n    d.dispose();\n  }\n  disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n  return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n  private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n  public set(first: TFirst, second: TSecond, value: TValue): void {\n    if (!this._data[first]) {\n      this._data[first] = {};\n    }\n    this._data[first as string | number]![second] = value;\n  }\n\n  public get(first: TFirst, second: TSecond): TValue | undefined {\n    return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n  }\n\n  public clear(): void {\n    this._data = {};\n  }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n  private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n  public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n    if (!this._data.get(first, second)) {\n      this._data.set(first, second, new TwoKeyMap());\n    }\n    this._data.get(first, second)!.set(third, fourth, value);\n  }\n\n  public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n    return this._data.get(first, second)?.get(third, fourth);\n  }\n\n  public clear(): void {\n    this._data.clear();\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n  userAgent: string;\n  language: string;\n  platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nexport const isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n  if (!isSafari) {\n    return 0;\n  }\n  const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n  if (majorVersion === null || majorVersion.length < 2) {\n    return 0;\n  }\n  return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// Work variables to avoid garbage collection.\nlet i = 0;\n\n/**\n * A generic list that is maintained in sorted order and allows values with duplicate keys. This\n * list is based on binary search and as such locating a key will take O(log n) amortized, this\n * includes the by key iterator.\n */\nexport class SortedList<T> {\n  private readonly _array: T[] = [];\n\n  constructor(\n    private readonly _getKey: (value: T) => number\n  ) {\n  }\n\n  public clear(): void {\n    this._array.length = 0;\n  }\n\n  public insert(value: T): void {\n    if (this._array.length === 0) {\n      this._array.push(value);\n      return;\n    }\n    i = this._search(this._getKey(value));\n    this._array.splice(i, 0, value);\n  }\n\n  public delete(value: T): boolean {\n    if (this._array.length === 0) {\n      return false;\n    }\n    const key = this._getKey(value);\n    if (key === undefined) {\n      return false;\n    }\n    i = this._search(key);\n    if (i === -1) {\n      return false;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return false;\n    }\n    do {\n      if (this._array[i] === value) {\n        this._array.splice(i, 1);\n        return true;\n      }\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n    return false;\n  }\n\n  public *getKeyIterator(key: number): IterableIterator<T> {\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      yield this._array[i];\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public forEachByKey(key: number, callback: (value: T) => void): void {\n    if (this._array.length === 0) {\n      return;\n    }\n    i = this._search(key);\n    if (i < 0 || i >= this._array.length) {\n      return;\n    }\n    if (this._getKey(this._array[i]) !== key) {\n      return;\n    }\n    do {\n      callback(this._array[i]);\n    } while (++i < this._array.length && this._getKey(this._array[i]) === key);\n  }\n\n  public values(): IterableIterator<T> {\n    // Duplicate the array to avoid issues when _array changes while iterating\n    return [...this._array].values();\n  }\n\n  private _search(key: number): number {\n    let min = 0;\n    let max = this._array.length - 1;\n    while (max >= min) {\n      let mid = (min + max) >> 1;\n      const midKey = this._getKey(this._array[mid]);\n      if (midKey > key) {\n        max = mid - 1;\n      } else if (midKey < key) {\n        min = mid + 1;\n      } else {\n        // key in list, walk to lowest duplicate\n        while (mid > 0 && this._getKey(this._array[mid - 1]) === key) {\n          mid--;\n        }\n        return mid;\n      }\n    }\n    // key not in list\n    // still return closest min (also used as insert position)\n    return min;\n  }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n  /**\n   * Adds a task to the queue which will run in a future idle callback.\n   * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n   * should split their work into smaller pieces and return `true` to get\n   * called again until the work is done (on falsy return value).\n   */\n  enqueue(task: () => boolean | void): void;\n\n  /**\n   * Flushes the queue, running all remaining tasks synchronously.\n   */\n  flush(): void;\n\n  /**\n   * Clears any remaining tasks from the queue, these will not be run.\n   */\n  clear(): void;\n}\n\ninterface ITaskDeadline {\n  timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n  private _tasks: (() => boolean | void)[] = [];\n  private _idleCallback?: number;\n  private _i = 0;\n\n  protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n  protected abstract _cancelCallback(identifier: number): void;\n\n  public enqueue(task: () => boolean | void): void {\n    this._tasks.push(task);\n    this._start();\n  }\n\n  public flush(): void {\n    while (this._i < this._tasks.length) {\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n    }\n    this.clear();\n  }\n\n  public clear(): void {\n    if (this._idleCallback) {\n      this._cancelCallback(this._idleCallback);\n      this._idleCallback = undefined;\n    }\n    this._i = 0;\n    this._tasks.length = 0;\n  }\n\n  private _start(): void {\n    if (!this._idleCallback) {\n      this._idleCallback = this._requestCallback(this._process.bind(this));\n    }\n  }\n\n  private _process(deadline: ITaskDeadline): void {\n    this._idleCallback = undefined;\n    let taskDuration = 0;\n    let longestTask = 0;\n    let lastDeadlineRemaining = deadline.timeRemaining();\n    let deadlineRemaining = 0;\n    while (this._i < this._tasks.length) {\n      taskDuration = Date.now();\n      if (!this._tasks[this._i]()) {\n        this._i++;\n      }\n      // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n      // this is not an issue here as a clock change during a short running task is very unlikely\n      // in case it still happened and leads to negative duration, simply assume 1 msec\n      taskDuration = Math.max(1, Date.now() - taskDuration);\n      longestTask = Math.max(taskDuration, longestTask);\n      // Guess the following task will take a similar time to the longest task in this batch, allow\n      // additional room to try avoid exceeding the deadline\n      deadlineRemaining = deadline.timeRemaining();\n      if (longestTask * 1.5 > deadlineRemaining) {\n        // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n        // task should be split into sub-tasks to ensure the UI remains responsive.\n        if (lastDeadlineRemaining - taskDuration < -20) {\n          console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n        }\n        this._start();\n        return;\n      }\n      lastDeadlineRemaining = deadlineRemaining;\n    }\n    this.clear();\n  }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n  protected _requestCallback(callback: CallbackWithDeadline): number {\n    return setTimeout(() => callback(this._createDeadline(16)));\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    clearTimeout(identifier);\n  }\n\n  private _createDeadline(duration: number): ITaskDeadline {\n    const end = Date.now() + duration;\n    return {\n      timeRemaining: () => Math.max(0, end - Date.now())\n    };\n  }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n  protected _requestCallback(callback: IdleRequestCallback): number {\n    return requestIdleCallback(callback);\n  }\n\n  protected _cancelCallback(identifier: number): void {\n    cancelIdleCallback(identifier);\n  }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n  private _queue: ITaskQueue;\n\n  constructor() {\n    this._queue = new IdleTaskQueue();\n  }\n\n  public set(task: () => boolean | void): void {\n    this._queue.clear();\n    this._queue.enqueue(task);\n  }\n\n  public flush(): void {\n    this._queue.flush();\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n  // Winpty does not support wraparound mode which means that lines will never\n  // be marked as wrapped. This causes issues for things like copying a line\n  // retaining the wrapped new line characters or if consumers are listening\n  // in on the data stream.\n  //\n  // The workaround for this is to listen to every incoming line feed and mark\n  // the line as wrapped if the last character in the previous line is not a\n  // space. This is certainly not without its problems, but generally on\n  // Windows when text reaches the end of the terminal it's likely going to be\n  // wrapped.\n  const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n  const lastChar = line?.get(bufferService.cols - 1);\n\n  const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n  if (nextLine && lastChar) {\n    nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n  public static toColorRGB(value: number): IColorRGB {\n    return [\n      value >>> Attributes.RED_SHIFT & 255,\n      value >>> Attributes.GREEN_SHIFT & 255,\n      value & 255\n    ];\n  }\n\n  public static fromColorRGB(value: IColorRGB): number {\n    return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n  }\n\n  public clone(): IAttributeData {\n    const newObj = new AttributeData();\n    newObj.fg = this.fg;\n    newObj.bg = this.bg;\n    newObj.extended = this.extended.clone();\n    return newObj;\n  }\n\n  // data\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n\n  // flags\n  public isInverse(): number       { return this.fg & FgFlags.INVERSE; }\n  public isBold(): number          { return this.fg & FgFlags.BOLD; }\n  public isUnderline(): number     {\n    if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n      return 1;\n    }\n    return this.fg & FgFlags.UNDERLINE;\n  }\n  public isBlink(): number         { return this.fg & FgFlags.BLINK; }\n  public isInvisible(): number     { return this.fg & FgFlags.INVISIBLE; }\n  public isItalic(): number        { return this.bg & BgFlags.ITALIC; }\n  public isDim(): number           { return this.bg & BgFlags.DIM; }\n  public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n  public isProtected(): number     { return this.bg & BgFlags.PROTECTED; }\n  public isOverline(): number      { return this.bg & BgFlags.OVERLINE; }\n\n  // color modes\n  public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n  public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n  public isFgRGB(): boolean       { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isBgRGB(): boolean       { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n  public isFgPalette(): boolean   { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isBgPalette(): boolean   { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n  public isFgDefault(): boolean   { return (this.fg & Attributes.CM_MASK) === 0; }\n  public isBgDefault(): boolean   { return (this.bg & Attributes.CM_MASK) === 0; }\n  public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n  // colors\n  public getFgColor(): number {\n    switch (this.fg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.fg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.fg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n  public getBgColor(): number {\n    switch (this.bg & Attributes.CM_MASK) {\n      case Attributes.CM_P16:\n      case Attributes.CM_P256:  return this.bg & Attributes.PCOLOR_MASK;\n      case Attributes.CM_RGB:   return this.bg & Attributes.RGB_MASK;\n      default:                  return -1;  // CM_DEFAULT defaults to -1\n    }\n  }\n\n  // extended attrs\n  public hasExtendedAttrs(): number {\n    return this.bg & BgFlags.HAS_EXTENDED;\n  }\n  public updateExtended(): void {\n    if (this.extended.isEmpty()) {\n      this.bg &= ~BgFlags.HAS_EXTENDED;\n    } else {\n      this.bg |= BgFlags.HAS_EXTENDED;\n    }\n  }\n  public getUnderlineColor(): number {\n    if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n      switch (this.extended.underlineColor & Attributes.CM_MASK) {\n        case Attributes.CM_P16:\n        case Attributes.CM_P256:  return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n        case Attributes.CM_RGB:   return this.extended.underlineColor & Attributes.RGB_MASK;\n        default:                  return this.getFgColor();\n      }\n    }\n    return this.getFgColor();\n  }\n  public getUnderlineColorMode(): number {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? this.extended.underlineColor & Attributes.CM_MASK\n      : this.getFgColorMode();\n  }\n  public isUnderlineColorRGB(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n      : this.isFgRGB();\n  }\n  public isUnderlineColorPalette(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n          || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n      : this.isFgPalette();\n  }\n  public isUnderlineColorDefault(): boolean {\n    return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n      ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n      : this.isFgDefault();\n  }\n  public getUnderlineStyle(): UnderlineStyle {\n    return this.fg & FgFlags.UNDERLINE\n      ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n      : UnderlineStyle.NONE;\n  }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n  private _ext: number = 0;\n  public get ext(): number {\n    if (this._urlId) {\n      return (\n        (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n        (this.underlineStyle << 26)\n      );\n    }\n    return this._ext;\n  }\n  public set ext(value: number) { this._ext = value; }\n\n  public get underlineStyle(): UnderlineStyle {\n    // Always return the URL style if it has one\n    if (this._urlId) {\n      return UnderlineStyle.DASHED;\n    }\n    return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n  }\n  public set underlineStyle(value: UnderlineStyle) {\n    this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n    this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n  }\n\n  public get underlineColor(): number {\n    return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n  public set underlineColor(value: number) {\n    this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n    this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n  }\n\n  private _urlId: number = 0;\n  public get urlId(): number {\n    return this._urlId;\n  }\n  public set urlId(value: number) {\n    this._urlId = value;\n  }\n\n  constructor(\n    ext: number = 0,\n    urlId: number = 0\n  ) {\n    this._ext = ext;\n    this._urlId = urlId;\n  }\n\n  public clone(): IExtendedAttrs {\n    return new ExtendedAttrs(this._ext, this._urlId);\n  }\n\n  /**\n   * Convenient method to indicate whether the object holds no additional information,\n   * that needs to be persistant in the buffer.\n   */\n  public isEmpty(): boolean {\n    return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n  }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IAttributeData, IBufferLine, ICellData, ICharset } from 'common/Types';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { getWrappedLineTrimmedLength, reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths } from 'common/buffer/BufferReflow';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from 'common/buffer/Constants';\nimport { Marker } from 'common/buffer/Marker';\nimport { IBuffer } from 'common/buffer/Types';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n *   - text content of this particular buffer\n *   - cursor position\n *   - scroll position\n */\nexport class Buffer implements IBuffer {\n  public lines: CircularList<IBufferLine>;\n  public ydisp: number = 0;\n  public ybase: number = 0;\n  public y: number = 0;\n  public x: number = 0;\n  public scrollBottom: number;\n  public scrollTop: number;\n  public tabs: { [column: number]: boolean | undefined } = {};\n  public savedY: number = 0;\n  public savedX: number = 0;\n  public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n  public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n  public markers: Marker[] = [];\n  private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n  private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n  private _cols: number;\n  private _rows: number;\n  private _isClearing: boolean = false;\n\n  constructor(\n    private _hasScrollback: boolean,\n    private _optionsService: IOptionsService,\n    private _bufferService: IBufferService\n  ) {\n    this._cols = this._bufferService.cols;\n    this._rows = this._bufferService.rows;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n  }\n\n  public getNullCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._nullCell.fg = attr.fg;\n      this._nullCell.bg = attr.bg;\n      this._nullCell.extended = attr.extended;\n    } else {\n      this._nullCell.fg = 0;\n      this._nullCell.bg = 0;\n      this._nullCell.extended = new ExtendedAttrs();\n    }\n    return this._nullCell;\n  }\n\n  public getWhitespaceCell(attr?: IAttributeData): ICellData {\n    if (attr) {\n      this._whitespaceCell.fg = attr.fg;\n      this._whitespaceCell.bg = attr.bg;\n      this._whitespaceCell.extended = attr.extended;\n    } else {\n      this._whitespaceCell.fg = 0;\n      this._whitespaceCell.bg = 0;\n      this._whitespaceCell.extended = new ExtendedAttrs();\n    }\n    return this._whitespaceCell;\n  }\n\n  public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n    return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n  }\n\n  public get hasScrollback(): boolean {\n    return this._hasScrollback && this.lines.maxLength > this._rows;\n  }\n\n  public get isCursorInViewport(): boolean {\n    const absoluteY = this.ybase + this.y;\n    const relativeY = absoluteY - this.ydisp;\n    return (relativeY >= 0 && relativeY < this._rows);\n  }\n\n  /**\n   * Gets the correct buffer length based on the rows provided, the terminal's\n   * scrollback and whether this buffer is flagged to have scrollback or not.\n   * @param rows The terminal rows to use in the calculation.\n   */\n  private _getCorrectBufferLength(rows: number): number {\n    if (!this._hasScrollback) {\n      return rows;\n    }\n\n    const correctBufferLength = rows + this._optionsService.rawOptions.scrollback;\n\n    return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n  }\n\n  /**\n   * Fills the buffer's viewport with blank lines.\n   */\n  public fillViewportRows(fillAttr?: IAttributeData): void {\n    if (this.lines.length === 0) {\n      if (fillAttr === undefined) {\n        fillAttr = DEFAULT_ATTR_DATA;\n      }\n      let i = this._rows;\n      while (i--) {\n        this.lines.push(this.getBlankLine(fillAttr));\n      }\n    }\n  }\n\n  /**\n   * Clears the buffer to it's initial state, discarding all previous data.\n   */\n  public clear(): void {\n    this.ydisp = 0;\n    this.ybase = 0;\n    this.y = 0;\n    this.x = 0;\n    this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n    this.scrollTop = 0;\n    this.scrollBottom = this._rows - 1;\n    this.setupTabStops();\n  }\n\n  /**\n   * Resizes the buffer, adjusting its data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    // store reference to null cell with default attrs\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n    // count bufferlines with overly big memory to be cleaned afterwards\n    let dirtyMemoryLines = 0;\n\n    // Increase max length if needed before adjustments to allow space to fill\n    // as required.\n    const newMaxLength = this._getCorrectBufferLength(newRows);\n    if (newMaxLength > this.lines.maxLength) {\n      this.lines.maxLength = newMaxLength;\n    }\n\n    // The following adjustments should only happen if the buffer has been\n    // initialized/filled.\n    if (this.lines.length > 0) {\n      // Deal with columns increasing (reducing needs to happen after reflow)\n      if (this._cols < newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n\n      // Resize rows in both directions as needed\n      let addToY = 0;\n      if (this._rows < newRows) {\n        for (let y = this._rows; y < newRows; y++) {\n          if (this.lines.length < newRows + this.ybase) {\n            if (this._optionsService.rawOptions.windowsMode || this._optionsService.rawOptions.windowsPty.backend !== undefined || this._optionsService.rawOptions.windowsPty.buildNumber !== undefined) {\n              // Just add the new missing rows on Windows as conpty reprints the screen with it's\n              // view of the world. Once a line enters scrollback for conpty it remains there\n              this.lines.push(new BufferLine(newCols, nullCell));\n            } else {\n              if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n                // There is room above the buffer and there are no empty elements below the line,\n                // scroll up\n                this.ybase--;\n                addToY++;\n                if (this.ydisp > 0) {\n                  // Viewport is at the top of the buffer, must increase downwards\n                  this.ydisp--;\n                }\n              } else {\n                // Add a blank line if there is no buffer left at the top to scroll to, or if there\n                // are blank lines after the cursor\n                this.lines.push(new BufferLine(newCols, nullCell));\n              }\n            }\n          }\n        }\n      } else { // (this._rows >= newRows)\n        for (let y = this._rows; y > newRows; y--) {\n          if (this.lines.length > newRows + this.ybase) {\n            if (this.lines.length > this.ybase + this.y + 1) {\n              // The line is a blank line below the cursor, remove it\n              this.lines.pop();\n            } else {\n              // The line is the cursor, scroll down\n              this.ybase++;\n              this.ydisp++;\n            }\n          }\n        }\n      }\n\n      // Reduce max length if needed after adjustments, this is done after as it\n      // would otherwise cut data from the bottom of the buffer.\n      if (newMaxLength < this.lines.maxLength) {\n        // Trim from the top of the buffer and adjust ybase and ydisp.\n        const amountToTrim = this.lines.length - newMaxLength;\n        if (amountToTrim > 0) {\n          this.lines.trimStart(amountToTrim);\n          this.ybase = Math.max(this.ybase - amountToTrim, 0);\n          this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n          this.savedY = Math.max(this.savedY - amountToTrim, 0);\n        }\n        this.lines.maxLength = newMaxLength;\n      }\n\n      // Make sure that the cursor stays on screen\n      this.x = Math.min(this.x, newCols - 1);\n      this.y = Math.min(this.y, newRows - 1);\n      if (addToY) {\n        this.y += addToY;\n      }\n      this.savedX = Math.min(this.savedX, newCols - 1);\n\n      this.scrollTop = 0;\n    }\n\n    this.scrollBottom = newRows - 1;\n\n    if (this._isReflowEnabled) {\n      this._reflow(newCols, newRows);\n\n      // Trim the end of the line off if cols shrunk\n      if (this._cols > newCols) {\n        for (let i = 0; i < this.lines.length; i++) {\n          // +boolean for fast 0 or 1 conversion\n          dirtyMemoryLines += +this.lines.get(i)!.resize(newCols, nullCell);\n        }\n      }\n    }\n\n    this._cols = newCols;\n    this._rows = newRows;\n\n    this._memoryCleanupQueue.clear();\n    // schedule memory cleanup only, if more than 10% of the lines are affected\n    if (dirtyMemoryLines > 0.1 * this.lines.length) {\n      this._memoryCleanupPosition = 0;\n      this._memoryCleanupQueue.enqueue(() => this._batchedMemoryCleanup());\n    }\n  }\n\n  private _memoryCleanupQueue = new IdleTaskQueue();\n  private _memoryCleanupPosition = 0;\n\n  private _batchedMemoryCleanup(): boolean {\n    let normalRun = true;\n    if (this._memoryCleanupPosition >= this.lines.length) {\n      // cleanup made it once through all lines, thus rescan in loop below to also catch shifted\n      // lines, which should finish rather quick if there are no more cleanups pending\n      this._memoryCleanupPosition = 0;\n      normalRun = false;\n    }\n    let counted = 0;\n    while (this._memoryCleanupPosition < this.lines.length) {\n      counted += this.lines.get(this._memoryCleanupPosition++)!.cleanupMemory();\n      // cleanup max 100 lines per batch\n      if (counted > 100) {\n        return true;\n      }\n    }\n    // normal runs always need another rescan afterwards\n    // if we made it here with normalRun=false, we are in a final run\n    // and can end the cleanup task for sure\n    return normalRun;\n  }\n\n  private get _isReflowEnabled(): boolean {\n    const windowsPty = this._optionsService.rawOptions.windowsPty;\n    if (windowsPty && windowsPty.buildNumber) {\n      return this._hasScrollback && windowsPty.backend === 'conpty' && windowsPty.buildNumber >= 21376;\n    }\n    return this._hasScrollback && !this._optionsService.rawOptions.windowsMode;\n  }\n\n  private _reflow(newCols: number, newRows: number): void {\n    if (this._cols === newCols) {\n      return;\n    }\n\n    // Iterate through rows, ignore the last one as it cannot be wrapped\n    if (newCols > this._cols) {\n      this._reflowLarger(newCols, newRows);\n    } else {\n      this._reflowSmaller(newCols, newRows);\n    }\n  }\n\n  private _reflowLarger(newCols: number, newRows: number): void {\n    const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));\n    if (toRemove.length > 0) {\n      const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n      reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n      this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n    }\n  }\n\n  private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Adjust viewport based on number of items removed\n    let viewportAdjustments = countRemoved;\n    while (viewportAdjustments-- > 0) {\n      if (this.ybase === 0) {\n        if (this.y > 0) {\n          this.y--;\n        }\n        if (this.lines.length < newRows) {\n          // Add an extra row at the bottom of the viewport\n          this.lines.push(new BufferLine(newCols, nullCell));\n        }\n      } else {\n        if (this.ydisp === this.ybase) {\n          this.ydisp--;\n        }\n        this.ybase--;\n      }\n    }\n    this.savedY = Math.max(this.savedY - countRemoved, 0);\n  }\n\n  private _reflowSmaller(newCols: number, newRows: number): void {\n    const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n    // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n    // batched up and only committed once\n    const toInsert = [];\n    let countToInsert = 0;\n    // Go backwards as many lines may be trimmed and this will avoid considering them\n    for (let y = this.lines.length - 1; y >= 0; y--) {\n      // Check whether this line is a problem\n      let nextLine = this.lines.get(y) as BufferLine;\n      if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n        continue;\n      }\n\n      // Gather wrapped lines and adjust y to be the starting line\n      const wrappedLines: BufferLine[] = [nextLine];\n      while (nextLine.isWrapped && y > 0) {\n        nextLine = this.lines.get(--y) as BufferLine;\n        wrappedLines.unshift(nextLine);\n      }\n\n      // If these lines contain the cursor don't touch them, the program will handle fixing up\n      // wrapped lines with the cursor\n      const absoluteY = this.ybase + this.y;\n      if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n        continue;\n      }\n\n      const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n      const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n      const linesToAdd = destLineLengths.length - wrappedLines.length;\n      let trimmedLines: number;\n      if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n        // If the top section of the buffer is not yet filled\n        trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n      } else {\n        trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n      }\n\n      // Add the new lines\n      const newLines: BufferLine[] = [];\n      for (let i = 0; i < linesToAdd; i++) {\n        const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n        newLines.push(newLine);\n      }\n      if (newLines.length > 0) {\n        toInsert.push({\n          // countToInsert here gets the actual index, taking into account other inserted items.\n          // using this we can iterate through the list forwards\n          start: y + wrappedLines.length + countToInsert,\n          newLines\n        });\n        countToInsert += newLines.length;\n      }\n      wrappedLines.push(...newLines);\n\n      // Copy buffer data to new locations, this needs to happen backwards to do in-place\n      let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n      let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n      if (destCol === 0) {\n        destLineIndex--;\n        destCol = destLineLengths[destLineIndex];\n      }\n      let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n      let srcCol = lastLineLength;\n      while (srcLineIndex >= 0) {\n        const cellsToCopy = Math.min(srcCol, destCol);\n        if (wrappedLines[destLineIndex] === undefined) {\n          // Sanity check that the line exists, this has been known to fail for an unknown reason\n          // which would stop the reflow from happening if an exception would throw.\n          break;\n        }\n        wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n        destCol -= cellsToCopy;\n        if (destCol === 0) {\n          destLineIndex--;\n          destCol = destLineLengths[destLineIndex];\n        }\n        srcCol -= cellsToCopy;\n        if (srcCol === 0) {\n          srcLineIndex--;\n          const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n          srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n        }\n      }\n\n      // Null out the end of the line ends if a wide character wrapped to the following line\n      for (let i = 0; i < wrappedLines.length; i++) {\n        if (destLineLengths[i] < newCols) {\n          wrappedLines[i].setCell(destLineLengths[i], nullCell);\n        }\n      }\n\n      // Adjust viewport as needed\n      let viewportAdjustments = linesToAdd - trimmedLines;\n      while (viewportAdjustments-- > 0) {\n        if (this.ybase === 0) {\n          if (this.y < newRows - 1) {\n            this.y++;\n            this.lines.pop();\n          } else {\n            this.ybase++;\n            this.ydisp++;\n          }\n        } else {\n          // Ensure ybase does not exceed its maximum value\n          if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n            if (this.ybase === this.ydisp) {\n              this.ydisp++;\n            }\n            this.ybase++;\n          }\n        }\n      }\n      this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n    }\n\n    // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n    // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n    // costly calls to CircularList.splice.\n    if (toInsert.length > 0) {\n      // Record buffer insert events and then play them back backwards so that the indexes are\n      // correct\n      const insertEvents: IInsertEvent[] = [];\n\n      // Record original lines so they don't get overridden when we rearrange the list\n      const originalLines: BufferLine[] = [];\n      for (let i = 0; i < this.lines.length; i++) {\n        originalLines.push(this.lines.get(i) as BufferLine);\n      }\n      const originalLinesLength = this.lines.length;\n\n      let originalLineIndex = originalLinesLength - 1;\n      let nextToInsertIndex = 0;\n      let nextToInsert = toInsert[nextToInsertIndex];\n      this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n      let countInsertedSoFar = 0;\n      for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n        if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n          // Insert extra lines here, adjusting i as needed\n          for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n            this.lines.set(i--, nextToInsert.newLines[nextI]);\n          }\n          i++;\n\n          // Create insert events for later\n          insertEvents.push({\n            index: originalLineIndex + 1,\n            amount: nextToInsert.newLines.length\n          });\n\n          countInsertedSoFar += nextToInsert.newLines.length;\n          nextToInsert = toInsert[++nextToInsertIndex];\n        } else {\n          this.lines.set(i, originalLines[originalLineIndex--]);\n        }\n      }\n\n      // Update markers\n      let insertCountEmitted = 0;\n      for (let i = insertEvents.length - 1; i >= 0; i--) {\n        insertEvents[i].index += insertCountEmitted;\n        this.lines.onInsertEmitter.fire(insertEvents[i]);\n        insertCountEmitted += insertEvents[i].amount;\n      }\n      const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n      if (amountToTrim > 0) {\n        this.lines.onTrimEmitter.fire(amountToTrim);\n      }\n    }\n  }\n\n  /**\n   * Translates a buffer line to a string, with optional start and end columns.\n   * Wide characters will count as two columns in the resulting string. This\n   * function is useful for getting the actual text underneath the raw selection\n   * position.\n   * @param lineIndex The absolute index of the line being translated.\n   * @param trimRight Whether to trim whitespace to the right.\n   * @param startCol The column to start at.\n   * @param endCol The column to end at.\n   */\n  public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n    const line = this.lines.get(lineIndex);\n    if (!line) {\n      return '';\n    }\n    return line.translateToString(trimRight, startCol, endCol);\n  }\n\n  public getWrappedRangeForLine(y: number): { first: number, last: number } {\n    let first = y;\n    let last = y;\n    // Scan upwards for wrapped lines\n    while (first > 0 && this.lines.get(first)!.isWrapped) {\n      first--;\n    }\n    // Scan downwards for wrapped lines\n    while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n      last++;\n    }\n    return { first, last };\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    if (i !== null && i !== undefined) {\n      if (!this.tabs[i]) {\n        i = this.prevStop(i);\n      }\n    } else {\n      this.tabs = {};\n      i = 0;\n    }\n\n    for (; i < this._cols; i += this._optionsService.rawOptions.tabStopWidth) {\n      this.tabs[i] = true;\n    }\n  }\n\n  /**\n   * Move the cursor to the previous tab stop from the given position (default is current).\n   * @param x The position to move the cursor to the previous tab stop.\n   */\n  public prevStop(x?: number): number {\n    if (x === null || x === undefined) {\n      x = this.x;\n    }\n    while (!this.tabs[--x] && x > 0);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Move the cursor one tab stop forward from the given position (default is current).\n   * @param x The position to move the cursor one tab stop forward.\n   */\n  public nextStop(x?: number): number {\n    if (x === null || x === undefined) {\n      x = this.x;\n    }\n    while (!this.tabs[++x] && x < this._cols);\n    return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n  }\n\n  /**\n   * Clears markers on single line.\n   * @param y The line to clear.\n   */\n  public clearMarkers(y: number): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      if (this.markers[i].line === y) {\n        this.markers[i].dispose();\n        this.markers.splice(i--, 1);\n      }\n    }\n    this._isClearing = false;\n  }\n\n  /**\n   * Clears markers on all lines\n   */\n  public clearAllMarkers(): void {\n    this._isClearing = true;\n    for (let i = 0; i < this.markers.length; i++) {\n      this.markers[i].dispose();\n      this.markers.splice(i--, 1);\n    }\n    this._isClearing = false;\n  }\n\n  public addMarker(y: number): Marker {\n    const marker = new Marker(y);\n    this.markers.push(marker);\n    marker.register(this.lines.onTrim(amount => {\n      marker.line -= amount;\n      // The marker should be disposed when the line is trimmed from the buffer\n      if (marker.line < 0) {\n        marker.dispose();\n      }\n    }));\n    marker.register(this.lines.onInsert(event => {\n      if (marker.line >= event.index) {\n        marker.line += event.amount;\n      }\n    }));\n    marker.register(this.lines.onDelete(event => {\n      // Delete the marker if it's within the range\n      if (marker.line >= event.index && marker.line < event.index + event.amount) {\n        marker.dispose();\n      }\n\n      // Shift the marker if it's after the deleted range\n      if (marker.line > event.index) {\n        marker.line -= event.amount;\n      }\n    }));\n    marker.register(marker.onDispose(() => this._removeMarker(marker)));\n    return marker;\n  }\n\n  private _removeMarker(marker: Marker): void {\n    if (!this._isClearing) {\n      this.markers.splice(this.markers.indexOf(marker), 1);\n    }\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from 'common/Types';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\n\n/**\n * buffer memory layout:\n *\n *   |             uint32_t             |        uint32_t         |        uint32_t         |\n *   |             `content`            |          `FG`           |          `BG`           |\n *   | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n *    `content = data[column * CELL_SIZE + Cell.CONTENT];`\n *    `fg = data[column * CELL_SIZE + Cell.FG];`\n *    `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n  CONTENT = 0,\n  FG = 1, // currently simply holds all known attrs\n  BG = 2  // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n// Work variables to avoid garbage collection\nlet $startIndex = 0;\n\n/** Factor when to cleanup underlying array buffer after shrinking. */\nconst CLEANUP_THRESHOLD = 2;\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n *   Use these for data that is already UTF32.\n *   Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n *   This method takes a CellData object and stores the data in the buffer.\n *   Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n  protected _data: Uint32Array;\n  protected _combined: {[index: number]: string} = {};\n  protected _extendedAttrs: {[index: number]: IExtendedAttrs | undefined} = {};\n  public length: number;\n\n  constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n    this._data = new Uint32Array(cols * CELL_SIZE);\n    const cell = fillCellData || CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n    for (let i = 0; i < cols; ++i) {\n      this.setCell(i, cell);\n    }\n    this.length = cols;\n  }\n\n  /**\n   * Get cell data CharData.\n   * @deprecated\n   */\n  public get(index: number): CharData {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    const cp = content & Content.CODEPOINT_MASK;\n    return [\n      this._data[index * CELL_SIZE + Cell.FG],\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index]\n        : (cp) ? stringFromCodePoint(cp) : '',\n      content >> Content.WIDTH_SHIFT,\n      (content & Content.IS_COMBINED_MASK)\n        ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n        : cp\n    ];\n  }\n\n  /**\n   * Set cell data from CharData.\n   * @deprecated\n   */\n  public set(index: number, value: CharData): void {\n    this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n    if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n      this._combined[index] = value[1];\n      this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    } else {\n      this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n\n  /**\n   * primitive getters\n   * use these when only one value is needed, otherwise use `loadCell`\n   */\n  public getWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n  }\n\n  /** Test whether content has width. */\n  public hasWidth(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n  }\n\n  /** Get FG cell component. */\n  public getFg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.FG];\n  }\n\n  /** Get BG cell component. */\n  public getBg(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG];\n  }\n\n  /**\n   * Test whether contains any chars.\n   * Basically an empty has no content, but other cells might differ in FG/BG\n   * from real empty cells.\n   */\n  public hasContent(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n  }\n\n  /**\n   * Get codepoint of the cell.\n   * To be in line with `code` in CharData this either returns\n   * a single UTF32 codepoint or the last codepoint of a combined string.\n   */\n  public getCodePoint(index: number): number {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index].charCodeAt(this._combined[index].length - 1);\n    }\n    return content & Content.CODEPOINT_MASK;\n  }\n\n  /** Test whether the cell contains a combined string. */\n  public isCombined(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n  }\n\n  /** Returns the string content of the cell. */\n  public getString(index: number): string {\n    const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      return this._combined[index];\n    }\n    if (content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n    }\n    // return empty string for empty cells\n    return '';\n  }\n\n  /** Get state of protected flag. */\n  public isProtected(index: number): number {\n    return this._data[index * CELL_SIZE + Cell.BG] & BgFlags.PROTECTED;\n  }\n\n  /**\n   * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n   * to GC as it significantly reduced the amount of new objects/references needed.\n   */\n  public loadCell(index: number, cell: ICellData): ICellData {\n    $startIndex = index * CELL_SIZE;\n    cell.content = this._data[$startIndex + Cell.CONTENT];\n    cell.fg = this._data[$startIndex + Cell.FG];\n    cell.bg = this._data[$startIndex + Cell.BG];\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      cell.combinedData = this._combined[index];\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      cell.extended = this._extendedAttrs[index]!;\n    }\n    return cell;\n  }\n\n  /**\n   * Set data at `index` to `cell`.\n   */\n  public setCell(index: number, cell: ICellData): void {\n    if (cell.content & Content.IS_COMBINED_MASK) {\n      this._combined[index] = cell.combinedData;\n    }\n    if (cell.bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = cell.extended;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n    this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n    this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n  }\n\n  /**\n   * Set cell data from input handler.\n   * Since the input handler see the incoming chars as UTF32 codepoints,\n   * it gets an optimized access method.\n   */\n  public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void {\n    if (bg & BgFlags.HAS_EXTENDED) {\n      this._extendedAttrs[index] = eAttrs;\n    }\n    this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n    this._data[index * CELL_SIZE + Cell.FG] = fg;\n    this._data[index * CELL_SIZE + Cell.BG] = bg;\n  }\n\n  /**\n   * Add a codepoint to a cell from input handler.\n   * During input stage combining chars with a width of 0 follow and stack\n   * onto a leading char. Since we already set the attrs\n   * by the previous `setDataFromCodePoint` call, we can omit it here.\n   */\n  public addCodepointToCell(index: number, codePoint: number): void {\n    let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n    if (content & Content.IS_COMBINED_MASK) {\n      // we already have a combined string, simply add\n      this._combined[index] += stringFromCodePoint(codePoint);\n    } else {\n      if (content & Content.CODEPOINT_MASK) {\n        // normal case for combining chars:\n        //  - move current leading char + new one into combined string\n        //  - set combined flag\n        this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n        content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n        content |= Content.IS_COMBINED_MASK;\n      } else {\n        // should not happen - we actually have no data in the cell yet\n        // simply set the data in the cell buffer with a width of 1\n        content = codePoint | (1 << Content.WIDTH_SHIFT);\n      }\n      this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n    }\n  }\n\n  public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n    pos %= this.length;\n\n    // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n\n    if (n < this.length - pos) {\n      const cell = new CellData();\n      for (let i = this.length - pos - n - 1; i >= 0; --i) {\n        this.setCell(pos + n + i, this.loadCell(pos + i, cell));\n      }\n      for (let i = 0; i < n; ++i) {\n        this.setCell(pos + i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n    if (this.getWidth(this.length - 1) === 2) {\n      this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n  }\n\n  public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n    pos %= this.length;\n    if (n < this.length - pos) {\n      const cell = new CellData();\n      for (let i = 0; i < this.length - pos - n; ++i) {\n        this.setCell(pos + i, this.loadCell(pos + n + i, cell));\n      }\n      for (let i = this.length - n; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      for (let i = pos; i < this.length; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    }\n\n    // handle fullwidth at pos:\n    // - reset pos-1 if wide char\n    // - reset pos if width==0 (previous second cell of a wide char)\n    if (pos && this.getWidth(pos - 1) === 2) {\n      this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n    if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n      this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n  }\n\n  public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) {\n        this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n      }\n      if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) {\n        this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n      }\n      while (start < end  && start < this.length) {\n        if (!this.isProtected(start)) {\n          this.setCell(start, fillCellData);\n        }\n        start++;\n      }\n      return;\n    }\n\n    // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n    if (start && this.getWidth(start - 1) === 2) {\n      this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n    // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n    if (end < this.length && this.getWidth(end - 1) === 2) {\n      this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n    }\n\n    while (start < end  && start < this.length) {\n      this.setCell(start++, fillCellData);\n    }\n  }\n\n  /**\n   * Resize BufferLine to `cols` filling excess cells with `fillCellData`.\n   * The underlying array buffer will not change if there is still enough space\n   * to hold the new buffer line data.\n   * Returns a boolean indicating, whether a `cleanupMemory` call would free\n   * excess memory (true after shrinking > CLEANUP_THRESHOLD).\n   */\n  public resize(cols: number, fillCellData: ICellData): boolean {\n    if (cols === this.length) {\n      return this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n    }\n    const uint32Cells = cols * CELL_SIZE;\n    if (cols > this.length) {\n      if (this._data.buffer.byteLength >= uint32Cells * 4) {\n        // optimization: avoid alloc and data copy if buffer has enough room\n        this._data = new Uint32Array(this._data.buffer, 0, uint32Cells);\n      } else {\n        // slow path: new alloc and full data copy\n        const data = new Uint32Array(uint32Cells);\n        data.set(this._data);\n        this._data = data;\n      }\n      for (let i = this.length; i < cols; ++i) {\n        this.setCell(i, fillCellData);\n      }\n    } else {\n      // optimization: just shrink the view on existing buffer\n      this._data = this._data.subarray(0, uint32Cells);\n      // Remove any cut off combined data\n      const keys = Object.keys(this._combined);\n      for (let i = 0; i < keys.length; i++) {\n        const key = parseInt(keys[i], 10);\n        if (key >= cols) {\n          delete this._combined[key];\n        }\n      }\n      // remove any cut off extended attributes\n      const extKeys = Object.keys(this._extendedAttrs);\n      for (let i = 0; i < extKeys.length; i++) {\n        const key = parseInt(extKeys[i], 10);\n        if (key >= cols) {\n          delete this._extendedAttrs[key];\n        }\n      }\n    }\n    this.length = cols;\n    return uint32Cells * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength;\n  }\n\n  /**\n   * Cleanup underlying array buffer.\n   * A cleanup will be triggered if the array buffer exceeds the actual used\n   * memory by a factor of CLEANUP_THRESHOLD.\n   * Returns 0 or 1 indicating whether a cleanup happened.\n   */\n  public cleanupMemory(): number {\n    if (this._data.length * 4 * CLEANUP_THRESHOLD < this._data.buffer.byteLength) {\n      const data = new Uint32Array(this._data.length);\n      data.set(this._data);\n      this._data = data;\n      return 1;\n    }\n    return 0;\n  }\n\n  /** fill a line with fillCharData */\n  public fill(fillCellData: ICellData, respectProtect: boolean = false): void {\n    // full branching on respectProtect==true, hopefully getting fast JIT for standard case\n    if (respectProtect) {\n      for (let i = 0; i < this.length; ++i) {\n        if (!this.isProtected(i)) {\n          this.setCell(i, fillCellData);\n        }\n      }\n      return;\n    }\n    this._combined = {};\n    this._extendedAttrs = {};\n    for (let i = 0; i < this.length; ++i) {\n      this.setCell(i, fillCellData);\n    }\n  }\n\n  /** alter to a full copy of line  */\n  public copyFrom(line: BufferLine): void {\n    if (this.length !== line.length) {\n      this._data = new Uint32Array(line._data);\n    } else {\n      // use high speed copy if lengths are equal\n      this._data.set(line._data);\n    }\n    this.length = line.length;\n    this._combined = {};\n    for (const el in line._combined) {\n      this._combined[el] = line._combined[el];\n    }\n    this._extendedAttrs = {};\n    for (const el in line._extendedAttrs) {\n      this._extendedAttrs[el] = line._extendedAttrs[el];\n    }\n    this.isWrapped = line.isWrapped;\n  }\n\n  /** create a new clone */\n  public clone(): IBufferLine {\n    const newLine = new BufferLine(0);\n    newLine._data = new Uint32Array(this._data);\n    newLine.length = this.length;\n    for (const el in this._combined) {\n      newLine._combined[el] = this._combined[el];\n    }\n    for (const el in this._extendedAttrs) {\n      newLine._extendedAttrs[el] = this._extendedAttrs[el];\n    }\n    newLine.isWrapped = this.isWrapped;\n    return newLine;\n  }\n\n  public getTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public getNoBgTrimmedLength(): number {\n    for (let i = this.length - 1; i >= 0; --i) {\n      if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK) || (this._data[i * CELL_SIZE + Cell.BG] & Attributes.CM_MASK)) {\n        return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n      }\n    }\n    return 0;\n  }\n\n  public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n    const srcData = src._data;\n    if (applyInReverse) {\n      for (let cell = length - 1; cell >= 0; cell--) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    } else {\n      for (let cell = 0; cell < length; cell++) {\n        for (let i = 0; i < CELL_SIZE; i++) {\n          this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n        }\n        if (srcData[(srcCol + cell) * CELL_SIZE + Cell.BG] & BgFlags.HAS_EXTENDED) {\n          this._extendedAttrs[destCol + cell] = src._extendedAttrs[srcCol + cell];\n        }\n      }\n    }\n\n    // Move any combined data over as needed, FIXME: repeat for extended attrs\n    const srcCombinedKeys = Object.keys(src._combined);\n    for (let i = 0; i < srcCombinedKeys.length; i++) {\n      const key = parseInt(srcCombinedKeys[i], 10);\n      if (key >= srcCol) {\n        this._combined[key - srcCol + destCol] = src._combined[key];\n      }\n    }\n  }\n\n  public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {\n    if (trimRight) {\n      endCol = Math.min(endCol, this.getTrimmedLength());\n    }\n    let result = '';\n    while (startCol < endCol) {\n      const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n      const cp = content & Content.CODEPOINT_MASK;\n      result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n      startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1\n    }\n    return result;\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferRange } from 'xterm';\n\nexport function getRangeLength(range: IBufferRange, bufferCols: number): number {\n  if (range.start.y > range.end.y) {\n    throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`);\n  }\n  return bufferCols * (range.end.y - range.start.y) + (range.end.x - range.start.x + 1);\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n  layout: number[];\n  countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param oldCols The columns before resize\n * @param newCols The columns after resize.\n * @param bufferAbsoluteY The absolute y position of the cursor (baseY + cursorY).\n * @param nullCell The cell data to use when filling in empty cells.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {\n  // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n  // batched up and only committed once\n  const toRemove: number[] = [];\n\n  for (let y = 0; y < lines.length - 1; y++) {\n    // Check if this row is wrapped\n    let i = y;\n    let nextLine = lines.get(++i) as BufferLine;\n    if (!nextLine.isWrapped) {\n      continue;\n    }\n\n    // Check how many lines it's wrapped for\n    const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n    while (i < lines.length && nextLine.isWrapped) {\n      wrappedLines.push(nextLine);\n      nextLine = lines.get(++i) as BufferLine;\n    }\n\n    // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped\n    // lines with the cursor\n    if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n      y += wrappedLines.length - 1;\n      continue;\n    }\n\n    // Copy buffer data to new locations\n    let destLineIndex = 0;\n    let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n    let srcLineIndex = 1;\n    let srcCol = 0;\n    while (srcLineIndex < wrappedLines.length) {\n      const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n      const srcRemainingCells = srcTrimmedTineLength - srcCol;\n      const destRemainingCells = newCols - destCol;\n      const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n      wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n      destCol += cellsToCopy;\n      if (destCol === newCols) {\n        destLineIndex++;\n        destCol = 0;\n      }\n      srcCol += cellsToCopy;\n      if (srcCol === srcTrimmedTineLength) {\n        srcLineIndex++;\n        srcCol = 0;\n      }\n\n      // Make sure the last cell isn't wide, if it is copy it to the current dest\n      if (destCol === 0 && destLineIndex !== 0) {\n        if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n          wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n          // Null out the end of the last row\n          wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n        }\n      }\n    }\n\n    // Clear out remaining cells or fragments could remain;\n    wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n    // Work backwards and remove any rows at the end that only contain null cells\n    let countToRemove = 0;\n    for (let i = wrappedLines.length - 1; i > 0; i--) {\n      if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n        countToRemove++;\n      } else {\n        break;\n      }\n    }\n\n    if (countToRemove > 0) {\n      toRemove.push(y + wrappedLines.length - countToRemove); // index\n      toRemove.push(countToRemove);\n    }\n\n    y += wrappedLines.length - 1;\n  }\n  return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n  const layout: number[] = [];\n  // First iterate through the list and get the actual indexes to use for rows\n  let nextToRemoveIndex = 0;\n  let nextToRemoveStart = toRemove[nextToRemoveIndex];\n  let countRemovedSoFar = 0;\n  for (let i = 0; i < lines.length; i++) {\n    if (nextToRemoveStart === i) {\n      const countToRemove = toRemove[++nextToRemoveIndex];\n\n      // Tell markers that there was a deletion\n      lines.onDeleteEmitter.fire({\n        index: i - countRemovedSoFar,\n        amount: countToRemove\n      });\n\n      i += countToRemove - 1;\n      countRemovedSoFar += countToRemove;\n      nextToRemoveStart = toRemove[++nextToRemoveIndex];\n    } else {\n      layout.push(i);\n    }\n  }\n  return {\n    layout,\n    countRemoved: countRemovedSoFar\n  };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n  // Record original lines so they don't get overridden when we rearrange the list\n  const newLayoutLines: BufferLine[] = [];\n  for (let i = 0; i < newLayout.length; i++) {\n    newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n  }\n\n  // Rearrange the list\n  for (let i = 0; i < newLayoutLines.length; i++) {\n    lines.set(i, newLayoutLines[i]);\n  }\n  lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n  const newLineLengths: number[] = [];\n  const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n  // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n  // linesNeeded\n  let srcCol = 0;\n  let srcLine = 0;\n  let cellsAvailable = 0;\n  while (cellsAvailable < cellsNeeded) {\n    if (cellsNeeded - cellsAvailable < newCols) {\n      // Add the final line and exit the loop\n      newLineLengths.push(cellsNeeded - cellsAvailable);\n      break;\n    }\n    srcCol += newCols;\n    const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n    if (srcCol > oldTrimmedLength) {\n      srcCol -= oldTrimmedLength;\n      srcLine++;\n    }\n    const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n    if (endsWithWide) {\n      srcCol--;\n    }\n    const lineLength = endsWithWide ? newCols - 1 : newCols;\n    newLineLengths.push(lineLength);\n    cellsAvailable += lineLength;\n  }\n\n  return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n  // If this is the last row in the wrapped line, get the actual trimmed length\n  if (i === lines.length - 1) {\n    return lines[i].getTrimmedLength();\n  }\n  // Detect whether the following line starts with a wide character and the end of the current line\n  // is null, if so then we can be pretty sure the null character should be excluded from the line\n  // length]\n  const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n  const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n  if (endsInNull && followingLineStartsWithWide) {\n    return cols - 1;\n  }\n  return cols;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n  private _normal!: Buffer;\n  private _alt!: Buffer;\n  private _activeBuffer!: Buffer;\n\n  private readonly _onBufferActivate = this.register(new EventEmitter<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}>());\n  public readonly onBufferActivate = this._onBufferActivate.event;\n\n  /**\n   * Create a new BufferSet for the given terminal.\n   */\n  constructor(\n    private readonly _optionsService: IOptionsService,\n    private readonly _bufferService: IBufferService\n  ) {\n    super();\n    this.reset();\n    this.register(this._optionsService.onSpecificOptionChange('scrollback', () => this.resize(this._bufferService.cols, this._bufferService.rows)));\n    this.register(this._optionsService.onSpecificOptionChange('tabStopWidth', () => this.setupTabStops()));\n  }\n\n  public reset(): void {\n    this._normal = new Buffer(true, this._optionsService, this._bufferService);\n    this._normal.fillViewportRows();\n\n    // The alt buffer should never have scrollback.\n    // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n    this._alt = new Buffer(false, this._optionsService, this._bufferService);\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n\n    this.setupTabStops();\n  }\n\n  /**\n   * Returns the alt Buffer of the BufferSet\n   */\n  public get alt(): Buffer {\n    return this._alt;\n  }\n\n  /**\n   * Returns the currently active Buffer of the BufferSet\n   */\n  public get active(): Buffer {\n    return this._activeBuffer;\n  }\n\n  /**\n   * Returns the normal Buffer of the BufferSet\n   */\n  public get normal(): Buffer {\n    return this._normal;\n  }\n\n  /**\n   * Sets the normal Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateNormalBuffer(): void {\n    if (this._activeBuffer === this._normal) {\n      return;\n    }\n    this._normal.x = this._alt.x;\n    this._normal.y = this._alt.y;\n    // The alt buffer should always be cleared when we switch to the normal\n    // buffer. This frees up memory since the alt buffer should always be new\n    // when activated.\n    this._alt.clearAllMarkers();\n    this._alt.clear();\n    this._activeBuffer = this._normal;\n    this._onBufferActivate.fire({\n      activeBuffer: this._normal,\n      inactiveBuffer: this._alt\n    });\n  }\n\n  /**\n   * Sets the alt Buffer of the BufferSet as its currently active Buffer\n   */\n  public activateAltBuffer(fillAttr?: IAttributeData): void {\n    if (this._activeBuffer === this._alt) {\n      return;\n    }\n    // Since the alt buffer is always cleared when the normal buffer is\n    // activated, we want to fill it when switching to it.\n    this._alt.fillViewportRows(fillAttr);\n    this._alt.x = this._normal.x;\n    this._alt.y = this._normal.y;\n    this._activeBuffer = this._alt;\n    this._onBufferActivate.fire({\n      activeBuffer: this._alt,\n      inactiveBuffer: this._normal\n    });\n  }\n\n  /**\n   * Resizes both normal and alt buffers, adjusting their data accordingly.\n   * @param newCols The new number of columns.\n   * @param newRows The new number of rows.\n   */\n  public resize(newCols: number, newRows: number): void {\n    this._normal.resize(newCols, newRows);\n    this._alt.resize(newCols, newRows);\n    this.setupTabStops(newCols);\n  }\n\n  /**\n   * Setup the tab stops.\n   * @param i The index to start setting up tab stops from.\n   */\n  public setupTabStops(i?: number): void {\n    this._normal.setupTabStops(i);\n    this._alt.setupTabStops(i);\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n  /** Helper to create CellData from CharData. */\n  public static fromCharData(value: CharData): CellData {\n    const obj = new CellData();\n    obj.setFromCharData(value);\n    return obj;\n  }\n  /** Primitives from terminal buffer. */\n  public content = 0;\n  public fg = 0;\n  public bg = 0;\n  public extended: IExtendedAttrs = new ExtendedAttrs();\n  public combinedData = '';\n  /** Whether cell contains a combined string. */\n  public isCombined(): number {\n    return this.content & Content.IS_COMBINED_MASK;\n  }\n  /** Width of the cell. */\n  public getWidth(): number {\n    return this.content >> Content.WIDTH_SHIFT;\n  }\n  /** JS string of the content. */\n  public getChars(): string {\n    if (this.content & Content.IS_COMBINED_MASK) {\n      return this.combinedData;\n    }\n    if (this.content & Content.CODEPOINT_MASK) {\n      return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n    }\n    return '';\n  }\n  /**\n   * Codepoint of cell\n   * Note this returns the UTF32 codepoint of single chars,\n   * if content is a combined string it returns the codepoint\n   * of the last char in string to be in line with code in CharData.\n   */\n  public getCode(): number {\n    return (this.isCombined())\n      ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n      : this.content & Content.CODEPOINT_MASK;\n  }\n  /** Set data from CharData */\n  public setFromCharData(value: CharData): void {\n    this.fg = value[CHAR_DATA_ATTR_INDEX];\n    this.bg = 0;\n    let combined = false;\n    // surrogates and combined strings need special treatment\n    if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n      combined = true;\n    }\n    else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n      const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n      // if the 2-char string is a surrogate create single codepoint\n      // everything else is combined\n      if (0xD800 <= code && code <= 0xDBFF) {\n        const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n        }\n        else {\n          combined = true;\n        }\n      }\n      else {\n        combined = true;\n      }\n    }\n    else {\n      this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n    if (combined) {\n      this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n      this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n    }\n  }\n  /** Get data as CharData. */\n  public getAsCharData(): CharData {\n    return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n  /**\n   * bit 1..21    codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n   *              read:   `codepoint = content & Content.codepointMask;`\n   *              write:  `content |= codepoint & Content.codepointMask;`\n   *                      shortcut if precondition `codepoint <= 0x10FFFF` is met:\n   *                      `content |= codepoint;`\n   */\n  CODEPOINT_MASK = 0x1FFFFF,\n\n  /**\n   * bit 22       flag indication whether a cell contains combined content\n   *              read:   `isCombined = content & Content.isCombined;`\n   *              set:    `content |= Content.isCombined;`\n   *              clear:  `content &= ~Content.isCombined;`\n   */\n  IS_COMBINED_MASK = 0x200000,  // 1 << 21\n\n  /**\n   * bit 1..22    mask to check whether a cell contains any string data\n   *              we need to check for codepoint and isCombined bits to see\n   *              whether a cell contains anything\n   *              read:   `isEmpty = !(content & Content.hasContent)`\n   */\n  HAS_CONTENT_MASK = 0x3FFFFF,\n\n  /**\n   * bit 23..24   wcwidth value of cell, takes 2 bits (ranges from 0..2)\n   *              read:   `width = (content & Content.widthMask) >> Content.widthShift;`\n   *                      `hasWidth = content & Content.widthMask;`\n   *                      as long as wcwidth is highest value in `content`:\n   *                      `width = content >> Content.widthShift;`\n   *              write:  `content |= (width << Content.widthShift) & Content.widthMask;`\n   *                      shortcut if precondition `0 <= width <= 3` is met:\n   *                      `content |= width << Content.widthShift;`\n   */\n  WIDTH_MASK = 0xC00000,   // 3 << 22\n  WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n  /**\n   * bit 1..8     blue in RGB, color in P256 and P16\n   */\n  BLUE_MASK = 0xFF,\n  BLUE_SHIFT = 0,\n  PCOLOR_MASK = 0xFF,\n  PCOLOR_SHIFT = 0,\n\n  /**\n   * bit 9..16    green in RGB\n   */\n  GREEN_MASK = 0xFF00,\n  GREEN_SHIFT = 8,\n\n  /**\n   * bit 17..24   red in RGB\n   */\n  RED_MASK = 0xFF0000,\n  RED_SHIFT = 16,\n\n  /**\n   * bit 25..26   color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n   */\n  CM_MASK = 0x3000000,\n  CM_DEFAULT = 0,\n  CM_P16 = 0x1000000,\n  CM_P256 = 0x2000000,\n  CM_RGB = 0x3000000,\n\n  /**\n   * bit 1..24  RGB room\n   */\n  RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n  /**\n   * bit 27..32\n   */\n  INVERSE = 0x4000000,\n  BOLD = 0x8000000,\n  UNDERLINE = 0x10000000,\n  BLINK = 0x20000000,\n  INVISIBLE = 0x40000000,\n  STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n  /**\n   * bit 27..32 (upper 2 unused)\n   */\n  ITALIC = 0x4000000,\n  DIM = 0x8000000,\n  HAS_EXTENDED = 0x10000000,\n  PROTECTED = 0x20000000,\n  OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n  /**\n   * bit 27..32 (upper 3 unused)\n   */\n  UNDERLINE_STYLE = 0x1C000000\n}\n\nexport const enum UnderlineStyle {\n  NONE = 0,\n  SINGLE = 1,\n  DOUBLE = 2,\n  CURLY = 3,\n  DOTTED = 4,\n  DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { disposeArray } from 'common/Lifecycle';\nimport { IDisposable, IMarker } from 'common/Types';\n\nexport class Marker implements IMarker {\n  private static _nextId = 1;\n\n  public isDisposed: boolean = false;\n  private readonly _disposables: IDisposable[] = [];\n\n  private readonly _id: number = Marker._nextId++;\n  public get id(): number { return this._id; }\n\n  private readonly _onDispose = this.register(new EventEmitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  constructor(\n    public line: number\n  ) {\n  }\n\n  public dispose(): void {\n    if (this.isDisposed) {\n      return;\n    }\n    this.isDisposed = true;\n    this.line = -1;\n    // Emit before super.dispose such that dispose listeners get a change to react\n    this._onDispose.fire();\n    disposeArray(this._disposables);\n    this._disposables.length = 0;\n  }\n\n  public register<T extends IDisposable>(disposable: T): T {\n    this._disposables.push(disposable);\n    return disposable;\n  }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n  '`': '\\u25c6', // '◆'\n  'a': '\\u2592', // '▒'\n  'b': '\\u2409', // '␉' (HT)\n  'c': '\\u240c', // '␌' (FF)\n  'd': '\\u240d', // '␍' (CR)\n  'e': '\\u240a', // '␊' (LF)\n  'f': '\\u00b0', // '°'\n  'g': '\\u00b1', // '±'\n  'h': '\\u2424', // '␤' (NL)\n  'i': '\\u240b', // '␋' (VT)\n  'j': '\\u2518', // '┘'\n  'k': '\\u2510', // '┐'\n  'l': '\\u250c', // '┌'\n  'm': '\\u2514', // '└'\n  'n': '\\u253c', // '┼'\n  'o': '\\u23ba', // '⎺'\n  'p': '\\u23bb', // '⎻'\n  'q': '\\u2500', // '─'\n  'r': '\\u23bc', // '⎼'\n  's': '\\u23bd', // '⎽'\n  't': '\\u251c', // '├'\n  'u': '\\u2524', // '┤'\n  'v': '\\u2534', // '┴'\n  'w': '\\u252c', // '┬'\n  'x': '\\u2502', // '│'\n  'y': '\\u2264', // '≤'\n  'z': '\\u2265', // '≥'\n  '{': '\\u03c0', // 'π'\n  '|': '\\u2260', // '≠'\n  '}': '\\u00a3', // '£'\n  '~': '\\u00b7'  // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n  '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n  '#': '£',\n  '@': '¾',\n  '[': 'ij',\n  '\\\\': '½',\n  ']': '|',\n  '{': '¨',\n  '|': 'f',\n  '}': '¼',\n  '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'é',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n  '#': '£',\n  '@': 'à',\n  '[': '°',\n  '\\\\': 'ç',\n  ']': '§',\n  '{': 'é',\n  '|': 'ù',\n  '}': 'è',\n  '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n  '@': 'à',\n  '[': 'â',\n  '\\\\': 'ç',\n  ']': 'ê',\n  '^': 'î',\n  '`': 'ô',\n  '{': 'é',\n  '|': 'ù',\n  '}': 'è',\n  '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n  '@': '§',\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Ü',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'ü',\n  '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n  '#': '£',\n  '@': '§',\n  '[': '°',\n  '\\\\': 'ç',\n  ']': 'é',\n  '`': 'ù',\n  '{': 'à',\n  '|': 'ò',\n  '}': 'è',\n  '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n  '@': 'Ä',\n  '[': 'Æ',\n  '\\\\': 'Ø',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'ä',\n  '{': 'æ',\n  '|': 'ø',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n  '#': '£',\n  '@': '§',\n  '[': '¡',\n  '\\\\': 'Ñ',\n  ']': '¿',\n  '{': '°',\n  '|': 'ñ',\n  '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n  '@': 'É',\n  '[': 'Ä',\n  '\\\\': 'Ö',\n  ']': 'Å',\n  '^': 'Ü',\n  '`': 'é',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'å',\n  '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n  '#': 'ù',\n  '@': 'à',\n  '[': 'é',\n  '\\\\': 'ç',\n  ']': 'ê',\n  '^': 'î',\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  '_': 'è',\n  '`': 'ô',\n  '{': 'ä',\n  '|': 'ö',\n  '}': 'ü',\n  '~': 'û'\n};\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * C0 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C0 {\n  /** Null (Caret = ^@, C = \\0) */\n  export const NUL = '\\x00';\n  /** Start of Heading (Caret = ^A) */\n  export const SOH = '\\x01';\n  /** Start of Text (Caret = ^B) */\n  export const STX = '\\x02';\n  /** End of Text (Caret = ^C) */\n  export const ETX = '\\x03';\n  /** End of Transmission (Caret = ^D) */\n  export const EOT = '\\x04';\n  /** Enquiry (Caret = ^E) */\n  export const ENQ = '\\x05';\n  /** Acknowledge (Caret = ^F) */\n  export const ACK = '\\x06';\n  /** Bell (Caret = ^G, C = \\a) */\n  export const BEL = '\\x07';\n  /** Backspace (Caret = ^H, C = \\b) */\n  export const BS  = '\\x08';\n  /** Character Tabulation, Horizontal Tabulation (Caret = ^I, C = \\t) */\n  export const HT  = '\\x09';\n  /** Line Feed (Caret = ^J, C = \\n) */\n  export const LF  = '\\x0a';\n  /** Line Tabulation, Vertical Tabulation (Caret = ^K, C = \\v) */\n  export const VT  = '\\x0b';\n  /** Form Feed (Caret = ^L, C = \\f) */\n  export const FF  = '\\x0c';\n  /** Carriage Return (Caret = ^M, C = \\r) */\n  export const CR  = '\\x0d';\n  /** Shift Out (Caret = ^N) */\n  export const SO  = '\\x0e';\n  /** Shift In (Caret = ^O) */\n  export const SI  = '\\x0f';\n  /** Data Link Escape (Caret = ^P) */\n  export const DLE = '\\x10';\n  /** Device Control One (XON) (Caret = ^Q) */\n  export const DC1 = '\\x11';\n  /** Device Control Two (Caret = ^R) */\n  export const DC2 = '\\x12';\n  /** Device Control Three (XOFF) (Caret = ^S) */\n  export const DC3 = '\\x13';\n  /** Device Control Four (Caret = ^T) */\n  export const DC4 = '\\x14';\n  /** Negative Acknowledge (Caret = ^U) */\n  export const NAK = '\\x15';\n  /** Synchronous Idle (Caret = ^V) */\n  export const SYN = '\\x16';\n  /** End of Transmission Block (Caret = ^W) */\n  export const ETB = '\\x17';\n  /** Cancel (Caret = ^X) */\n  export const CAN = '\\x18';\n  /** End of Medium (Caret = ^Y) */\n  export const EM  = '\\x19';\n  /** Substitute (Caret = ^Z) */\n  export const SUB = '\\x1a';\n  /** Escape (Caret = ^[, C = \\e) */\n  export const ESC = '\\x1b';\n  /** File Separator (Caret = ^\\) */\n  export const FS  = '\\x1c';\n  /** Group Separator (Caret = ^]) */\n  export const GS  = '\\x1d';\n  /** Record Separator (Caret = ^^) */\n  export const RS  = '\\x1e';\n  /** Unit Separator (Caret = ^_) */\n  export const US  = '\\x1f';\n  /** Space */\n  export const SP  = '\\x20';\n  /** Delete (Caret = ^?) */\n  export const DEL = '\\x7f';\n}\n\n/**\n * C1 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C1 {\n  /** padding character */\n  export const PAD = '\\x80';\n  /** High Octet Preset */\n  export const HOP = '\\x81';\n  /** Break Permitted Here */\n  export const BPH = '\\x82';\n  /** No Break Here */\n  export const NBH = '\\x83';\n  /** Index */\n  export const IND = '\\x84';\n  /** Next Line */\n  export const NEL = '\\x85';\n  /** Start of Selected Area */\n  export const SSA = '\\x86';\n  /** End of Selected Area */\n  export const ESA = '\\x87';\n  /** Horizontal Tabulation Set */\n  export const HTS = '\\x88';\n  /** Horizontal Tabulation With Justification */\n  export const HTJ = '\\x89';\n  /** Vertical Tabulation Set */\n  export const VTS = '\\x8a';\n  /** Partial Line Down */\n  export const PLD = '\\x8b';\n  /** Partial Line Up */\n  export const PLU = '\\x8c';\n  /** Reverse Index */\n  export const RI = '\\x8d';\n  /** Single-Shift 2 */\n  export const SS2 = '\\x8e';\n  /** Single-Shift 3 */\n  export const SS3 = '\\x8f';\n  /** Device Control String */\n  export const DCS = '\\x90';\n  /** Private Use 1 */\n  export const PU1 = '\\x91';\n  /** Private Use 2 */\n  export const PU2 = '\\x92';\n  /** Set Transmit State */\n  export const STS = '\\x93';\n  /** Destructive backspace, intended to eliminate ambiguity about meaning of BS. */\n  export const CCH = '\\x94';\n  /** Message Waiting */\n  export const MW = '\\x95';\n  /** Start of Protected Area */\n  export const SPA = '\\x96';\n  /** End of Protected Area */\n  export const EPA = '\\x97';\n  /** Start of String */\n  export const SOS = '\\x98';\n  /** Single Graphic Character Introducer */\n  export const SGCI = '\\x99';\n  /** Single Character Introducer */\n  export const SCI = '\\x9a';\n  /** Control Sequence Introducer */\n  export const CSI = '\\x9b';\n  /** String Terminator */\n  export const ST = '\\x9c';\n  /** Operating System Command */\n  export const OSC = '\\x9d';\n  /** Privacy Message */\n  export const PM = '\\x9e';\n  /** Application Program Command */\n  export const APC = '\\x9f';\n}\nexport namespace C1_ESCAPED {\n  export const ST = `${C0.ESC}\\\\`;\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n  // digits 0-9\n  48: ['0', ')'],\n  49: ['1', '!'],\n  50: ['2', '@'],\n  51: ['3', '#'],\n  52: ['4', '$'],\n  53: ['5', '%'],\n  54: ['6', '^'],\n  55: ['7', '&'],\n  56: ['8', '*'],\n  57: ['9', '('],\n\n  // special chars\n  186: [';', ':'],\n  187: ['=', '+'],\n  188: [',', '<'],\n  189: ['-', '_'],\n  190: ['.', '>'],\n  191: ['/', '?'],\n  192: ['`', '~'],\n  219: ['[', '{'],\n  220: ['\\\\', '|'],\n  221: [']', '}'],\n  222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n  ev: IKeyboardEvent,\n  applicationCursorMode: boolean,\n  isMac: boolean,\n  macOptionIsMeta: boolean\n): IKeyboardResult {\n  const result: IKeyboardResult = {\n    type: KeyboardResultType.SEND_KEY,\n    // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n    // canceled at the end of keyDown\n    cancel: false,\n    // The new key even to emit\n    key: undefined\n  };\n  const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n  switch (ev.keyCode) {\n    case 0:\n      if (ev.key === 'UIKeyInputUpArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OA';\n        } else {\n          result.key = C0.ESC + '[A';\n        }\n      }\n      else if (ev.key === 'UIKeyInputLeftArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OD';\n        } else {\n          result.key = C0.ESC + '[D';\n        }\n      }\n      else if (ev.key === 'UIKeyInputRightArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OC';\n        } else {\n          result.key = C0.ESC + '[C';\n        }\n      }\n      else if (ev.key === 'UIKeyInputDownArrow') {\n        if (applicationCursorMode) {\n          result.key = C0.ESC + 'OB';\n        } else {\n          result.key = C0.ESC + '[B';\n        }\n      }\n      break;\n    case 8:\n      // backspace\n      if (ev.altKey) {\n        result.key = C0.ESC + C0.DEL; // \\e ^?\n        break;\n      }\n      result.key = C0.DEL; // ^?\n      break;\n    case 9:\n      // tab\n      if (ev.shiftKey) {\n        result.key = C0.ESC + '[Z';\n        break;\n      }\n      result.key = C0.HT;\n      result.cancel = true;\n      break;\n    case 13:\n      // return/enter\n      result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n      result.cancel = true;\n      break;\n    case 27:\n      // escape\n      result.key = C0.ESC;\n      if (ev.altKey) {\n        result.key = C0.ESC + C0.ESC;\n      }\n      result.cancel = true;\n      break;\n    case 37:\n      // left-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n        // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (result.key === C0.ESC + '[1;3D') {\n          result.key = C0.ESC + (isMac ? 'b' : '[1;5D');\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OD';\n      } else {\n        result.key = C0.ESC + '[D';\n      }\n      break;\n    case 39:\n      // right-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n        // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (result.key === C0.ESC + '[1;3C') {\n          result.key = C0.ESC + (isMac ? 'f' : '[1;5C');\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OC';\n      } else {\n        result.key = C0.ESC + '[C';\n      }\n      break;\n    case 38:\n      // up-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n        // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (!isMac && result.key === C0.ESC + '[1;3A') {\n          result.key = C0.ESC + '[1;5A';\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OA';\n      } else {\n        result.key = C0.ESC + '[A';\n      }\n      break;\n    case 40:\n      // down-arrow\n      if (ev.metaKey) {\n        break;\n      }\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n        // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow\n        // http://unix.stackexchange.com/a/108106\n        // macOS uses different escape sequences than linux\n        if (!isMac && result.key === C0.ESC + '[1;3B') {\n          result.key = C0.ESC + '[1;5B';\n        }\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OB';\n      } else {\n        result.key = C0.ESC + '[B';\n      }\n      break;\n    case 45:\n      // insert\n      if (!ev.shiftKey && !ev.ctrlKey) {\n        // <Ctrl> or <Shift> + <Insert> are used to\n        // copy-paste on some systems.\n        result.key = C0.ESC + '[2~';\n      }\n      break;\n    case 46:\n      // delete\n      if (modifiers) {\n        result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[3~';\n      }\n      break;\n    case 36:\n      // home\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OH';\n      } else {\n        result.key = C0.ESC + '[H';\n      }\n      break;\n    case 35:\n      // end\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n      } else if (applicationCursorMode) {\n        result.key = C0.ESC + 'OF';\n      } else {\n        result.key = C0.ESC + '[F';\n      }\n      break;\n    case 33:\n      // page up\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_UP;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[5~';\n      }\n      break;\n    case 34:\n      // page down\n      if (ev.shiftKey) {\n        result.type = KeyboardResultType.PAGE_DOWN;\n      } else if (ev.ctrlKey) {\n        result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[6~';\n      }\n      break;\n    case 112:\n      // F1-F12\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n      } else {\n        result.key = C0.ESC + 'OP';\n      }\n      break;\n    case 113:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n      } else {\n        result.key = C0.ESC + 'OQ';\n      }\n      break;\n    case 114:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n      } else {\n        result.key = C0.ESC + 'OR';\n      }\n      break;\n    case 115:\n      if (modifiers) {\n        result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n      } else {\n        result.key = C0.ESC + 'OS';\n      }\n      break;\n    case 116:\n      if (modifiers) {\n        result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[15~';\n      }\n      break;\n    case 117:\n      if (modifiers) {\n        result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[17~';\n      }\n      break;\n    case 118:\n      if (modifiers) {\n        result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[18~';\n      }\n      break;\n    case 119:\n      if (modifiers) {\n        result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[19~';\n      }\n      break;\n    case 120:\n      if (modifiers) {\n        result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[20~';\n      }\n      break;\n    case 121:\n      if (modifiers) {\n        result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[21~';\n      }\n      break;\n    case 122:\n      if (modifiers) {\n        result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[23~';\n      }\n      break;\n    case 123:\n      if (modifiers) {\n        result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n      } else {\n        result.key = C0.ESC + '[24~';\n      }\n      break;\n    default:\n      // a-z and space\n      if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n        if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          result.key = String.fromCharCode(ev.keyCode - 64);\n        } else if (ev.keyCode === 32) {\n          result.key = C0.NUL;\n        } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n          // escape, file sep, group sep, record sep, unit sep\n          result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n        } else if (ev.keyCode === 56) {\n          result.key = C0.DEL;\n        } else if (ev.keyCode === 219) {\n          result.key = C0.ESC;\n        } else if (ev.keyCode === 220) {\n          result.key = C0.FS;\n        } else if (ev.keyCode === 221) {\n          result.key = C0.GS;\n        }\n      } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n        // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n        const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n        const key = keyMapping?.[!ev.shiftKey ? 0 : 1];\n        if (key) {\n          result.key = C0.ESC + key;\n        } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n          const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n          let keyString = String.fromCharCode(keyCode);\n          if (ev.shiftKey) {\n            keyString = keyString.toUpperCase();\n          }\n          result.key = C0.ESC + keyString;\n        } else if (ev.keyCode === 32) {\n          result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');\n        } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {\n          // Reference: https://github.com/xtermjs/xterm.js/issues/3725\n          // Alt will produce a \"dead key\" (initate composition) with some\n          // of the letters in US layout (e.g. N/E/U).\n          // It's safe to match against Key* since no other `code` values begin with \"Key\".\n          // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac\n          let keyString = ev.code.slice(3, 4);\n          if (!ev.shiftKey) {\n            keyString = keyString.toLowerCase();\n          }\n          result.key = C0.ESC + keyString;\n          result.cancel = true;\n        }\n      } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {\n        if (ev.keyCode === 65) { // cmd + a\n          result.type = KeyboardResultType.SELECT_ALL;\n        }\n      } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n        // Include only keys that that result in a _single_ character; don't include num lock,\n        // volume up, etc.\n        result.key = ev.key;\n      } else if (ev.key && ev.ctrlKey) {\n        if (ev.key === '_') { // ^_\n          result.key = C0.US;\n        }\n        if (ev.key === '@') { // ^ + shift + 2 = ^ + @\n          result.key = C0.NUL;\n        }\n      }\n      break;\n  }\n\n  return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n *       due to additional sanity checks. We can avoid them since\n *       we always operate on legal UTF32 (granted by the input decoders)\n *       and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n  if (codePoint > 0xFFFF) {\n    codePoint -= 0x10000;\n    return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n  }\n  return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n  let result = '';\n  for (let i = start; i < end; ++i) {\n    let codepoint = data[i];\n    if (codepoint > 0xFFFF) {\n      // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n      // pair conversion rules:\n      //  - subtract 0x10000 from code point, leaving a 20 bit number\n      //  - add high 10 bits to 0xD800  --> first surrogate\n      //  - add low 10 bits to 0xDC00   --> second surrogate\n      codepoint -= 0x10000;\n      result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n    } else {\n      result += String.fromCharCode(codepoint);\n    }\n  }\n  return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n  private _interim: number = 0;\n\n  /**\n   * Clears interim and resets decoder to clean state.\n   */\n  public clear(): void {\n    this._interim = 0;\n  }\n\n  /**\n   * Decode JS string to UTF32 codepoints.\n   * The methods assumes stream input and will store partly transmitted\n   * surrogate pairs and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided input data does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: string, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let startPos = 0;\n\n    // handle leftover surrogate high\n    if (this._interim) {\n      const second = input.charCodeAt(startPos++);\n      if (0xDC00 <= second && second <= 0xDFFF) {\n        target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n      } else {\n        // illegal codepoint (USC2 handling)\n        target[size++] = this._interim;\n        target[size++] = second;\n      }\n      this._interim = 0;\n    }\n\n    for (let i = startPos; i < length; ++i) {\n      const code = input.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          this._interim = code;\n          return size;\n        }\n        const second = input.charCodeAt(i);\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          // illegal codepoint (USC2 handling)\n          target[size++] = code;\n          target[size++] = second;\n        }\n        continue;\n      }\n      if (code === 0xFEFF) {\n        // BOM\n        continue;\n      }\n      target[size++] = code;\n    }\n    return size;\n  }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n  public interim: Uint8Array = new Uint8Array(3);\n\n  /**\n   * Clears interim bytes and resets decoder to clean state.\n   */\n  public clear(): void {\n    this.interim.fill(0);\n  }\n\n  /**\n   * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n   * The methods assumes stream input and will store partly transmitted bytes\n   * and decode them with the next data chunk.\n   * Note: The method does no bound checks for target, therefore make sure\n   * the provided data chunk does not exceed the size of `target`.\n   * Returns the number of written codepoints in `target`.\n   */\n  public decode(input: Uint8Array, target: Uint32Array): number {\n    const length = input.length;\n\n    if (!length) {\n      return 0;\n    }\n\n    let size = 0;\n    let byte1: number;\n    let byte2: number;\n    let byte3: number;\n    let byte4: number;\n    let codepoint = 0;\n    let startPos = 0;\n\n    // handle leftover bytes\n    if (this.interim[0]) {\n      let discardInterim = false;\n      let cp = this.interim[0];\n      cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n      let pos = 0;\n      let tmp: number;\n      while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n        cp <<= 6;\n        cp |= tmp;\n      }\n      // missing bytes - read ahead from input\n      const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n      const missing = type - pos;\n      while (startPos < missing) {\n        if (startPos >= length) {\n          return 0;\n        }\n        tmp = input[startPos++];\n        if ((tmp & 0xC0) !== 0x80) {\n          // wrong continuation, discard interim bytes completely\n          startPos--;\n          discardInterim = true;\n          break;\n        } else {\n          // need to save so we can continue short inputs in next call\n          this.interim[pos++] = tmp;\n          cp <<= 6;\n          cp |= tmp & 0x3F;\n        }\n      }\n      if (!discardInterim) {\n        // final test is type dependent\n        if (type === 2) {\n          if (cp < 0x80) {\n            // wrong starter byte\n            startPos--;\n          } else {\n            target[size++] = cp;\n          }\n        } else if (type === 3) {\n          if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n            // illegal codepoint or BOM\n          } else {\n            target[size++] = cp;\n          }\n        } else {\n          if (cp < 0x010000 || cp > 0x10FFFF) {\n            // illegal codepoint\n          } else {\n            target[size++] = cp;\n          }\n        }\n      }\n      this.interim.fill(0);\n    }\n\n    // loop through input\n    const fourStop = length - 4;\n    let i = startPos;\n    while (i < length) {\n      /**\n       * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n       * This is a compromise between speed gain for ASCII\n       * and penalty for non ASCII:\n       * For best ASCII performance the char should be stored directly into target,\n       * but even a single attempt to write to target and compare afterwards\n       * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n       * which reduces ASCII performance by ~15%.\n       * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n       * compared to the gains.\n       * Note that this optimization only takes place for 4 consecutive ASCII chars,\n       * for any shorter it bails out. Worst case - all 4 bytes being read but\n       * thrown away due to the last being a non ASCII char (-10% performance).\n       */\n      while (i < fourStop\n        && !((byte1 = input[i]) & 0x80)\n        && !((byte2 = input[i + 1]) & 0x80)\n        && !((byte3 = input[i + 2]) & 0x80)\n        && !((byte4 = input[i + 3]) & 0x80))\n      {\n        target[size++] = byte1;\n        target[size++] = byte2;\n        target[size++] = byte3;\n        target[size++] = byte4;\n        i += 4;\n      }\n\n      // reread byte1\n      byte1 = input[i++];\n\n      // 1 byte\n      if (byte1 < 0x80) {\n        target[size++] = byte1;\n\n        // 2 bytes\n      } else if ((byte1 & 0xE0) === 0xC0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n        if (codepoint < 0x80) {\n          // wrong starter byte\n          i--;\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 3 bytes\n      } else if ((byte1 & 0xF0) === 0xE0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n        if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n          // illegal codepoint or BOM, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n\n        // 4 bytes\n      } else if ((byte1 & 0xF8) === 0xF0) {\n        if (i >= length) {\n          this.interim[0] = byte1;\n          return size;\n        }\n        byte2 = input[i++];\n        if ((byte2 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          return size;\n        }\n        byte3 = input[i++];\n        if ((byte3 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        if (i >= length) {\n          this.interim[0] = byte1;\n          this.interim[1] = byte2;\n          this.interim[2] = byte3;\n          return size;\n        }\n        byte4 = input[i++];\n        if ((byte4 & 0xC0) !== 0x80) {\n          // wrong continuation\n          i--;\n          continue;\n        }\n        codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n        if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n          // illegal codepoint, no i-- here\n          continue;\n        }\n        target[size++] = codepoint;\n      } else {\n        // illegal byte, just skip\n      }\n    }\n    return size;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider } from 'common/services/Services';\n\ntype CharWidth = 0 | 1 | 2;\n\nconst BMP_COMBINING = [\n  [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n  [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n  [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n  [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n  [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n  [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n  [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n  [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n  [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n  [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n  [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n  [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n  [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n  [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n  [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n  [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n  [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n  [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n  [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n  [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n  [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n  [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n  [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n  [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n  [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n  [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n  [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n  [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n  [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n  [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n  [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n  [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n  [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n  [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n  [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n  [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n  [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n  [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n  [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n  [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n  [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n  [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n  [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n  [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n  [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n  [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n  [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n  [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n  let min = 0;\n  let max = data.length - 1;\n  let mid;\n  if (ucs < data[0][0] || ucs > data[max][1]) {\n    return false;\n  }\n  while (max >= min) {\n    mid = (min + max) >> 1;\n    if (ucs > data[mid][1]) {\n      min = mid + 1;\n    } else if (ucs < data[mid][0]) {\n      max = mid - 1;\n    } else {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n  public readonly version = '6';\n\n  constructor() {\n    // init lookup table once\n    if (!table) {\n      table = new Uint8Array(65536);\n      table.fill(1);\n      table[0] = 0;\n      // control chars\n      table.fill(0, 1, 32);\n      table.fill(0, 0x7f, 0xa0);\n\n      // apply wide char rules first\n      // wide chars\n      table.fill(2, 0x1100, 0x1160);\n      table[0x2329] = 2;\n      table[0x232a] = 2;\n      table.fill(2, 0x2e80, 0xa4d0);\n      table[0x303f] = 1;  // wrongly in last line\n\n      table.fill(2, 0xac00, 0xd7a4);\n      table.fill(2, 0xf900, 0xfb00);\n      table.fill(2, 0xfe10, 0xfe1a);\n      table.fill(2, 0xfe30, 0xfe70);\n      table.fill(2, 0xff00, 0xff61);\n      table.fill(2, 0xffe0, 0xffe7);\n\n      // apply combining last to ensure we overwrite\n      // wrongly wide set chars:\n      //    the original algo evals combining first and falls\n      //    through to wide check so we simply do here the opposite\n      // combining 0\n      for (let r = 0; r < BMP_COMBINING.length; ++r) {\n        table.fill(0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n      }\n    }\n  }\n\n  public wcwidth(num: number): CharWidth {\n    if (num < 32) return 0;\n    if (num < 127) return 1;\n    if (num < 65536) return table[num] as CharWidth;\n    if (bisearch(num, HIGH_COMBINING)) return 0;\n    if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n    return 1;\n  }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\nexport class WriteBuffer extends Disposable {\n  private _writeBuffer: (string | Uint8Array)[] = [];\n  private _callbacks: ((() => void) | undefined)[] = [];\n  private _pendingData = 0;\n  private _bufferOffset = 0;\n  private _isSyncWriting = false;\n  private _syncCalls = 0;\n  private _didUserInput = false;\n\n  private readonly _onWriteParsed = this.register(new EventEmitter<void>());\n  public readonly onWriteParsed = this._onWriteParsed.event;\n\n  constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise<boolean>) {\n    super();\n  }\n\n  public handleUserInput(): void {\n    this._didUserInput = true;\n  }\n\n  /**\n   * @deprecated Unreliable, to be removed soon.\n   */\n  public writeSync(data: string | Uint8Array, maxSubsequentCalls?: number): void {\n    // stop writeSync recursions with maxSubsequentCalls argument\n    // This is dangerous to use as it will lose the current data chunk\n    // and return immediately.\n    if (maxSubsequentCalls !== undefined && this._syncCalls > maxSubsequentCalls) {\n      // comment next line if a whole loop block should only contain x `writeSync` calls\n      // (total flat vs. deep nested limit)\n      this._syncCalls = 0;\n      return;\n    }\n    // append chunk to buffer\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(undefined);\n\n    // increase recursion counter\n    this._syncCalls++;\n    // exit early if another writeSync loop is active\n    if (this._isSyncWriting) {\n      return;\n    }\n    this._isSyncWriting = true;\n\n    // force sync processing on pending data chunks to avoid in-band data scrambling\n    // does the same as innerWrite but without event loop\n    // we have to do it here as single loop steps to not corrupt loop subject\n    // by another writeSync call triggered from _action\n    let chunk: string | Uint8Array | undefined;\n    while (chunk = this._writeBuffer.shift()) {\n      this._action(chunk);\n      const cb = this._callbacks.shift();\n      if (cb) cb();\n    }\n    // reset to avoid reprocessing of chunks with scheduled innerWrite call\n    // stopping scheduled innerWrite by offset > length condition\n    this._pendingData = 0;\n    this._bufferOffset = 0x7FFFFFFF;\n\n    // allow another writeSync to loop\n    this._isSyncWriting = false;\n    this._syncCalls = 0;\n  }\n\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    if (this._pendingData > DISCARD_WATERMARK) {\n      throw new Error('write data discarded, use flow control to avoid losing data');\n    }\n\n    // schedule chunk processing for next event loop run\n    if (!this._writeBuffer.length) {\n      this._bufferOffset = 0;\n\n      // If this is the first write call after the user has done some input,\n      // parse it immediately to minimize input latency,\n      // otherwise schedule for the next event\n      if (this._didUserInput) {\n        this._didUserInput = false;\n        this._pendingData += data.length;\n        this._writeBuffer.push(data);\n        this._callbacks.push(callback);\n        this._innerWrite();\n        return;\n      }\n\n      setTimeout(() => this._innerWrite());\n    }\n\n    this._pendingData += data.length;\n    this._writeBuffer.push(data);\n    this._callbacks.push(callback);\n  }\n\n  /**\n   * Inner write call, that enters the sliced chunk processing by timing.\n   *\n   * `lastTime` indicates, when the last _innerWrite call had started.\n   * It is used to aggregate async handler execution under a timeout constraint\n   * effectively lowering the redrawing needs, schematically:\n   *\n   *   macroTask _innerWrite:\n   *     if (Date.now() - (lastTime | 0) < WRITE_TIMEOUT_MS):\n   *        schedule microTask _innerWrite(lastTime)\n   *     else:\n   *        schedule macroTask _innerWrite(0)\n   *\n   *   overall execution order on task queues:\n   *\n   *   macrotasks:  [...]  -->  _innerWrite(0)  -->  [...]  -->  screenUpdate  -->  [...]\n   *         m  t:                    |\n   *         i  a:                  [...]\n   *         c  s:                    |\n   *         r  k:              while < timeout:\n   *         o  s:                _innerWrite(timeout)\n   *\n   * `promiseResult` depicts the promise resolve value of an async handler.\n   * This value gets carried forward through all saved stack states of the\n   * paused parser for proper continuation.\n   *\n   * Note, for pure sync code `lastTime` and `promiseResult` have no meaning.\n   */\n  protected _innerWrite(lastTime: number = 0, promiseResult: boolean = true): void {\n    const startTime = lastTime || Date.now();\n    while (this._writeBuffer.length > this._bufferOffset) {\n      const data = this._writeBuffer[this._bufferOffset];\n      const result = this._action(data, promiseResult);\n      if (result) {\n        /**\n         * If we get a promise as return value, we re-schedule the continuation\n         * as thenable on the promise and exit right away.\n         *\n         * The exit here means, that we block input processing at the current active chunk,\n         * the exact execution position within the chunk is preserved by the saved\n         * stack content in InputHandler and EscapeSequenceParser.\n         *\n         * Resuming happens automatically from that saved stack state.\n         * Also the resolved promise value is passed along the callstack to\n         * `EscapeSequenceParser.parse` to correctly resume the stopped handler loop.\n         *\n         * Exceptions on async handlers will be logged to console async, but do not interrupt\n         * the input processing (continues with next handler at the current input position).\n         */\n\n        /**\n         * If a promise takes long to resolve, we should schedule continuation behind setTimeout.\n         * This might already be too late, if our .then enters really late (executor + prev thens\n         * took very long). This cannot be solved here for the handler itself (it is the handlers\n         * responsibility to slice hard work), but we can at least schedule a screen update as we\n         * gain control.\n         */\n        const continuation: (r: boolean) => void = (r: boolean) => Date.now() - startTime >= WRITE_TIMEOUT_MS\n          ? setTimeout(() => this._innerWrite(0, r))\n          : this._innerWrite(startTime, r);\n\n        /**\n         * Optimization considerations:\n         * The continuation above favors FPS over throughput by eval'ing `startTime` on resolve.\n         * This might schedule too many screen updates with bad throughput drops (in case a slow\n         * resolving handler sliced its work properly behind setTimeout calls). We cannot spot\n         * this condition here, also the renderer has no way to spot nonsense updates either.\n         * FIXME: A proper fix for this would track the FPS at the renderer entry level separately.\n         *\n         * If favoring of FPS shows bad throughtput impact, use the following instead. It favors\n         * throughput by eval'ing `startTime` upfront pulling at least one more chunk into the\n         * current microtask queue (executed before setTimeout).\n         */\n        // const continuation: (r: boolean) => void = Date.now() - startTime >= WRITE_TIMEOUT_MS\n        //   ? r => setTimeout(() => this._innerWrite(0, r))\n        //   : r => this._innerWrite(startTime, r);\n\n        // Handle exceptions synchronously to current band position, idea:\n        // 1. spawn a single microtask which we allow to throw hard\n        // 2. spawn a promise immediately resolving to `true`\n        // (executed on the same queue, thus properly aligned before continuation happens)\n        result.catch(err => {\n          queueMicrotask(() => {throw err;});\n          return Promise.resolve(false);\n        }).then(continuation);\n        return;\n      }\n\n      const cb = this._callbacks[this._bufferOffset];\n      if (cb) cb();\n      this._bufferOffset++;\n      this._pendingData -= data.length;\n\n      if (Date.now() - startTime >= WRITE_TIMEOUT_MS) {\n        break;\n      }\n    }\n    if (this._writeBuffer.length > this._bufferOffset) {\n      // Allow renderer to catch up before processing the next batch\n      // trim already processed chunks if we are above threshold\n      if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n        this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n        this._callbacks = this._callbacks.slice(this._bufferOffset);\n        this._bufferOffset = 0;\n      }\n      setTimeout(() => this._innerWrite());\n    } else {\n      this._writeBuffer.length = 0;\n      this._callbacks.length = 0;\n      this._pendingData = 0;\n      this._bufferOffset = 0;\n    }\n    this._onWriteParsed.fire();\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n\n// 'rgb:' rule - matching: r/g/b | rr/gg/bb | rrr/ggg/bbb | rrrr/gggg/bbbb (hex digits)\nconst RGB_REX = /^([\\da-f])\\/([\\da-f])\\/([\\da-f])$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/;\n// '#...' rule - matching any hex digits\nconst HASH_REX = /^[\\da-f]+$/;\n\n/**\n * Parse color spec to RGB values (8 bit per channel).\n * See `man xparsecolor` for details about certain format specifications.\n *\n * Supported formats:\n * - rgb:<red>/<green>/<blue> with <red>, <green>, <blue> in h | hh | hhh | hhhh\n * - #RGB, #RRGGBB, #RRRGGGBBB, #RRRRGGGGBBBB\n *\n * All other formats like rgbi: or device-independent string specifications\n * with float numbering are not supported.\n */\nexport function parseColor(data: string): [number, number, number] | undefined {\n  if (!data) return;\n  // also handle uppercases\n  let low = data.toLowerCase();\n  if (low.indexOf('rgb:') === 0) {\n    // 'rgb:' specifier\n    low = low.slice(4);\n    const m = RGB_REX.exec(low);\n    if (m) {\n      const base = m[1] ? 15 : m[4] ? 255 : m[7] ? 4095 : 65535;\n      return [\n        Math.round(parseInt(m[1] || m[4] || m[7] || m[10], 16) / base * 255),\n        Math.round(parseInt(m[2] || m[5] || m[8] || m[11], 16) / base * 255),\n        Math.round(parseInt(m[3] || m[6] || m[9] || m[12], 16) / base * 255)\n      ];\n    }\n  } else if (low.indexOf('#') === 0) {\n    // '#' specifier\n    low = low.slice(1);\n    if (HASH_REX.exec(low) && [3, 6, 9, 12].includes(low.length)) {\n      const adv = low.length / 3;\n      const result: [number, number, number] = [0, 0, 0];\n      for (let i = 0; i < 3; ++i) {\n        const c = parseInt(low.slice(adv * i, adv * i + adv), 16);\n        result[i] = adv === 1 ? c << 4 : adv === 2 ? c : adv === 3 ? c >> 4 : c >> 8;\n      }\n      return result;\n    }\n  }\n\n  // Named colors are currently not supported due to the large addition to the xterm.js bundle size\n  // they would add. In order to support named colors, we would need some way of optionally loading\n  // additional payloads so startup/download time is not bloated (see #3530).\n}\n\n// pad hex output to requested bit width\nfunction pad(n: number, bits: number): string {\n  const s = n.toString(16);\n  const s2 = s.length < 2 ? '0' + s : s;\n  switch (bits) {\n    case 4:\n      return s[0];\n    case 8:\n      return s2;\n    case 12:\n      return (s2 + s2).slice(0, 3);\n    default:\n      return s2 + s2;\n  }\n}\n\n/**\n * Convert a given color to rgb:../../.. string of `bits` depth.\n */\nexport function toRgbString(color: [number, number, number], bits: number = 16): string {\n  const [r, g, b] = color;\n  return `rgb:${pad(r, bits)}/${pad(g, bits)}/${pad(b, bits)}`;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Internal states of EscapeSequenceParser.\n */\nexport const enum ParserState {\n  GROUND = 0,\n  ESCAPE = 1,\n  ESCAPE_INTERMEDIATE = 2,\n  CSI_ENTRY = 3,\n  CSI_PARAM = 4,\n  CSI_INTERMEDIATE = 5,\n  CSI_IGNORE = 6,\n  SOS_PM_APC_STRING = 7,\n  OSC_STRING = 8,\n  DCS_ENTRY = 9,\n  DCS_PARAM = 10,\n  DCS_IGNORE = 11,\n  DCS_INTERMEDIATE = 12,\n  DCS_PASSTHROUGH = 13\n}\n\n/**\n * Internal actions of EscapeSequenceParser.\n */\nexport const enum ParserAction {\n  IGNORE = 0,\n  ERROR = 1,\n  PRINT = 2,\n  EXECUTE = 3,\n  OSC_START = 4,\n  OSC_PUT = 5,\n  OSC_END = 6,\n  CSI_DISPATCH = 7,\n  PARAM = 8,\n  COLLECT = 9,\n  ESC_DISPATCH = 10,\n  CLEAR = 11,\n  DCS_HOOK = 12,\n  DCS_PUT = 13,\n  DCS_UNHOOK = 14\n}\n\n/**\n * Internal states of OscParser.\n */\nexport const enum OscState {\n  START = 0,\n  ID = 1,\n  PAYLOAD = 2,\n  ABORT = 3\n}\n\n// payload limit for OSC and DCS\nexport const PAYLOAD_LIMIT = 10000000;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { PAYLOAD_LIMIT } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n  private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n  private _active: IDcsHandler[] = EMPTY_HANDLERS;\n  private _ident: number = 0;\n  private _handlerFb: DcsFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public registerHandler(ident: number, handler: IDcsHandler): IDisposable {\n    if (this._handlers[ident] === undefined) {\n      this._handlers[ident] = [];\n    }\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n\n  public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public reset(): void {\n    // force cleanup leftover handlers\n    if (this._active.length) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].unhook(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n\n  public hook(ident: number, params: IParams): void {\n    // always reset leftover handlers\n    this.reset();\n    this._ident = ident;\n    this._active = this._handlers[ident] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'HOOK', params);\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].hook(params);\n      }\n    }\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public unhook(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (!this._active.length) {\n      this._handlerFb(this._ident, 'UNHOOK', success);\n    } else {\n      let handlerResult: boolean | Promise<boolean> = false;\n      let j = this._active.length - 1;\n      let fallThrough = false;\n      if (this._stack.paused) {\n        j = this._stack.loopPosition - 1;\n        handlerResult = promiseResult;\n        fallThrough = this._stack.fallThrough;\n        this._stack.paused = false;\n      }\n      if (!fallThrough && handlerResult === false) {\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].unhook(success);\n          if (handlerResult === true) {\n            break;\n          } else if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = false;\n            return handlerResult;\n          }\n        }\n        j--;\n      }\n      // cleanup left over handlers (fallThrough for async)\n      for (; j >= 0; j--) {\n        handlerResult = this._active[j].unhook(false);\n        if (handlerResult instanceof Promise) {\n          this._stack.paused = true;\n          this._stack.loopPosition = j;\n          this._stack.fallThrough = true;\n          return handlerResult;\n        }\n      }\n    }\n    this._active = EMPTY_HANDLERS;\n    this._ident = 0;\n  }\n}\n\n// predefine empty params as [0] (ZDM)\nconst EMPTY_PARAMS = new Params();\nEMPTY_PARAMS.addParam(0);\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n  private _data = '';\n  private _params: IParams = EMPTY_PARAMS;\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string, params: IParams) => boolean | Promise<boolean>) { }\n\n  public hook(params: IParams): void {\n    // since we need to preserve params until `unhook`, we have to clone it\n    // (only borrowed from parser and spans multiple parser states)\n    // perf optimization:\n    // clone only, if we have non empty params, otherwise stick with default\n    this._params = (params.length > 1 || params.params[0]) ? params.clone() : EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > PAYLOAD_LIMIT) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public unhook(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data, this._params);\n      if (ret instanceof Promise) {\n        // need to hold data and params until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._params = EMPTY_PARAMS;\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._params = EMPTY_PARAMS;\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\n\n/**\n * Table values are generated like this:\n *    index:  currentState << TableValue.INDEX_STATE_SHIFT | charCode\n *    value:  action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n  TRANSITION_ACTION_SHIFT = 4,\n  TRANSITION_STATE_MASK = 15,\n  INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n  public table: Uint8Array;\n\n  constructor(length: number) {\n    this.table = new Uint8Array(length);\n  }\n\n  /**\n   * Set default transition.\n   * @param action default action\n   * @param next default next state\n   */\n  public setDefault(action: ParserAction, next: ParserState): void {\n    this.table.fill(action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n  }\n\n  /**\n   * Add a transition to the transition table.\n   * @param code input character code\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n    this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n  }\n\n  /**\n   * Add transitions for multiple input character codes.\n   * @param codes input character code array\n   * @param state current parser state\n   * @param action parser action to be done\n   * @param next next parser state\n   */\n  public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n    for (let i = 0; i < codes.length; i++) {\n      this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n    }\n  }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n  const table: TransitionTable = new TransitionTable(4095);\n\n  // range macro for byte\n  const BYTE_VALUES = 256;\n  const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n  const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n  // Default definitions.\n  const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n  const EXECUTABLES = r(0x00, 0x18);\n  EXECUTABLES.push(0x19);\n  EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n  const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);\n  let state: any;\n\n  // set default transition\n  table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n  // printables\n  table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  // global anywhere rules\n  for (state in states) {\n    table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n    table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n    table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE);  // ESC\n    table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING);  // OSC\n    table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n    table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY);  // CSI\n    table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY);  // DCS\n  }\n  // rules for executables and 7f\n  table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n  table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n  table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n  table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n  table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n  table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n  table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n  table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n  // osc\n  table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n  table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n  table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n  // sos/pm/apc does nothing\n  table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);\n  table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n  // csi entries\n  table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n  // esc_intermediate\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n  table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n  // dcs entry\n  table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n  table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n  table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n  table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n  table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n  table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n  table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n  table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n  // special handling of unicode chars\n  table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n  table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n  table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n  table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n  return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n  public initialState: number;\n  public currentState: number;\n  public precedingCodepoint: number;\n\n  // buffers over several parse calls\n  protected _params: Params;\n  protected _collect: number;\n\n  // handler lookup containers\n  protected _printHandler: PrintHandlerType;\n  protected _executeHandlers: { [flag: number]: ExecuteHandlerType };\n  protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n  protected _escHandlers: IHandlerCollection<EscHandlerType>;\n  protected readonly _oscParser: IOscParser;\n  protected readonly _dcsParser: IDcsParser;\n  protected _errorHandler: (state: IParsingState) => IParsingState;\n\n  // fallback handlers\n  protected _printHandlerFb: PrintFallbackHandlerType;\n  protected _executeHandlerFb: ExecuteFallbackHandlerType;\n  protected _csiHandlerFb: CsiFallbackHandlerType;\n  protected _escHandlerFb: EscFallbackHandlerType;\n  protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n  // parser stack save for async handler support\n  protected _parseStack: IParserStackState = {\n    state: ParserStackType.NONE,\n    handlers: [],\n    handlerPos: 0,\n    transition: 0,\n    chunkPos: 0\n  };\n\n  constructor(\n    protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n  ) {\n    super();\n\n    this.initialState = ParserState.GROUND;\n    this.currentState = this.initialState;\n    this._params = new Params(); // defaults to 32 storable params/subparams\n    this._params.addParam(0);    // ZDM\n    this._collect = 0;\n    this.precedingCodepoint = 0;\n\n    // set default fallback handlers and handler lookup containers\n    this._printHandlerFb = (data, start, end): void => { };\n    this._executeHandlerFb = (code: number): void => { };\n    this._csiHandlerFb = (ident: number, params: IParams): void => { };\n    this._escHandlerFb = (ident: number): void => { };\n    this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n    this._printHandler = this._printHandlerFb;\n    this._executeHandlers = Object.create(null);\n    this._csiHandlers = Object.create(null);\n    this._escHandlers = Object.create(null);\n    this.register(toDisposable(() => {\n      this._csiHandlers = Object.create(null);\n      this._executeHandlers = Object.create(null);\n      this._escHandlers = Object.create(null);\n    }));\n    this._oscParser = this.register(new OscParser());\n    this._dcsParser = this.register(new DcsParser());\n    this._errorHandler = this._errorHandlerFb;\n\n    // swallow 7bit ST (ESC+\\)\n    this.registerEscHandler({ final: '\\\\' }, () => true);\n  }\n\n  protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n    let res = 0;\n    if (id.prefix) {\n      if (id.prefix.length > 1) {\n        throw new Error('only one byte as prefix supported');\n      }\n      res = id.prefix.charCodeAt(0);\n      if (res && 0x3c > res || res > 0x3f) {\n        throw new Error('prefix must be in range 0x3c .. 0x3f');\n      }\n    }\n    if (id.intermediates) {\n      if (id.intermediates.length > 2) {\n        throw new Error('only two bytes as intermediates are supported');\n      }\n      for (let i = 0; i < id.intermediates.length; ++i) {\n        const intermediate = id.intermediates.charCodeAt(i);\n        if (0x20 > intermediate || intermediate > 0x2f) {\n          throw new Error('intermediate must be in range 0x20 .. 0x2f');\n        }\n        res <<= 8;\n        res |= intermediate;\n      }\n    }\n    if (id.final.length !== 1) {\n      throw new Error('final must be a single byte');\n    }\n    const finalCode = id.final.charCodeAt(0);\n    if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n      throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n    }\n    res <<= 8;\n    res |= finalCode;\n\n    return res;\n  }\n\n  public identToString(ident: number): string {\n    const res: string[] = [];\n    while (ident) {\n      res.push(String.fromCharCode(ident & 0xFF));\n      ident >>= 8;\n    }\n    return res.reverse().join('');\n  }\n\n  public setPrintHandler(handler: PrintHandlerType): void {\n    this._printHandler = handler;\n  }\n  public clearPrintHandler(): void {\n    this._printHandler = this._printHandlerFb;\n  }\n\n  public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n    const ident = this._identifier(id, [0x30, 0x7e]);\n    if (this._escHandlers[ident] === undefined) {\n      this._escHandlers[ident] = [];\n    }\n    const handlerList = this._escHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearEscHandler(id: IFunctionIdentifier): void {\n    if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n  }\n  public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n    this._escHandlerFb = handler;\n  }\n\n  public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n    this._executeHandlers[flag.charCodeAt(0)] = handler;\n  }\n  public clearExecuteHandler(flag: string): void {\n    if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n  }\n  public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n    this._executeHandlerFb = handler;\n  }\n\n  public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n    const ident = this._identifier(id);\n    if (this._csiHandlers[ident] === undefined) {\n      this._csiHandlers[ident] = [];\n    }\n    const handlerList = this._csiHandlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearCsiHandler(id: IFunctionIdentifier): void {\n    if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n  }\n  public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n    this._csiHandlerFb = callback;\n  }\n\n  public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n    return this._dcsParser.registerHandler(this._identifier(id), handler);\n  }\n  public clearDcsHandler(id: IFunctionIdentifier): void {\n    this._dcsParser.clearHandler(this._identifier(id));\n  }\n  public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n    this._dcsParser.setHandlerFallback(handler);\n  }\n\n  public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {\n    return this._oscParser.registerHandler(ident, handler);\n  }\n  public clearOscHandler(ident: number): void {\n    this._oscParser.clearHandler(ident);\n  }\n  public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._oscParser.setHandlerFallback(handler);\n  }\n\n  public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n    this._errorHandler = callback;\n  }\n  public clearErrorHandler(): void {\n    this._errorHandler = this._errorHandlerFb;\n  }\n\n  /**\n   * Reset parser to initial values.\n   *\n   * This can also be used to lift the improper continuation error condition\n   * when dealing with async handlers. Use this only as a last resort to silence\n   * that error when the terminal has no pending data to be processed. Note that\n   * the interrupted async handler might continue its work in the future messing\n   * up the terminal state even further.\n   */\n  public reset(): void {\n    this.currentState = this.initialState;\n    this._oscParser.reset();\n    this._dcsParser.reset();\n    this._params.reset();\n    this._params.addParam(0); // ZDM\n    this._collect = 0;\n    this.precedingCodepoint = 0;\n    // abort pending continuation from async handler\n    // Here the RESET type indicates, that the next parse call will\n    // ignore any saved stack, instead continues sync with next codepoint from GROUND\n    if (this._parseStack.state !== ParserStackType.NONE) {\n      this._parseStack.state = ParserStackType.RESET;\n      this._parseStack.handlers = []; // also release handlers ref\n    }\n  }\n\n  /**\n   * Async parse support.\n   */\n  protected _preserveStack(\n    state: ParserStackType,\n    handlers: ResumableHandlersType,\n    handlerPos: number,\n    transition: number,\n    chunkPos: number\n  ): void {\n    this._parseStack.state = state;\n    this._parseStack.handlers = handlers;\n    this._parseStack.handlerPos = handlerPos;\n    this._parseStack.transition = transition;\n    this._parseStack.chunkPos = chunkPos;\n  }\n\n  /**\n   * Parse UTF32 codepoints in `data` up to `length`.\n   *\n   * Note: For several actions with high data load the parsing is optimized\n   * by using local read ahead loops with hardcoded conditions to\n   * avoid costly table lookups. Make sure that any change of table values\n   * will be reflected in the loop conditions as well and vice versa.\n   * Affected states/actions:\n   * - GROUND:PRINT\n   * - CSI_PARAM:PARAM\n   * - DCS_PARAM:PARAM\n   * - OSC_STRING:OSC_PUT\n   * - DCS_PASSTHROUGH:DCS_PUT\n   *\n   * Note on asynchronous handler support:\n   * Any handler returning a promise will be treated as asynchronous.\n   * To keep the in-band blocking working for async handlers, `parse` pauses execution,\n   * creates a stack save and returns the promise to the caller.\n   * For proper continuation of the paused state it is important\n   * to await the promise resolving. On resolve the parse must be repeated\n   * with the same chunk of data and the resolved value in `promiseResult`\n   * until no promise is returned.\n   *\n   * Important: With only sync handlers defined, parsing is completely synchronous as well.\n   * As soon as an async handler is involved, synchronous parsing is not possible anymore.\n   *\n   * Boilerplate for proper parsing of multiple chunks with async handlers:\n   *\n   * ```typescript\n   * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {\n   *   for (const chunk of chunks) {\n   *     let result: void | Promise<boolean>;\n   *     let prev: boolean | undefined;\n   *     while (result = parser.parse(chunk, chunk.length, prev)) {\n   *       prev = await result;\n   *     }\n   *   }\n   *   // finished parsing all chunks...\n   * }\n   * ```\n   */\n  public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {\n    let code = 0;\n    let transition = 0;\n    let start = 0;\n    let handlerResult: void | boolean | Promise<boolean>;\n\n    // resume from async handler\n    if (this._parseStack.state) {\n      // allow sync parser reset even in continuation mode\n      // Note: can be used to recover parser from improper continuation error below\n      if (this._parseStack.state === ParserStackType.RESET) {\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND\n      } else {\n        if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {\n          /**\n           * Reject further parsing on improper continuation after pausing. This is a really bad\n           * condition with screwed up execution order and prolly messed up terminal state,\n           * therefore we exit hard with an exception and reject any further parsing.\n           *\n           * Note: With `Terminal.write` usage this exception should never occur, as the top level\n           * calls are guaranteed to handle async conditions properly. If you ever encounter this\n           * exception in your terminal integration it indicates, that you injected data chunks to\n           * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for\n           * continuation of a running async handler.\n           *\n           * It is possible to get rid of this error by calling `reset`. But dont rely on that, as\n           * the pending async handler still might mess up the terminal later. Instead fix the\n           * faulty async handling, so this error will not be thrown anymore.\n           */\n          this._parseStack.state = ParserStackType.FAIL;\n          throw new Error('improper continuation due to previous async handler, giving up parsing');\n        }\n\n        // we have to resume the old handler loop if:\n        // - return value of the promise was `false`\n        // - handlers are not exhausted yet\n        const handlers = this._parseStack.handlers;\n        let handlerPos = this._parseStack.handlerPos - 1;\n        switch (this._parseStack.state) {\n          case ParserStackType.CSI:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.ESC:\n            if (promiseResult === false && handlerPos > -1) {\n              for (; handlerPos >= 0; handlerPos--) {\n                handlerResult = (handlers as EscHandlerType[])[handlerPos]();\n                if (handlerResult === true) {\n                  break;\n                } else if (handlerResult instanceof Promise) {\n                  this._parseStack.handlerPos = handlerPos;\n                  return handlerResult;\n                }\n              }\n            }\n            this._parseStack.handlers = [];\n            break;\n          case ParserStackType.DCS:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n          case ParserStackType.OSC:\n            code = data[this._parseStack.chunkPos];\n            handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);\n            if (handlerResult) {\n              return handlerResult;\n            }\n            if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;\n            this._params.reset();\n            this._params.addParam(0); // ZDM\n            this._collect = 0;\n            break;\n        }\n        // cleanup before continuing with the main sync loop\n        this._parseStack.state = ParserStackType.NONE;\n        start = this._parseStack.chunkPos + 1;\n        this.precedingCodepoint = 0;\n        this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;\n      }\n    }\n\n    // continue with main sync loop\n\n    // process input string\n    for (let i = start; i < length; ++i) {\n      code = data[i];\n\n      // normal transition & action lookup\n      transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n      switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n        case ParserAction.PRINT:\n          // read ahead with loop unrolling\n          // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n            if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n              this._printHandler(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.EXECUTE:\n          if (this._executeHandlers[code]) this._executeHandlers[code]();\n          else this._executeHandlerFb(code);\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.IGNORE:\n          break;\n        case ParserAction.ERROR:\n          const inject: IParsingState = this._errorHandler(\n            {\n              position: i,\n              code,\n              currentState: this.currentState,\n              collect: this._collect,\n              params: this._params,\n              abort: false\n            });\n          if (inject.abort) return;\n          // inject values: currently not implemented\n          break;\n        case ParserAction.CSI_DISPATCH:\n          // Trigger CSI Handler\n          const handlers = this._csiHandlers[this._collect << 8 | code];\n          let j = handlers ? handlers.length - 1 : -1;\n          for (; j >= 0; j--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlers[j](this._params);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);\n              return handlerResult;\n            }\n          }\n          if (j < 0) {\n            this._csiHandlerFb(this._collect << 8 | code, this._params);\n          }\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.PARAM:\n          // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n          do {\n            switch (code) {\n              case 0x3b:\n                this._params.addParam(0);  // ZDM\n                break;\n              case 0x3a:\n                this._params.addSubParam(-1);\n                break;\n              default:  // 0x30 - 0x39\n                this._params.addDigit(code - 48);\n            }\n          } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n          i--;\n          break;\n        case ParserAction.COLLECT:\n          this._collect <<= 8;\n          this._collect |= code;\n          break;\n        case ParserAction.ESC_DISPATCH:\n          const handlersEsc = this._escHandlers[this._collect << 8 | code];\n          let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n          for (; jj >= 0; jj--) {\n            // true means success and to stop bubbling\n            // a promise indicates an async handler that needs to finish before progressing\n            handlerResult = handlersEsc[jj]();\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);\n              return handlerResult;\n            }\n          }\n          if (jj < 0) {\n            this._escHandlerFb(this._collect << 8 | code);\n          }\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.CLEAR:\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          break;\n        case ParserAction.DCS_HOOK:\n          this._dcsParser.hook(this._collect << 8 | code, this._params);\n          break;\n        case ParserAction.DCS_PUT:\n          // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n          // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n          for (let j = i + 1; ; ++j) {\n            if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._dcsParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.DCS_UNHOOK:\n          handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.DCS, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n        case ParserAction.OSC_START:\n          this._oscParser.start();\n          break;\n        case ParserAction.OSC_PUT:\n          // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n          for (let j = i + 1; ; j++) {\n            if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n              this._oscParser.put(data, i, j);\n              i = j - 1;\n              break;\n            }\n          }\n          break;\n        case ParserAction.OSC_END:\n          handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);\n          if (handlerResult) {\n            this._preserveStack(ParserStackType.OSC, [], 0, transition, i);\n            return handlerResult;\n          }\n          if (code === 0x1b) transition |= ParserState.ESCAPE;\n          this._params.reset();\n          this._params.addParam(0); // ZDM\n          this._collect = 0;\n          this.precedingCodepoint = 0;\n          break;\n      }\n      this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\nconst EMPTY_HANDLERS: IOscHandler[] = [];\n\nexport class OscParser implements IOscParser {\n  private _state = OscState.START;\n  private _active = EMPTY_HANDLERS;\n  private _id = -1;\n  private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n  private _handlerFb: OscFallbackHandlerType = () => { };\n  private _stack: ISubParserStackState = {\n    paused: false,\n    loopPosition: 0,\n    fallThrough: false\n  };\n\n  public registerHandler(ident: number, handler: IOscHandler): IDisposable {\n    if (this._handlers[ident] === undefined) {\n      this._handlers[ident] = [];\n    }\n    const handlerList = this._handlers[ident];\n    handlerList.push(handler);\n    return {\n      dispose: () => {\n        const handlerIndex = handlerList.indexOf(handler);\n        if (handlerIndex !== -1) {\n          handlerList.splice(handlerIndex, 1);\n        }\n      }\n    };\n  }\n  public clearHandler(ident: number): void {\n    if (this._handlers[ident]) delete this._handlers[ident];\n  }\n  public setHandlerFallback(handler: OscFallbackHandlerType): void {\n    this._handlerFb = handler;\n  }\n\n  public dispose(): void {\n    this._handlers = Object.create(null);\n    this._handlerFb = () => { };\n    this._active = EMPTY_HANDLERS;\n  }\n\n  public reset(): void {\n    // force cleanup handlers if payload was already sent\n    if (this._state === OscState.PAYLOAD) {\n      for (let j = this._stack.paused ? this._stack.loopPosition - 1 : this._active.length - 1; j >= 0; --j) {\n        this._active[j].end(false);\n      }\n    }\n    this._stack.paused = false;\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n\n  private _start(): void {\n    this._active = this._handlers[this._id] || EMPTY_HANDLERS;\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'START');\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].start();\n      }\n    }\n  }\n\n  private _put(data: Uint32Array, start: number, end: number): void {\n    if (!this._active.length) {\n      this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n    } else {\n      for (let j = this._active.length - 1; j >= 0; j--) {\n        this._active[j].put(data, start, end);\n      }\n    }\n  }\n\n  public start(): void {\n    // always reset leftover handlers\n    this.reset();\n    this._state = OscState.ID;\n  }\n\n  /**\n   * Put data to current OSC command.\n   * Expects the identifier of the OSC command in the form\n   * OSC id ; payload ST/BEL\n   * Payload chunks are not further processed and get\n   * directly passed to the handlers.\n   */\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._state === OscState.ABORT) {\n      return;\n    }\n    if (this._state === OscState.ID) {\n      while (start < end) {\n        const code = data[start++];\n        if (code === 0x3b) {\n          this._state = OscState.PAYLOAD;\n          this._start();\n          break;\n        }\n        if (code < 0x30 || 0x39 < code) {\n          this._state = OscState.ABORT;\n          return;\n        }\n        if (this._id === -1) {\n          this._id = 0;\n        }\n        this._id = this._id * 10 + code - 48;\n      }\n    }\n    if (this._state === OscState.PAYLOAD && end - start > 0) {\n      this._put(data, start, end);\n    }\n  }\n\n  /**\n   * Indicates end of an OSC command.\n   * Whether the OSC got aborted or finished normally\n   * is indicated by `success`.\n   */\n  public end(success: boolean, promiseResult: boolean = true): void | Promise<boolean> {\n    if (this._state === OscState.START) {\n      return;\n    }\n    // do nothing if command was faulty\n    if (this._state !== OscState.ABORT) {\n      // if we are still in ID state and get an early end\n      // means that the command has no payload thus we still have\n      // to announce START and send END right after\n      if (this._state === OscState.ID) {\n        this._start();\n      }\n\n      if (!this._active.length) {\n        this._handlerFb(this._id, 'END', success);\n      } else {\n        let handlerResult: boolean | Promise<boolean> = false;\n        let j = this._active.length - 1;\n        let fallThrough = false;\n        if (this._stack.paused) {\n          j = this._stack.loopPosition - 1;\n          handlerResult = promiseResult;\n          fallThrough = this._stack.fallThrough;\n          this._stack.paused = false;\n        }\n        if (!fallThrough && handlerResult === false) {\n          for (; j >= 0; j--) {\n            handlerResult = this._active[j].end(success);\n            if (handlerResult === true) {\n              break;\n            } else if (handlerResult instanceof Promise) {\n              this._stack.paused = true;\n              this._stack.loopPosition = j;\n              this._stack.fallThrough = false;\n              return handlerResult;\n            }\n          }\n          j--;\n        }\n        // cleanup left over handlers\n        // we always have to call .end for proper cleanup,\n        // here we use `success` to indicate whether a handler should execute\n        for (; j >= 0; j--) {\n          handlerResult = this._active[j].end(false);\n          if (handlerResult instanceof Promise) {\n            this._stack.paused = true;\n            this._stack.loopPosition = j;\n            this._stack.fallThrough = true;\n            return handlerResult;\n          }\n        }\n      }\n\n    }\n    this._active = EMPTY_HANDLERS;\n    this._id = -1;\n    this._state = OscState.START;\n  }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n  private _data = '';\n  private _hitLimit: boolean = false;\n\n  constructor(private _handler: (data: string) => boolean | Promise<boolean>) { }\n\n  public start(): void {\n    this._data = '';\n    this._hitLimit = false;\n  }\n\n  public put(data: Uint32Array, start: number, end: number): void {\n    if (this._hitLimit) {\n      return;\n    }\n    this._data += utf32ToString(data, start, end);\n    if (this._data.length > PAYLOAD_LIMIT) {\n      this._data = '';\n      this._hitLimit = true;\n    }\n  }\n\n  public end(success: boolean): boolean | Promise<boolean> {\n    let ret: boolean | Promise<boolean> = false;\n    if (this._hitLimit) {\n      ret = false;\n    } else if (success) {\n      ret = this._handler(this._data);\n      if (ret instanceof Promise) {\n        // need to hold data until `ret` got resolved\n        // dont care for errors, data will be freed anyway on next start\n        return ret.then(res => {\n          this._data = '';\n          this._hitLimit = false;\n          return res;\n        });\n      }\n    }\n    this._data = '';\n    this._hitLimit = false;\n    return ret;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n *  - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n *  - never read beyond `params.length - 1` (likely to contain arbitrary data)\n *  - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n *  - hardcoded limitations:\n *    - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n *    - max. 256 sub params possible\n *    - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n  // params store and length\n  public params: Int32Array;\n  public length: number;\n\n  // sub params store and length\n  protected _subParams: Int32Array;\n  protected _subParamsLength: number;\n\n  // sub params offsets from param: param idx --> [start, end] offset\n  private _subParamsIdx: Uint16Array;\n  private _rejectDigits: boolean;\n  private _rejectSubDigits: boolean;\n  private _digitIsSub: boolean;\n\n  /**\n   * Create a `Params` type from JS array representation.\n   */\n  public static fromArray(values: ParamsArray): Params {\n    const params = new Params();\n    if (!values.length) {\n      return params;\n    }\n    // skip leading sub params\n    for (let i = (Array.isArray(values[0])) ? 1 : 0; i < values.length; ++i) {\n      const value = values[i];\n      if (Array.isArray(value)) {\n        for (let k = 0; k < value.length; ++k) {\n          params.addSubParam(value[k]);\n        }\n      } else {\n        params.addParam(value);\n      }\n    }\n    return params;\n  }\n\n  /**\n   * @param maxLength max length of storable parameters\n   * @param maxSubParamsLength max length of storable sub parameters\n   */\n  constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n    if (maxSubParamsLength > MAX_SUBPARAMS) {\n      throw new Error('maxSubParamsLength must not be greater than 256');\n    }\n    this.params = new Int32Array(maxLength);\n    this.length = 0;\n    this._subParams = new Int32Array(maxSubParamsLength);\n    this._subParamsLength = 0;\n    this._subParamsIdx = new Uint16Array(maxLength);\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Clone object.\n   */\n  public clone(): Params {\n    const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n    newParams.params.set(this.params);\n    newParams.length = this.length;\n    newParams._subParams.set(this._subParams);\n    newParams._subParamsLength = this._subParamsLength;\n    newParams._subParamsIdx.set(this._subParamsIdx);\n    newParams._rejectDigits = this._rejectDigits;\n    newParams._rejectSubDigits = this._rejectSubDigits;\n    newParams._digitIsSub = this._digitIsSub;\n    return newParams;\n  }\n\n  /**\n   * Get a JS array representation of the current parameters and sub parameters.\n   * The array is structured as follows:\n   *    sequence: \"1;2:3:4;5::6\"\n   *    array   : [1, 2, [3, 4], 5, [-1, 6]]\n   */\n  public toArray(): ParamsArray {\n    const res: ParamsArray = [];\n    for (let i = 0; i < this.length; ++i) {\n      res.push(this.params[i]);\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        res.push(Array.prototype.slice.call(this._subParams, start, end));\n      }\n    }\n    return res;\n  }\n\n  /**\n   * Reset to initial empty state.\n   */\n  public reset(): void {\n    this.length = 0;\n    this._subParamsLength = 0;\n    this._rejectDigits = false;\n    this._rejectSubDigits = false;\n    this._digitIsSub = false;\n  }\n\n  /**\n   * Add a parameter value.\n   * `Params` only stores up to `maxLength` parameters, any later\n   * parameter will be ignored.\n   * Note: VT devices only stored up to 16 values, xterm seems to\n   * store up to 30.\n   */\n  public addParam(value: number): void {\n    this._digitIsSub = false;\n    if (this.length >= this.maxLength) {\n      this._rejectDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n    this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n  }\n\n  /**\n   * Add a sub parameter value.\n   * The sub parameter is automatically associated with the last parameter value.\n   * Thus it is not possible to add a subparameter without any parameter added yet.\n   * `Params` only stores up to `subParamsLength` sub parameters, any later\n   * sub parameter will be ignored.\n   */\n  public addSubParam(value: number): void {\n    this._digitIsSub = true;\n    if (!this.length) {\n      return;\n    }\n    if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n      this._rejectSubDigits = true;\n      return;\n    }\n    if (value < -1) {\n      throw new Error('values lesser than -1 are not allowed');\n    }\n    this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n    this._subParamsIdx[this.length - 1]++;\n  }\n\n  /**\n   * Whether parameter at index `idx` has sub parameters.\n   */\n  public hasSubParams(idx: number): boolean {\n    return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n  }\n\n  /**\n   * Return sub parameters for parameter at index `idx`.\n   * Note: The values are borrowed, thus you need to copy\n   * the values if you need to hold them in nonlocal scope.\n   */\n  public getSubParams(idx: number): Int32Array | null {\n    const start = this._subParamsIdx[idx] >> 8;\n    const end = this._subParamsIdx[idx] & 0xFF;\n    if (end - start > 0) {\n      return this._subParams.subarray(start, end);\n    }\n    return null;\n  }\n\n  /**\n   * Return all sub parameters as {idx: subparams} mapping.\n   * Note: The values are not borrowed.\n   */\n  public getSubParamsAll(): {[idx: number]: Int32Array} {\n    const result: {[idx: number]: Int32Array} = {};\n    for (let i = 0; i < this.length; ++i) {\n      const start = this._subParamsIdx[i] >> 8;\n      const end = this._subParamsIdx[i] & 0xFF;\n      if (end - start > 0) {\n        result[i] = this._subParams.slice(start, end);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Add a single digit value to current parameter.\n   * This is used by the parser to account digits on a char by char basis.\n   */\n  public addDigit(value: number): void {\n    let length;\n    if (this._rejectDigits\n      || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n      || (this._digitIsSub && this._rejectSubDigits)\n    ) {\n      return;\n    }\n\n    const store = this._digitIsSub ? this._subParams : this.params;\n    const cur = store[length - 1];\n    store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from 'xterm';\n\nexport interface ILoadedAddon {\n  instance: ITerminalAddon;\n  dispose: () => void;\n  isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n  protected _addons: ILoadedAddon[] = [];\n\n  public dispose(): void {\n    for (let i = this._addons.length - 1; i >= 0; i--) {\n      this._addons[i].instance.dispose();\n    }\n  }\n\n  public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n    const loadedAddon: ILoadedAddon = {\n      instance,\n      dispose: instance.dispose,\n      isDisposed: false\n    };\n    this._addons.push(loadedAddon);\n    instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n    instance.activate(terminal as any);\n  }\n\n  private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n    if (loadedAddon.isDisposed) {\n      // Do nothing if already disposed\n      return;\n    }\n    let index = -1;\n    for (let i = 0; i < this._addons.length; i++) {\n      if (this._addons[i] === loadedAddon) {\n        index = i;\n        break;\n      }\n    }\n    if (index === -1) {\n      throw new Error('Could not dispose an addon that has not been loaded');\n    }\n    loadedAddon.isDisposed = true;\n    loadedAddon.dispose.apply(loadedAddon.instance);\n    this._addons.splice(index, 1);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from 'xterm';\nimport { IBuffer } from 'common/buffer/Types';\nimport { BufferLineApiView } from 'common/public/BufferLineApiView';\nimport { CellData } from 'common/buffer/CellData';\n\nexport class BufferApiView implements IBufferApi {\n  constructor(\n    private _buffer: IBuffer,\n    public readonly type: 'normal' | 'alternate'\n  ) { }\n\n  public init(buffer: IBuffer): BufferApiView {\n    this._buffer = buffer;\n    return this;\n  }\n\n  public get cursorY(): number { return this._buffer.y; }\n  public get cursorX(): number { return this._buffer.x; }\n  public get viewportY(): number { return this._buffer.ydisp; }\n  public get baseY(): number { return this._buffer.ybase; }\n  public get length(): number { return this._buffer.lines.length; }\n  public getLine(y: number): IBufferLineApi | undefined {\n    const line = this._buffer.lines.get(y);\n    if (!line) {\n      return undefined;\n    }\n    return new BufferLineApiView(line);\n  }\n  public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from 'xterm';\n\nexport class BufferLineApiView implements IBufferLineApi {\n  constructor(private _line: IBufferLine) { }\n\n  public get isWrapped(): boolean { return this._line.isWrapped; }\n  public get length(): number { return this._line.length; }\n  public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n    if (x < 0 || x >= this._line.length) {\n      return undefined;\n    }\n\n    if (cell) {\n      this._line.loadCell(x, cell as ICellData);\n      return cell;\n    }\n    return this._line.loadCell(x, new CellData());\n  }\n  public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n    return this._line.translateToString(trimRight, startColumn, endColumn);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm';\nimport { BufferApiView } from 'common/public/BufferApiView';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICoreTerminal } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\n\nexport class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {\n  private _normal: BufferApiView;\n  private _alternate: BufferApiView;\n\n  private readonly _onBufferChange = this.register(new EventEmitter<IBufferApi>());\n  public readonly onBufferChange = this._onBufferChange.event;\n\n  constructor(private _core: ICoreTerminal) {\n    super();\n    this._normal = new BufferApiView(this._core.buffers.normal, 'normal');\n    this._alternate = new BufferApiView(this._core.buffers.alt, 'alternate');\n    this._core.buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n  }\n  public get active(): IBufferApi {\n    if (this._core.buffers.active === this._core.buffers.normal) { return this.normal; }\n    if (this._core.buffers.active === this._core.buffers.alt) { return this.alternate; }\n    throw new Error('Active buffer is neither normal nor alternate');\n  }\n  public get normal(): IBufferApi {\n    return this._normal.init(this._core.buffers.normal);\n  }\n  public get alternate(): IBufferApi {\n    return this._alternate.init(this._core.buffers.alt);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParams } from 'common/parser/Types';\nimport { IDisposable, IFunctionIdentifier, IParser } from 'xterm';\nimport { ICoreTerminal } from 'common/Types';\n\nexport class ParserApi implements IParser {\n  constructor(private _core: ICoreTerminal) { }\n\n  public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerCsiHandler(id, (params: IParams) => callback(params.toArray()));\n  }\n  public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerCsiHandler(id, callback);\n  }\n  public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n  }\n  public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean | Promise<boolean>): IDisposable {\n    return this.registerDcsHandler(id, callback);\n  }\n  public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerEscHandler(id, handler);\n  }\n  public addEscHandler(id: IFunctionIdentifier, handler: () => boolean | Promise<boolean>): IDisposable {\n    return this.registerEscHandler(id, handler);\n  }\n  public registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this._core.registerOscHandler(ident, callback);\n  }\n  public addOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable {\n    return this.registerOscHandler(ident, callback);\n  }\n}\n","/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreTerminal } from 'common/Types';\nimport { IUnicodeHandling, IUnicodeVersionProvider } from 'xterm';\n\nexport class UnicodeApi implements IUnicodeHandling {\n  constructor(private _core: ICoreTerminal) { }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._core.unicodeService.register(provider);\n  }\n\n  public get versions(): string[] {\n    return this._core.unicodeService.versions;\n  }\n\n  public get activeVersion(): string {\n    return this._core.unicodeService.activeVersion;\n  }\n\n  public set activeVersion(version: string) {\n    this._core.unicodeService.activeVersion = version;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IAttributeData, IBufferLine, ScrollSource } from 'common/Types';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n  public serviceBrand: any;\n\n  public cols: number;\n  public rows: number;\n  public buffers: IBufferSet;\n  /** Whether the user is scrolling (locks the scroll position) */\n  public isUserScrolling: boolean = false;\n\n  private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());\n  public readonly onResize = this._onResize.event;\n  private readonly _onScroll = this.register(new EventEmitter<number>());\n  public readonly onScroll = this._onScroll.event;\n\n  public get buffer(): IBuffer { return this.buffers.active; }\n\n  /** An IBufferline to clone/copy from for new blank lines */\n  private _cachedBlankLine: IBufferLine | undefined;\n\n  constructor(@IOptionsService optionsService: IOptionsService) {\n    super();\n    this.cols = Math.max(optionsService.rawOptions.cols || 0, MINIMUM_COLS);\n    this.rows = Math.max(optionsService.rawOptions.rows || 0, MINIMUM_ROWS);\n    this.buffers = this.register(new BufferSet(optionsService, this));\n  }\n\n  public resize(cols: number, rows: number): void {\n    this.cols = cols;\n    this.rows = rows;\n    this.buffers.resize(cols, rows);\n    // TODO: This doesn't fire when scrollback changes - add a resize event to BufferSet and forward\n    //       event\n    this._onResize.fire({ cols, rows });\n  }\n\n  public reset(): void {\n    this.buffers.reset();\n    this.isUserScrolling = false;\n  }\n\n  /**\n   * Scroll the terminal down 1 row, creating a blank line.\n   * @param eraseAttr The attribute data to use the for blank line.\n   * @param isWrapped Whether the new line is wrapped from the previous line.\n   */\n  public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n    const buffer = this.buffer;\n\n    let newLine: IBufferLine | undefined;\n    newLine = this._cachedBlankLine;\n    if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n      newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n      this._cachedBlankLine = newLine;\n    }\n    newLine.isWrapped = isWrapped;\n\n    const topRow = buffer.ybase + buffer.scrollTop;\n    const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n    if (buffer.scrollTop === 0) {\n      // Determine whether the buffer is going to be trimmed after insertion.\n      const willBufferBeTrimmed = buffer.lines.isFull;\n\n      // Insert the line using the fastest method\n      if (bottomRow === buffer.lines.length - 1) {\n        if (willBufferBeTrimmed) {\n          buffer.lines.recycle().copyFrom(newLine);\n        } else {\n          buffer.lines.push(newLine.clone());\n        }\n      } else {\n        buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n      }\n\n      // Only adjust ybase and ydisp when the buffer is not trimmed\n      if (!willBufferBeTrimmed) {\n        buffer.ybase++;\n        // Only scroll the ydisp with ybase if the user has not scrolled up\n        if (!this.isUserScrolling) {\n          buffer.ydisp++;\n        }\n      } else {\n        // When the buffer is full and the user has scrolled up, keep the text\n        // stable unless ydisp is right at the top\n        if (this.isUserScrolling) {\n          buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n        }\n      }\n    } else {\n      // scrollTop is non-zero which means no line will be going to the\n      // scrollback, instead we can just shift them in-place.\n      const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n      buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n      buffer.lines.set(bottomRow, newLine.clone());\n    }\n\n    // Move the viewport to the bottom of the buffer unless the user is\n    // scrolling.\n    if (!this.isUserScrolling) {\n      buffer.ydisp = buffer.ybase;\n    }\n\n    this._onScroll.fire(buffer.ydisp);\n  }\n\n  /**\n   * Scroll the display of the terminal\n   * @param disp The number of lines to scroll down (negative scroll up).\n   * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n   * to avoid unwanted events being handled by the viewport when the event was triggered from the\n   * viewport originally.\n   */\n  public scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void {\n    const buffer = this.buffer;\n    if (disp < 0) {\n      if (buffer.ydisp === 0) {\n        return;\n      }\n      this.isUserScrolling = true;\n    } else if (disp + buffer.ydisp >= buffer.ybase) {\n      this.isUserScrolling = false;\n    }\n\n    const oldYdisp = buffer.ydisp;\n    buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n    // No change occurred, don't trigger scroll/refresh\n    if (oldYdisp === buffer.ydisp) {\n      return;\n    }\n\n    if (!suppressScrollEvent) {\n      this._onScroll.fire(buffer.ydisp);\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n  public serviceBrand: any;\n\n  public charset: ICharset | undefined;\n  public glevel: number = 0;\n\n  private _charsets: (ICharset | undefined)[] = [];\n\n  public reset(): void {\n    this.charset = undefined;\n    this._charsets = [];\n    this.glevel = 0;\n  }\n\n  public setgLevel(g: number): void {\n    this.glevel = g;\n    this.charset = this._charsets[g];\n  }\n\n  public setgCharset(g: number, charset: ICharset | undefined): void {\n    this._charsets[g] = charset;\n    if (this.glevel === g) {\n      this.charset = charset;\n    }\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: { [key: string]: ICoreMouseProtocol } = {\n  /**\n   * NONE\n   * Events: none\n   * Modifiers: none\n   */\n  NONE: {\n    events: CoreMouseEventType.NONE,\n    restrict: () => false\n  },\n  /**\n   * X10\n   * Events: mousedown\n   * Modifiers: none\n   */\n  X10: {\n    events: CoreMouseEventType.DOWN,\n    restrict: (e: ICoreMouseEvent) => {\n      // no wheel, no move, no up\n      if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n        return false;\n      }\n      // no modifiers\n      e.ctrl = false;\n      e.alt = false;\n      e.shift = false;\n      return true;\n    }\n  },\n  /**\n   * VT200\n   * Events: mousedown / mouseup / wheel\n   * Modifiers: all\n   */\n  VT200: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move\n      if (e.action === CoreMouseAction.MOVE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * DRAG\n   * Events: mousedown / mouseup / wheel / mousedrag\n   * Modifiers: all\n   */\n  DRAG: {\n    events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n    restrict: (e: ICoreMouseEvent) => {\n      // no move without button\n      if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n        return false;\n      }\n      return true;\n    }\n  },\n  /**\n   * ANY\n   * Events: all mouse related events\n   * Modifiers: all\n   */\n  ANY: {\n    events:\n      CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n      | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n    restrict: (e: ICoreMouseEvent) => true\n  }\n};\n\nconst enum Modifiers {\n  SHIFT = 4,\n  ALT = 8,\n  CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n  let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n  if (e.button === CoreMouseButton.WHEEL) {\n    code |= 64;\n    code |= e.action;\n  } else {\n    code |= e.button & 3;\n    if (e.button & 4) {\n      code |= 64;\n    }\n    if (e.button & 8) {\n      code |= 128;\n    }\n    if (e.action === CoreMouseAction.MOVE) {\n      code |= CoreMouseAction.MOVE;\n    } else if (e.action === CoreMouseAction.UP && !isSGR) {\n      // special case - only SGR can report button on release\n      // all others have to go with NONE\n      code |= CoreMouseButton.NONE;\n    }\n  }\n  return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = {\n  /**\n   * DEFAULT - CSI M Pb Px Py\n   * Single byte encoding for coords and event code.\n   * Can encode values up to 223 (1-based).\n   */\n  DEFAULT: (e: ICoreMouseEvent) => {\n    const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n    // supress mouse report if we exceed addressible range\n    // Note this is handled differently by emulators\n    // - xterm:         sends 0;0 coords instead\n    // - vte, konsole:  no report\n    if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n      return '';\n    }\n    return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n  },\n  /**\n   * SGR - CSI < Pb ; Px ; Py M|m\n   * No encoding limitation.\n   * Can report button on release and works with a well formed sequence.\n   */\n  SGR: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n  },\n  SGR_PIXELS: (e: ICoreMouseEvent) => {\n    const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n    return `\\x1b[<${eventCode(e, true)};${e.x};${e.y}${final}`;\n  }\n};\n\n/**\n * CoreMouseService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n *  - protocols: NONE (default), X10, VT200, DRAG, ANY\n *  - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class CoreMouseService extends Disposable implements ICoreMouseService {\n  private _protocols: { [name: string]: ICoreMouseProtocol } = {};\n  private _encodings: { [name: string]: CoreMouseEncoding } = {};\n  private _activeProtocol: string = '';\n  private _activeEncoding: string = '';\n  private _lastEvent: ICoreMouseEvent | null = null;\n\n  private readonly _onProtocolChange = this.register(new EventEmitter<CoreMouseEventType>());\n  public readonly onProtocolChange =  this._onProtocolChange.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ICoreService private readonly _coreService: ICoreService\n  ) {\n    super();\n    // register default protocols and encodings\n    for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n    for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n    // call reset to set defaults\n    this.reset();\n  }\n\n  public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n    this._protocols[name] = protocol;\n  }\n\n  public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n    this._encodings[name] = encoding;\n  }\n\n  public get activeProtocol(): string {\n    return this._activeProtocol;\n  }\n\n  public get areMouseEventsActive(): boolean {\n    return this._protocols[this._activeProtocol].events !== 0;\n  }\n\n  public set activeProtocol(name: string) {\n    if (!this._protocols[name]) {\n      throw new Error(`unknown protocol \"${name}\"`);\n    }\n    this._activeProtocol = name;\n    this._onProtocolChange.fire(this._protocols[name].events);\n  }\n\n  public get activeEncoding(): string {\n    return this._activeEncoding;\n  }\n\n  public set activeEncoding(name: string) {\n    if (!this._encodings[name]) {\n      throw new Error(`unknown encoding \"${name}\"`);\n    }\n    this._activeEncoding = name;\n  }\n\n  public reset(): void {\n    this.activeProtocol = 'NONE';\n    this.activeEncoding = 'DEFAULT';\n    this._lastEvent = null;\n  }\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  public triggerMouseEvent(e: ICoreMouseEvent): boolean {\n    // range check for col/row\n    if (e.col < 0 || e.col >= this._bufferService.cols\n      || e.row < 0 || e.row >= this._bufferService.rows) {\n      return false;\n    }\n\n    // filter nonsense combinations of button + action\n    if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n      return false;\n    }\n    if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n      return false;\n    }\n\n    // report 1-based coords\n    e.col++;\n    e.row++;\n\n    // debounce move events at grid or pixel level\n    if (e.action === CoreMouseAction.MOVE\n      && this._lastEvent\n      && this._equalEvents(this._lastEvent, e, this._activeEncoding === 'SGR_PIXELS')\n    ) {\n      return false;\n    }\n\n    // apply protocol restrictions\n    if (!this._protocols[this._activeProtocol].restrict(e)) {\n      return false;\n    }\n\n    // encode report and send\n    const report = this._encodings[this._activeEncoding](e);\n    if (report) {\n      // always send DEFAULT as binary data\n      if (this._activeEncoding === 'DEFAULT') {\n        this._coreService.triggerBinaryEvent(report);\n      } else {\n        this._coreService.triggerDataEvent(report, true);\n      }\n    }\n\n    this._lastEvent = e;\n\n    return true;\n  }\n\n  public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {\n    return {\n      down: !!(events & CoreMouseEventType.DOWN),\n      up: !!(events & CoreMouseEventType.UP),\n      drag: !!(events & CoreMouseEventType.DRAG),\n      move: !!(events & CoreMouseEventType.MOVE),\n      wheel: !!(events & CoreMouseEventType.WHEEL)\n    };\n  }\n\n  private _equalEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent, pixels: boolean): boolean {\n    if (pixels) {\n      if (e1.x !== e2.x) return false;\n      if (e1.y !== e2.y) return false;\n    } else {\n      if (e1.col !== e2.col) return false;\n      if (e1.row !== e2.row) return false;\n    }\n    if (e1.button !== e2.button) return false;\n    if (e1.action !== e2.action) return false;\n    if (e1.ctrl !== e2.ctrl) return false;\n    if (e1.alt !== e2.alt) return false;\n    if (e1.shift !== e2.shift) return false;\n    return true;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { clone } from 'common/Clone';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDecPrivateModes, IModes } from 'common/Types';\nimport { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n  insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n  applicationCursorKeys: false,\n  applicationKeypad: false,\n  bracketedPasteMode: false,\n  origin: false,\n  reverseWraparound: false,\n  sendFocus: false,\n  wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n  public serviceBrand: any;\n\n  public isCursorInitialized: boolean = false;\n  public isCursorHidden: boolean = false;\n  public modes: IModes;\n  public decPrivateModes: IDecPrivateModes;\n\n  private readonly _onData = this.register(new EventEmitter<string>());\n  public readonly onData = this._onData.event;\n  private readonly _onUserInput = this.register(new EventEmitter<void>());\n  public readonly onUserInput = this._onUserInput.event;\n  private readonly _onBinary = this.register(new EventEmitter<string>());\n  public readonly onBinary = this._onBinary.event;\n  private readonly _onRequestScrollToBottom = this.register(new EventEmitter<void>());\n  public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService,\n    @ILogService private readonly _logService: ILogService,\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n  }\n\n  public reset(): void {\n    this.modes = clone(DEFAULT_MODES);\n    this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n  }\n\n  public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n    // Prevents all events to pty process if stdin is disabled\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n\n    // Input is being sent to the terminal, the terminal should focus the prompt.\n    const buffer = this._bufferService.buffer;\n    if (wasUserInput && this._optionsService.rawOptions.scrollOnUserInput && buffer.ybase !== buffer.ydisp) {\n      this._onRequestScrollToBottom.fire();\n    }\n\n    // Fire onUserInput so listeners can react as well (eg. clear selection)\n    if (wasUserInput) {\n      this._onUserInput.fire();\n    }\n\n    // Fire onData API\n    this._logService.debug(`sending data \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onData.fire(data);\n  }\n\n  public triggerBinaryEvent(data: string): void {\n    if (this._optionsService.rawOptions.disableStdin) {\n      return;\n    }\n    this._logService.debug(`sending binary \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n    this._onBinary.fire(data);\n  }\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { css } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IDecorationService, IInternalDecoration } from 'common/services/Services';\nimport { SortedList } from 'common/SortedList';\nimport { IColor } from 'common/Types';\nimport { IDecoration, IDecorationOptions, IMarker } from 'xterm';\n\n// Work variables to avoid garbage collection\nlet $xmin = 0;\nlet $xmax = 0;\n\nexport class DecorationService extends Disposable implements IDecorationService {\n  public serviceBrand: any;\n\n  /**\n   * A list of all decorations, sorted by the marker's line value. This relies on the fact that\n   * while marker line values do change, they should all change by the same amount so this should\n   * never become out of order.\n   */\n  private readonly _decorations: SortedList<IInternalDecoration> = new SortedList(e => e?.marker.line);\n\n  private readonly _onDecorationRegistered = this.register(new EventEmitter<IInternalDecoration>());\n  public readonly onDecorationRegistered = this._onDecorationRegistered.event;\n  private readonly _onDecorationRemoved = this.register(new EventEmitter<IInternalDecoration>());\n  public readonly onDecorationRemoved = this._onDecorationRemoved.event;\n\n  public get decorations(): IterableIterator<IInternalDecoration> { return this._decorations.values(); }\n\n  constructor() {\n    super();\n\n    this.register(toDisposable(() => this.reset()));\n  }\n\n  public registerDecoration(options: IDecorationOptions): IDecoration | undefined {\n    if (options.marker.isDisposed) {\n      return undefined;\n    }\n    const decoration = new Decoration(options);\n    if (decoration) {\n      const markerDispose = decoration.marker.onDispose(() => decoration.dispose());\n      decoration.onDispose(() => {\n        if (decoration) {\n          if (this._decorations.delete(decoration)) {\n            this._onDecorationRemoved.fire(decoration);\n          }\n          markerDispose.dispose();\n        }\n      });\n      this._decorations.insert(decoration);\n      this._onDecorationRegistered.fire(decoration);\n    }\n    return decoration;\n  }\n\n  public reset(): void {\n    for (const d of this._decorations.values()) {\n      d.dispose();\n    }\n    this._decorations.clear();\n  }\n\n  public *getDecorationsAtCell(x: number, line: number, layer?: 'bottom' | 'top'): IterableIterator<IInternalDecoration> {\n    let xmin = 0;\n    let xmax = 0;\n    for (const d of this._decorations.getKeyIterator(line)) {\n      xmin = d.options.x ?? 0;\n      xmax = xmin + (d.options.width ?? 1);\n      if (x >= xmin && x < xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        yield d;\n      }\n    }\n  }\n\n  public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void {\n    this._decorations.forEachByKey(line, d => {\n      $xmin = d.options.x ?? 0;\n      $xmax = $xmin + (d.options.width ?? 1);\n      if (x >= $xmin && x < $xmax && (!layer || (d.options.layer ?? 'bottom') === layer)) {\n        callback(d);\n      }\n    });\n  }\n}\n\nclass Decoration extends Disposable implements IInternalDecoration {\n  public readonly marker: IMarker;\n  public element: HTMLElement | undefined;\n  public get isDisposed(): boolean { return this._isDisposed; }\n\n  public readonly onRenderEmitter = this.register(new EventEmitter<HTMLElement>());\n  public readonly onRender = this.onRenderEmitter.event;\n  private readonly _onDispose = this.register(new EventEmitter<void>());\n  public readonly onDispose = this._onDispose.event;\n\n  private _cachedBg: IColor | undefined | null = null;\n  public get backgroundColorRGB(): IColor | undefined {\n    if (this._cachedBg === null) {\n      if (this.options.backgroundColor) {\n        this._cachedBg = css.toColor(this.options.backgroundColor);\n      } else {\n        this._cachedBg = undefined;\n      }\n    }\n    return this._cachedBg;\n  }\n\n  private _cachedFg: IColor | undefined | null = null;\n  public get foregroundColorRGB(): IColor | undefined {\n    if (this._cachedFg === null) {\n      if (this.options.foregroundColor) {\n        this._cachedFg = css.toColor(this.options.foregroundColor);\n      } else {\n        this._cachedFg = undefined;\n      }\n    }\n    return this._cachedFg;\n  }\n\n  constructor(\n    public readonly options: IDecorationOptions\n  ) {\n    super();\n    this.marker = options.marker;\n    if (this.options.overviewRulerOptions && !this.options.overviewRulerOptions.position) {\n      this.options.overviewRulerOptions.position = 'full';\n    }\n  }\n\n  public override dispose(): void {\n    this._onDispose.fire();\n    super.dispose();\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n  private _entries = new Map<IServiceIdentifier<any>, any>();\n\n  constructor(...entries: [IServiceIdentifier<any>, any][]) {\n    for (const [id, service] of entries) {\n      this.set(id, service);\n    }\n  }\n\n  public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n    const result = this._entries.get(id);\n    this._entries.set(id, instance);\n    return result;\n  }\n\n  public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n    for (const [key, value] of this._entries.entries()) {\n      callback(key, value);\n    }\n  }\n\n  public has(id: IServiceIdentifier<any>): boolean {\n    return this._entries.has(id);\n  }\n\n  public get<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._entries.get(id);\n  }\n}\n\nexport class InstantiationService implements IInstantiationService {\n  public serviceBrand: undefined;\n\n  private readonly _services: ServiceCollection = new ServiceCollection();\n\n  constructor() {\n    this._services.set(IInstantiationService, this);\n  }\n\n  public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n    this._services.set(id, instance);\n  }\n\n  public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n    return this._services.get(id);\n  }\n\n  public createInstance<T>(ctor: any, ...args: any[]): T {\n    const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n    const serviceArgs: any[] = [];\n    for (const dependency of serviceDependencies) {\n      const service = this._services.get(dependency.id);\n      if (!service) {\n        throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`);\n      }\n      serviceArgs.push(service);\n    }\n\n    const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n    // check for argument mismatches, adjust static args if needed\n    if (args.length !== firstServiceArgPos) {\n      throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n    }\n\n    // now create the instance\n    return new ctor(...[...args, ...serviceArgs]);\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n  log: LogType;\n  error: LogType;\n  info: LogType;\n  trace: LogType;\n  warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n  trace: LogLevelEnum.TRACE,\n  debug: LogLevelEnum.DEBUG,\n  info: LogLevelEnum.INFO,\n  warn: LogLevelEnum.WARN,\n  error: LogLevelEnum.ERROR,\n  off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n  public serviceBrand: any;\n\n  private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n  public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n  constructor(\n    @IOptionsService private readonly _optionsService: IOptionsService\n  ) {\n    super();\n    this._updateLogLevel();\n    this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n    // For trace logging, assume the latest created log service is valid\n    traceLogger = this;\n  }\n\n  private _updateLogLevel(): void {\n    this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n  }\n\n  private _evalLazyOptionalParams(optionalParams: any[]): void {\n    for (let i = 0; i < optionalParams.length; i++) {\n      if (typeof optionalParams[i] === 'function') {\n        optionalParams[i] = optionalParams[i]();\n      }\n    }\n  }\n\n  private _log(type: LogType, message: string, optionalParams: any[]): void {\n    this._evalLazyOptionalParams(optionalParams);\n    type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n  }\n\n  public trace(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.TRACE) {\n      this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public debug(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.DEBUG) {\n      this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n    }\n  }\n\n  public info(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.INFO) {\n      this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n    }\n  }\n\n  public warn(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.WARN) {\n      this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n    }\n  }\n\n  public error(message: string, ...optionalParams: any[]): void {\n    if (this._logLevel <= LogLevelEnum.ERROR) {\n      this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n    }\n  }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n  traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n  if (typeof descriptor.value !== 'function') {\n    throw new Error('not supported');\n  }\n  const fnKey = 'value';\n  const fn = descriptor.value;\n  descriptor[fnKey] = function (...args: any[]) {\n    // Early exit\n    if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n      return fn.apply(this, args);\n    }\n\n    traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n    const result = fn.apply(this, args);\n    traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n    return result;\n  };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { isMac } from 'common/Platform';\nimport { CursorStyle, IDisposable } from 'common/Types';\nimport { FontWeight, IOptionsService, ITerminalOptions } from 'common/services/Services';\n\nexport const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {\n  cols: 80,\n  rows: 24,\n  cursorBlink: false,\n  cursorStyle: 'block',\n  cursorWidth: 1,\n  cursorInactiveStyle: 'outline',\n  customGlyphs: true,\n  drawBoldTextInBrightColors: true,\n  fastScrollModifier: 'alt',\n  fastScrollSensitivity: 5,\n  fontFamily: 'courier-new, courier, monospace',\n  fontSize: 15,\n  fontWeight: 'normal',\n  fontWeightBold: 'bold',\n  ignoreBracketedPasteMode: false,\n  lineHeight: 1.0,\n  letterSpacing: 0,\n  linkHandler: null,\n  logLevel: 'info',\n  logger: null,\n  scrollback: 1000,\n  scrollOnUserInput: true,\n  scrollSensitivity: 1,\n  screenReaderMode: false,\n  smoothScrollDuration: 0,\n  macOptionIsMeta: false,\n  macOptionClickForcesSelection: false,\n  minimumContrastRatio: 1,\n  disableStdin: false,\n  allowProposedApi: false,\n  allowTransparency: false,\n  tabStopWidth: 8,\n  theme: {},\n  rightClickSelectsWord: isMac,\n  windowOptions: {},\n  windowsMode: false,\n  windowsPty: {},\n  wordSeparator: ' ()[]{}\\',\"`',\n  altClickMovesCursor: true,\n  convertEol: false,\n  termName: 'xterm',\n  cancelEvents: false,\n  overviewRulerWidth: 0\n};\n\nconst FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];\n\nexport class OptionsService extends Disposable implements IOptionsService {\n  public serviceBrand: any;\n\n  public readonly rawOptions: Required<ITerminalOptions>;\n  public options: Required<ITerminalOptions>;\n\n  private readonly _onOptionChange = this.register(new EventEmitter<keyof ITerminalOptions>());\n  public readonly onOptionChange = this._onOptionChange.event;\n\n  constructor(options: Partial<ITerminalOptions>) {\n    super();\n    // set the default value of each option\n    const defaultOptions = { ...DEFAULT_OPTIONS };\n    for (const key in options) {\n      if (key in defaultOptions) {\n        try {\n          const newValue = options[key];\n          defaultOptions[key] = this._sanitizeAndValidateOption(key, newValue);\n        } catch (e) {\n          console.error(e);\n        }\n      }\n    }\n\n    // set up getters and setters for each option\n    this.rawOptions = defaultOptions;\n    this.options = { ... defaultOptions };\n    this._setupOptions();\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (value: ITerminalOptions[T]) => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (eventKey === key) {\n        listener(this.rawOptions[key]);\n      }\n    });\n  }\n\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  public onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable {\n    return this.onOptionChange(eventKey => {\n      if (keys.indexOf(eventKey) !== -1) {\n        listener();\n      }\n    });\n  }\n\n  private _setupOptions(): void {\n    const getter = (propName: string): any => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n      return this.rawOptions[propName];\n    };\n\n    const setter = (propName: string, value: any): void => {\n      if (!(propName in DEFAULT_OPTIONS)) {\n        throw new Error(`No option with key \"${propName}\"`);\n      }\n\n      value = this._sanitizeAndValidateOption(propName, value);\n      // Don't fire an option change event if they didn't change\n      if (this.rawOptions[propName] !== value) {\n        this.rawOptions[propName] = value;\n        this._onOptionChange.fire(propName);\n      }\n    };\n\n    for (const propName in this.rawOptions) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this.options, propName, desc);\n    }\n  }\n\n  private _sanitizeAndValidateOption(key: string, value: any): any {\n    switch (key) {\n      case 'cursorStyle':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        if (!isCursorStyle(value)) {\n          throw new Error(`\"${value}\" is not a valid value for ${key}`);\n        }\n        break;\n      case 'wordSeparator':\n        if (!value) {\n          value = DEFAULT_OPTIONS[key];\n        }\n        break;\n      case 'fontWeight':\n      case 'fontWeightBold':\n        if (typeof value === 'number' && 1 <= value && value <= 1000) {\n          // already valid numeric value\n          break;\n        }\n        value = FONT_WEIGHT_OPTIONS.includes(value) ? value : DEFAULT_OPTIONS[key];\n        break;\n      case 'cursorWidth':\n        value = Math.floor(value);\n        // Fall through for bounds check\n      case 'lineHeight':\n      case 'tabStopWidth':\n        if (value < 1) {\n          throw new Error(`${key} cannot be less than 1, value: ${value}`);\n        }\n        break;\n      case 'minimumContrastRatio':\n        value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n        break;\n      case 'scrollback':\n        value = Math.min(value, 4294967295);\n        if (value < 0) {\n          throw new Error(`${key} cannot be less than 0, value: ${value}`);\n        }\n        break;\n      case 'fastScrollSensitivity':\n      case 'scrollSensitivity':\n        if (value <= 0) {\n          throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n        }\n        break;\n      case 'rows':\n      case 'cols':\n        if (!value && value !== 0) {\n          throw new Error(`${key} must be numeric, value: ${value}`);\n        }\n        break;\n      case 'windowsPty':\n        value = value ?? {};\n        break;\n    }\n    return value;\n  }\n}\n\nfunction isCursorStyle(value: unknown): value is CursorStyle {\n  return value === 'block' || value === 'underline' || value === 'bar';\n}\n","/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, IOscLinkService } from 'common/services/Services';\nimport { IMarker, IOscLinkData } from 'common/Types';\n\nexport class OscLinkService implements IOscLinkService {\n  public serviceBrand: any;\n\n  private _nextId = 1;\n\n  /**\n   * A map of the link key to link entry. This is used to add additional lines to links with ids.\n   */\n  private _entriesWithId: Map<string, IOscLinkEntryWithId> = new Map();\n\n  /**\n   * A map of the link id to the link entry. The \"link id\" (number) which is the numberic\n   * representation of a unique link should not be confused with \"id\" (string) which comes in with\n   * `id=` in the OSC link's properties.\n   */\n  private _dataByLinkId: Map<number, IOscLinkEntryNoId | IOscLinkEntryWithId> = new Map();\n\n  constructor(\n    @IBufferService private readonly _bufferService: IBufferService\n  ) {\n  }\n\n  public registerLink(data: IOscLinkData): number {\n    const buffer = this._bufferService.buffer;\n\n    // Links with no id will only ever be registered a single time\n    if (data.id === undefined) {\n      const marker = buffer.addMarker(buffer.ybase + buffer.y);\n      const entry: IOscLinkEntryNoId = {\n        data,\n        id: this._nextId++,\n        lines: [marker]\n      };\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n      this._dataByLinkId.set(entry.id, entry);\n      return entry.id;\n    }\n\n    // Add the line to the link if it already exists\n    const castData = data as Required<IOscLinkData>;\n    const key = this._getEntryIdKey(castData);\n    const match = this._entriesWithId.get(key);\n    if (match) {\n      this.addLineToLink(match.id, buffer.ybase + buffer.y);\n      return match.id;\n    }\n\n    // Create the link\n    const marker = buffer.addMarker(buffer.ybase + buffer.y);\n    const entry: IOscLinkEntryWithId = {\n      id: this._nextId++,\n      key: this._getEntryIdKey(castData),\n      data: castData,\n      lines: [marker]\n    };\n    marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    this._entriesWithId.set(entry.key, entry);\n    this._dataByLinkId.set(entry.id, entry);\n    return entry.id;\n  }\n\n  public addLineToLink(linkId: number, y: number): void {\n    const entry = this._dataByLinkId.get(linkId);\n    if (!entry) {\n      return;\n    }\n    if (entry.lines.every(e => e.line !== y)) {\n      const marker = this._bufferService.buffer.addMarker(y);\n      entry.lines.push(marker);\n      marker.onDispose(() => this._removeMarkerFromLink(entry, marker));\n    }\n  }\n\n  public getLinkData(linkId: number): IOscLinkData | undefined {\n    return this._dataByLinkId.get(linkId)?.data;\n  }\n\n  private _getEntryIdKey(linkData: Required<IOscLinkData>): string {\n    return `${linkData.id};;${linkData.uri}`;\n  }\n\n  private _removeMarkerFromLink(entry: IOscLinkEntryNoId | IOscLinkEntryWithId, marker: IMarker): void {\n    const index = entry.lines.indexOf(marker);\n    if (index === -1) {\n      return;\n    }\n    entry.lines.splice(index, 1);\n    if (entry.lines.length === 0) {\n      if (entry.data.id !== undefined) {\n        this._entriesWithId.delete((entry as IOscLinkEntryWithId).key);\n      }\n      this._dataByLinkId.delete(entry.id);\n    }\n  }\n}\n\ninterface IOscLinkEntry<T extends IOscLinkData> {\n  data: T;\n  id: number;\n  lines: IMarker[];\n}\n\ninterface IOscLinkEntryNoId extends IOscLinkEntry<IOscLinkData> {\n}\n\ninterface IOscLinkEntryWithId extends IOscLinkEntry<Required<IOscLinkData>> {\n  key: string;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n  return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n  if (serviceRegistry.has(id)) {\n    return serviceRegistry.get(id)!;\n  }\n\n  const decorator: any = function (target: Function, key: string, index: number): any {\n    if (arguments.length !== 3) {\n      throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n    }\n\n    storeServiceDependency(decorator, target, index);\n  };\n\n  decorator.toString = () => id;\n\n  serviceRegistry.set(id, decorator);\n  return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n  if ((target as any)[DI_TARGET] === target) {\n    (target as any)[DI_DEPENDENCIES].push({ id, index });\n  } else {\n    (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n    (target as any)[DI_TARGET] = target;\n  }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from 'xterm';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n  serviceBrand: undefined;\n\n  readonly cols: number;\n  readonly rows: number;\n  readonly buffer: IBuffer;\n  readonly buffers: IBufferSet;\n  isUserScrolling: boolean;\n  onResize: IEvent<{ cols: number, rows: number }>;\n  onScroll: IEvent<number>;\n  scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n  scrollLines(disp: number, suppressScrollEvent?: boolean, source?: ScrollSource): void;\n  resize(cols: number, rows: number): void;\n  reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n  activeProtocol: string;\n  activeEncoding: string;\n  areMouseEventsActive: boolean;\n  addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n  addEncoding(name: string, encoding: CoreMouseEncoding): void;\n  reset(): void;\n\n  /**\n   * Triggers a mouse event to be sent.\n   *\n   * Returns true if the event passed all protocol restrictions and a report\n   * was sent, otherwise false. The return value may be used to decide whether\n   * the default event action in the bowser component should be omitted.\n   *\n   * Note: The method will change values of the given event object\n   * to fullfill protocol and encoding restrictions.\n   */\n  triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n  /**\n   * Event to announce changes in mouse tracking.\n   */\n  onProtocolChange: IEvent<CoreMouseEventType>;\n\n  /**\n   * Human readable version of mouse events.\n   */\n  explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n  serviceBrand: undefined;\n\n  /**\n   * Initially the cursor will not be visible until the first time the terminal\n   * is focused.\n   */\n  isCursorInitialized: boolean;\n  isCursorHidden: boolean;\n\n  readonly modes: IModes;\n  readonly decPrivateModes: IDecPrivateModes;\n\n  readonly onData: IEvent<string>;\n  readonly onUserInput: IEvent<void>;\n  readonly onBinary: IEvent<string>;\n  readonly onRequestScrollToBottom: IEvent<void>;\n\n  reset(): void;\n\n  /**\n   * Triggers the onData event in the public API.\n   * @param data The data that is being emitted.\n   * @param wasUserInput Whether the data originated from the user (as opposed to\n   * resulting from parsing incoming data). When true this will also:\n   * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n   * - Fire the `onUserInput` event (so selection can be cleared).\n   */\n  triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n  /**\n   * Triggers the onBinary event in the public API.\n   * @param data The data that is being emitted.\n   */\n  triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n  serviceBrand: undefined;\n\n  charset: ICharset | undefined;\n  readonly glevel: number;\n\n  reset(): void;\n\n  /**\n   * Set the G level of the terminal.\n   * @param g\n   */\n  setgLevel(g: number): void;\n\n  /**\n   * Set the charset for the given G level of the terminal.\n   * @param g\n   * @param charset\n   */\n  setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n  (...args: any[]): void;\n  type: T;\n}\n\nexport interface IBrandedService {\n  serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n  : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n    : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n  serviceBrand: undefined;\n\n  setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n  getService<T>(id: IServiceIdentifier<T>): T | undefined;\n  createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n  TRACE = 0,\n  DEBUG = 1,\n  INFO = 2,\n  WARN = 3,\n  ERROR = 4,\n  OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n  serviceBrand: undefined;\n\n  readonly logLevel: LogLevelEnum;\n\n  trace(message: any, ...optionalParams: any[]): void;\n  debug(message: any, ...optionalParams: any[]): void;\n  info(message: any, ...optionalParams: any[]): void;\n  warn(message: any, ...optionalParams: any[]): void;\n  error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n  serviceBrand: undefined;\n\n  /**\n   * Read only access to the raw options object, this is an internal-only fast path for accessing\n   * single options without any validation as we trust TypeScript to enforce correct usage\n   * internally.\n   */\n  readonly rawOptions: Required<ITerminalOptions>;\n\n  /**\n   * Options as exposed through the public API, this property uses getters and setters with\n   * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n   * all internal usage for performance reasons.\n   */\n  readonly options: Required<ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when any option changes.\n   */\n  readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n  /**\n   * Adds an event listener for when a specific option changes, this is a convenience method that is\n   * preferred over {@link onOptionChange} when only a single option is being listened to.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n  /**\n   * Adds an event listener for when a set of specific options change, this is a convenience method\n   * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n   * handled the same way.\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n  allowProposedApi?: boolean;\n  allowTransparency?: boolean;\n  altClickMovesCursor?: boolean;\n  cols?: number;\n  convertEol?: boolean;\n  cursorBlink?: boolean;\n  cursorStyle?: CursorStyle;\n  cursorWidth?: number;\n  cursorInactiveStyle?: CursorInactiveStyle;\n  customGlyphs?: boolean;\n  disableStdin?: boolean;\n  drawBoldTextInBrightColors?: boolean;\n  fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n  fastScrollSensitivity?: number;\n  fontSize?: number;\n  fontFamily?: string;\n  fontWeight?: FontWeight;\n  fontWeightBold?: FontWeight;\n  ignoreBracketedPasteMode?: boolean;\n  letterSpacing?: number;\n  lineHeight?: number;\n  linkHandler?: ILinkHandler | null;\n  logLevel?: LogLevel;\n  logger?: ILogger | null;\n  macOptionIsMeta?: boolean;\n  macOptionClickForcesSelection?: boolean;\n  minimumContrastRatio?: number;\n  rightClickSelectsWord?: boolean;\n  rows?: number;\n  screenReaderMode?: boolean;\n  scrollback?: number;\n  scrollOnUserInput?: boolean;\n  scrollSensitivity?: number;\n  smoothScrollDuration?: number;\n  tabStopWidth?: number;\n  theme?: ITheme;\n  windowsMode?: boolean;\n  windowsPty?: IWindowsPty;\n  windowOptions?: IWindowOptions;\n  wordSeparator?: string;\n  overviewRulerWidth?: number;\n\n  [key: string]: any;\n  cancelEvents: boolean;\n  termName: string;\n}\n\nexport interface ITheme {\n  foreground?: string;\n  background?: string;\n  cursor?: string;\n  cursorAccent?: string;\n  selectionForeground?: string;\n  selectionBackground?: string;\n  selectionInactiveBackground?: string;\n  black?: string;\n  red?: string;\n  green?: string;\n  yellow?: string;\n  blue?: string;\n  magenta?: string;\n  cyan?: string;\n  white?: string;\n  brightBlack?: string;\n  brightRed?: string;\n  brightGreen?: string;\n  brightYellow?: string;\n  brightBlue?: string;\n  brightMagenta?: string;\n  brightCyan?: string;\n  brightWhite?: string;\n  extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n  serviceBrand: undefined;\n  /**\n   * Registers a link to the service, returning the link ID. The link data is managed by this\n   * service and will be freed when this current cursor position is trimmed off the buffer.\n   */\n  registerLink(linkData: IOscLinkData): number;\n  /**\n   * Adds a line to a link if needed.\n   */\n  addLineToLink(linkId: number, y: number): void;\n  /** Get the link data associated with a link ID. */\n  getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n  serviceBrand: undefined;\n  /** Register an Unicode version provider. */\n  register(provider: IUnicodeVersionProvider): void;\n  /** Registered Unicode versions. */\n  readonly versions: string[];\n  /** Currently active version. */\n  activeVersion: string;\n  /** Event triggered, when activate version changed. */\n  readonly onChange: IEvent<string>;\n\n  /**\n   * Unicode version dependent\n   */\n  wcwidth(codepoint: number): number;\n  getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n  readonly version: string;\n  wcwidth(ucs: number): 0 | 1 | 2;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n  serviceBrand: undefined;\n  readonly decorations: IterableIterator<IInternalDecoration>;\n  readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n  readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n  registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n  reset(): void;\n  /**\n   * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n   * instead of an iterator as it's typically used in hot code paths.\n   */\n  forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n  readonly options: IDecorationOptions;\n  readonly backgroundColorRGB: IColor | undefined;\n  readonly foregroundColorRGB: IColor | undefined;\n  readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { EventEmitter } from 'common/EventEmitter';\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\nimport { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services';\n\nexport class UnicodeService implements IUnicodeService {\n  public serviceBrand: any;\n\n  private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n  private _active: string = '';\n  private _activeProvider: IUnicodeVersionProvider;\n\n  private readonly _onChange = new EventEmitter<string>();\n  public readonly onChange = this._onChange.event;\n\n  constructor() {\n    const defaultProvider = new UnicodeV6();\n    this.register(defaultProvider);\n    this._active = defaultProvider.version;\n    this._activeProvider = defaultProvider;\n  }\n\n  public dispose(): void {\n    this._onChange.dispose();\n  }\n\n  public get versions(): string[] {\n    return Object.keys(this._providers);\n  }\n\n  public get activeVersion(): string {\n    return this._active;\n  }\n\n  public set activeVersion(version: string) {\n    if (!this._providers[version]) {\n      throw new Error(`unknown Unicode version \"${version}\"`);\n    }\n    this._active = version;\n    this._activeProvider = this._providers[version];\n    this._onChange.fire(version);\n  }\n\n  public register(provider: IUnicodeVersionProvider): void {\n    this._providers[provider.version] = provider;\n  }\n\n  /**\n   * Unicode version dependent interface.\n   */\n  public wcwidth(num: number): number {\n    return this._activeProvider.wcwidth(num);\n  }\n\n  public getStringCellWidth(s: string): number {\n    let result = 0;\n    const length = s.length;\n    for (let i = 0; i < length; ++i) {\n      let code = s.charCodeAt(i);\n      // surrogate pair first\n      if (0xD800 <= code && code <= 0xDBFF) {\n        if (++i >= length) {\n          // this should not happen with strings retrieved from\n          // Buffer.translateToString as it converts from UTF-32\n          // and therefore always should contain the second part\n          // for any other string we still have to handle it somehow:\n          // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n          return result + this.wcwidth(code);\n        }\n        const second = s.charCodeAt(i);\n        // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n        // otherwise treat them independently (UCS-2 behavior)\n        if (0xDC00 <= second && second <= 0xDFFF) {\n          code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n        } else {\n          result += this.wcwidth(second);\n        }\n      }\n      result += this.wcwidth(code);\n    }\n    return result;\n  }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { Terminal as TerminalCore } from 'browser/Terminal';\nimport { IBufferRange, ITerminal } from 'browser/Types';\nimport { IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { ITerminalOptions } from 'common/Types';\nimport { AddonManager } from 'common/public/AddonManager';\nimport { BufferNamespaceApi } from 'common/public/BufferNamespaceApi';\nimport { ParserApi } from 'common/public/ParserApi';\nimport { UnicodeApi } from 'common/public/UnicodeApi';\nimport { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from 'xterm';\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nexport class Terminal extends Disposable implements ITerminalApi {\n  private _core: ITerminal;\n  private _addonManager: AddonManager;\n  private _parser: IParser | undefined;\n  private _buffer: BufferNamespaceApi | undefined;\n  private _publicOptions: Required<ITerminalOptions>;\n\n  constructor(options?: ITerminalOptions & ITerminalInitOnlyOptions) {\n    super();\n\n    this._core = this.register(new TerminalCore(options));\n    this._addonManager = this.register(new AddonManager());\n\n    this._publicOptions = { ... this._core.options };\n    const getter = (propName: string): any => {\n      return this._core.options[propName];\n    };\n    const setter = (propName: string, value: any): void => {\n      this._checkReadonlyOptions(propName);\n      this._core.options[propName] = value;\n    };\n\n    for (const propName in this._core.options) {\n      const desc = {\n        get: getter.bind(this, propName),\n        set: setter.bind(this, propName)\n      };\n      Object.defineProperty(this._publicOptions, propName, desc);\n    }\n  }\n\n  private _checkReadonlyOptions(propName: string): void {\n    // Throw an error if any constructor only option is modified\n    // from terminal.options\n    // Modifications from anywhere else are allowed\n    if (CONSTRUCTOR_ONLY_OPTIONS.includes(propName)) {\n      throw new Error(`Option \"${propName}\" can only be set in the constructor`);\n    }\n  }\n\n  private _checkProposedApi(): void {\n    if (!this._core.optionsService.rawOptions.allowProposedApi) {\n      throw new Error('You must set the allowProposedApi option to true to use proposed API');\n    }\n  }\n\n  public get onBell(): IEvent<void> { return this._core.onBell; }\n  public get onBinary(): IEvent<string> { return this._core.onBinary; }\n  public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n  public get onData(): IEvent<string> { return this._core.onData; }\n  public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n  public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n  public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n  public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n  public get onScroll(): IEvent<number> { return this._core.onScroll; }\n  public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n  public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n  public get onWriteParsed(): IEvent<void> { return this._core.onWriteParsed; }\n\n  public get element(): HTMLElement | undefined { return this._core.element; }\n  public get parser(): IParser {\n    if (!this._parser) {\n      this._parser = new ParserApi(this._core);\n    }\n    return this._parser;\n  }\n  public get unicode(): IUnicodeHandling {\n    this._checkProposedApi();\n    return new UnicodeApi(this._core);\n  }\n  public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n  public get rows(): number { return this._core.rows; }\n  public get cols(): number { return this._core.cols; }\n  public get buffer(): IBufferNamespaceApi {\n    if (!this._buffer) {\n      this._buffer = this.register(new BufferNamespaceApi(this._core));\n    }\n    return this._buffer;\n  }\n  public get markers(): ReadonlyArray<IMarker> {\n    this._checkProposedApi();\n    return this._core.markers;\n  }\n  public get modes(): IModes {\n    const m = this._core.coreService.decPrivateModes;\n    let mouseTrackingMode: 'none' | 'x10' | 'vt200' | 'drag' | 'any' = 'none';\n    switch (this._core.coreMouseService.activeProtocol) {\n      case 'X10': mouseTrackingMode = 'x10'; break;\n      case 'VT200': mouseTrackingMode = 'vt200'; break;\n      case 'DRAG': mouseTrackingMode = 'drag'; break;\n      case 'ANY': mouseTrackingMode = 'any'; break;\n    }\n    return {\n      applicationCursorKeysMode: m.applicationCursorKeys,\n      applicationKeypadMode: m.applicationKeypad,\n      bracketedPasteMode: m.bracketedPasteMode,\n      insertMode: this._core.coreService.modes.insertMode,\n      mouseTrackingMode: mouseTrackingMode,\n      originMode: m.origin,\n      reverseWraparoundMode: m.reverseWraparound,\n      sendFocusMode: m.sendFocus,\n      wraparoundMode: m.wraparound\n    };\n  }\n  public get options(): Required<ITerminalOptions> {\n    return this._publicOptions;\n  }\n  public set options(options: ITerminalOptions) {\n    for (const propName in options) {\n      this._publicOptions[propName] = options[propName];\n    }\n  }\n  public blur(): void {\n    this._core.blur();\n  }\n  public focus(): void {\n    this._core.focus();\n  }\n  public resize(columns: number, rows: number): void {\n    this._verifyIntegers(columns, rows);\n    this._core.resize(columns, rows);\n  }\n  public open(parent: HTMLElement): void {\n    this._core.open(parent);\n  }\n  public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n    this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n  }\n  public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n    return this._core.registerLinkProvider(linkProvider);\n  }\n  public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n    this._checkProposedApi();\n    return this._core.registerCharacterJoiner(handler);\n  }\n  public deregisterCharacterJoiner(joinerId: number): void {\n    this._checkProposedApi();\n    this._core.deregisterCharacterJoiner(joinerId);\n  }\n  public registerMarker(cursorYOffset: number = 0): IMarker {\n    this._verifyIntegers(cursorYOffset);\n    return this._core.registerMarker(cursorYOffset);\n  }\n  public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined {\n    this._checkProposedApi();\n    this._verifyPositiveIntegers(decorationOptions.x ?? 0, decorationOptions.width ?? 0, decorationOptions.height ?? 0);\n    return this._core.registerDecoration(decorationOptions);\n  }\n  public hasSelection(): boolean {\n    return this._core.hasSelection();\n  }\n  public select(column: number, row: number, length: number): void {\n    this._verifyIntegers(column, row, length);\n    this._core.select(column, row, length);\n  }\n  public getSelection(): string {\n    return this._core.getSelection();\n  }\n  public getSelectionPosition(): IBufferRange | undefined {\n    return this._core.getSelectionPosition();\n  }\n  public clearSelection(): void {\n    this._core.clearSelection();\n  }\n  public selectAll(): void {\n    this._core.selectAll();\n  }\n  public selectLines(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.selectLines(start, end);\n  }\n  public dispose(): void {\n    super.dispose();\n  }\n  public scrollLines(amount: number): void {\n    this._verifyIntegers(amount);\n    this._core.scrollLines(amount);\n  }\n  public scrollPages(pageCount: number): void {\n    this._verifyIntegers(pageCount);\n    this._core.scrollPages(pageCount);\n  }\n  public scrollToTop(): void {\n    this._core.scrollToTop();\n  }\n  public scrollToBottom(): void {\n    this._core.scrollToBottom();\n  }\n  public scrollToLine(line: number): void {\n    this._verifyIntegers(line);\n    this._core.scrollToLine(line);\n  }\n  public clear(): void {\n    this._core.clear();\n  }\n  public write(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data, callback);\n  }\n  public writeln(data: string | Uint8Array, callback?: () => void): void {\n    this._core.write(data);\n    this._core.write('\\r\\n', callback);\n  }\n  public paste(data: string): void {\n    this._core.paste(data);\n  }\n  public refresh(start: number, end: number): void {\n    this._verifyIntegers(start, end);\n    this._core.refresh(start, end);\n  }\n  public reset(): void {\n    this._core.reset();\n  }\n  public clearTextureAtlas(): void {\n    this._core.clearTextureAtlas();\n  }\n  public loadAddon(addon: ITerminalAddon): void {\n    this._addonManager.loadAddon(this, addon);\n  }\n  public static get strings(): ILocalizableStrings {\n    return Strings;\n  }\n\n  private _verifyIntegers(...values: number[]): void {\n    for (const value of values) {\n      if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n        throw new Error('This API only accepts integers');\n      }\n    }\n  }\n\n  private _verifyPositiveIntegers(...values: number[]): void {\n    for (const value of values) {\n      if (value && (value === Infinity || isNaN(value) || value % 1 !== 0 || value < 0)) {\n        throw new Error('This API only accepts positive integers');\n      }\n    }\n  }\n}\n"],"names":["root","factory","exports","module","define","amd","a","i","self","AccessibilityManager","Disposable","constructor","_terminal","super","_renderService","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","this","_accessibilityContainer","document","createElement","classList","add","_rowContainer","setAttribute","_rowElements","rows","_createAccessibilityTreeNode","appendChild","_topBoundaryFocusListener","e","_handleBoundaryFocus","_bottomBoundaryFocusListener","addEventListener","length","_refreshRowsDimensions","_liveRegion","_liveRegionDebouncer","register","TimeBasedDebouncer","_renderRows","bind","element","Error","insertAdjacentElement","onResize","_handleResize","onRender","_refreshRows","start","end","onScroll","onA11yChar","char","_handleChar","onLineFeed","onA11yTab","spaceCount","_handleTab","onKey","_handleKey","key","onBlur","_clearLiveRegion","onDimensionsChange","_screenDprMonitor","ScreenDprMonitor","window","setListener","addDisposableDomListener","toDisposable","remove","MAX_ROWS_TO_READ","shift","textContent","Strings","tooMuchOutput","isMac","parentNode","setTimeout","keyChar","test","push","refresh","buffer","setSize","lines","toString","lineData","translateBufferLineToString","ydisp","posInSet","innerText","_announceCharacters","position","boundaryElement","target","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","pop","removeChild","removeEventListener","newElement","unshift","scrollLines","focus","preventDefault","stopImmediatePropagation","children","tabIndex","_refreshRowDimensions","dimensions","css","cell","height","style","width","canvas","IRenderService","prepareTextForTerminal","text","replace","bracketTextForPaste","bracketedPasteMode","paste","textarea","coreService","optionsService","decPrivateModes","rawOptions","ignoreBracketedPasteMode","triggerDataEvent","value","moveTextAreaUnderMouseCursor","ev","screenElement","pos","getBoundingClientRect","left","clientX","top","clientY","zIndex","selectionService","clipboardData","setData","selectionText","stopPropagation","getData","shouldSelectWord","rightClickSelect","select","_color","TwoKeyMap","_css","setCss","bg","fg","set","getCss","get","setColor","getColor","clear","node","type","handler","options","disposed","dispose","Linkifier2","currentLink","_currentLink","_bufferService","_linkProviders","_linkCacheDisposables","_isMouseOut","_wasResized","_activeLine","_onShowLinkUnderline","EventEmitter","onShowLinkUnderline","event","_onHideLinkUnderline","onHideLinkUnderline","getDisposeArrayDisposable","_lastMouseEvent","undefined","_clearCurrentLink","registerLinkProvider","linkProvider","providerIndex","indexOf","splice","attachToDom","mouseService","renderService","_element","_mouseService","_handleMouseMove","_handleMouseDown","_handleMouseUp","_positionFromMouseEvent","composedPath","contains","_lastBufferCell","x","y","_handleHover","_askForLink","_linkAtPosition","link","useLineCache","_activeProviderReplies","forEach","reply","linkWithState","Map","linkProvided","entries","_checkLinkProviderResult","provideLinks","links","linksWithState","map","size","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","startX","range","endX","cols","has","index","hasLinkBefore","j","linkAtPosition","find","_handleNewLink","_mouseDownLink","activate","startRow","endRow","_linkLeave","disposeArray","state","decorations","underline","pointerCursor","isHovered","_linkHover","Object","defineProperties","v","toggle","_fireUnderlineEvent","onRenderedViewportChange","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","fire","leave","lower","upper","current","coords","getCoords","x1","y1","x2","y2","IBufferService","promptLabel","OscLinkProvider","_optionsService","_oscLinkService","callback","line","result","linkHandler","CellData","lineLength","getTrimmedLength","currentLinkId","currentStart","finishLink","hasContent","loadCell","hasExtendedAttrs","extended","urlId","getLinkData","uri","ignoreLink","allowNonHttpProtocols","parsed","URL","includes","protocol","defaultActivate","confirm","newWindow","open","opener","location","href","console","warn","IOptionsService","IOscLinkService","_parentWindow","_renderCallback","_refreshCallbacks","_animationFrame","cancelAnimationFrame","addRefreshCallback","requestAnimationFrame","_innerRefresh","rowStart","rowEnd","rowCount","_rowCount","_rowStart","Math","min","_rowEnd","max","_runRefreshCallbacks","_currentDevicePixelRatio","devicePixelRatio","clearListener","listener","_listener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","Terminal","CoreTerminal","onFocus","_onFocus","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","onWillOpen","_onWillOpen","browser","Browser","_keyDownHandled","_keyDownSeen","_keyPressHandled","_unprocessedDeadKey","_accessibilityManager","MutableDisposable","_onCursorMove","onCursorMove","_onKey","_onRender","_onSelectionChange","onSelectionChange","_onTitleChange","onTitleChange","_onBell","onBell","_setup","linkifier2","_instantiationService","createInstance","_decorationService","DecorationService","setService","IDecorationService","_inputHandler","onRequestBell","onRequestRefreshRows","onRequestSendFocus","_reportFocus","onRequestReset","reset","onRequestWindowsOptionsReport","_reportWindowsOptions","onColor","_handleColorEvent","forwardEvent","_afterResize","_customKeyEventHandler","_themeService","req","acc","ident","channels","color","toColorRGB","colors","ansi","C0","ESC","toRgbString","C1_ESCAPED","ST","modifyColors","rgba","toColor","narrowedAcc","restoreColor","buffers","active","preventScroll","_handleScreenReaderModeOptionChange","_handleTextAreaFocus","sendFocus","updateCursorStyle","_showCursor","blur","_handleTextAreaBlur","_syncTextArea","isCursorInViewport","_compositionHelper","isComposing","cursorY","ybase","bufferLine","cursorX","cellHeight","getWidth","cellWidth","cursorTop","cursorLeft","lineHeight","_initGlobal","_bindKeys","hasSelection","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","isFirefox","button","rightClickHandler","rightClickSelectsWord","isLinux","_keyUp","_keyDown","_keyPress","compositionstart","compositionupdate","compositionend","_inputEvent","updateCompositionElements","parent","isConnected","_logService","debug","_document","ownerDocument","dir","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","isChromeOS","_coreBrowserService","CoreBrowserService","defaultView","ICoreBrowserService","_charSizeService","CharSizeService","ICharSizeService","ThemeService","IThemeService","_characterJoinerService","CharacterJoinerService","ICharacterJoinerService","RenderService","resize","_compositionView","CompositionHelper","hasRenderer","setRenderer","_createRenderer","MouseService","IMouseService","viewport","Viewport","onRequestScrollLines","amount","suppressScrollEvent","onRequestSyncScrollBar","syncScrollArea","handleCursorMove","handleResize","handleBlur","handleFocus","SelectionService","ISelectionService","onRequestRedraw","handleSelectionChanged","columnSelectMode","onLinuxMouseSelection","_onScroll","BufferDecorationRenderer","handleMouseDown","coreMouseService","areMouseEventsActive","disable","enable","screenReaderMode","onSpecificOptionChange","overviewRulerWidth","_overviewRulerRenderer","OverviewRulerRenderer","measure","bindMouse","DomRenderer","el","sendEvent","getMouseReportCoords","but","action","overrideType","buttons","getLinesScrolled","deltaY","triggerMouseEvent","col","row","ctrl","ctrlKey","alt","altKey","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","onProtocolChange","events","logLevel","explainEvents","passive","activeProtocol","shouldForceSelection","hasScrollback","sequence","applicationCursorKeys","data","abs","handleWheel","handleTouchStart","handleTouchMove","refreshRows","shouldColumnSelect","isCursorInitialized","disp","source","attachCustomKeyEventHandler","customKeyEventHandler","registerCharacterJoiner","joinerId","deregisterCharacterJoiner","deregister","markers","registerMarker","cursorYOffset","addMarker","registerDecoration","decorationOptions","column","setSelection","getSelection","getSelectionPosition","selectionStart","selectionEnd","clearSelection","selectAll","selectLines","shouldIgnoreComposition","macOptionIsMeta","keydown","scrollOnUserInput","scrollToBottom","evaluateKeyboardEvent","scrollCount","_isThirdLevelShift","metaKey","charCodeAt","ETX","CR","domEvent","thirdLevelKey","isWindows","getModifierState","keyCode","wasModifierKeyOnlyEvent","charCode","which","String","fromCharCode","inputType","composed","hasValidSize","clearAllMarkers","getBlankLine","DEFAULT_ATTR_DATA","clearTextureAtlas","WindowsOptionsReportType","GET_WIN_SIZE_PIXELS","canvasWidth","toFixed","canvasHeight","GET_CELL_SIZE_PIXELS","force","cancelEvents","_debounceThresholdMS","_lastRefreshMs","_additionalRefreshRequested","_refreshTimeoutID","clearTimeout","refreshRequestTime","Date","now","elapsed","waitPeriodBeforeTrailingRefresh","_scrollArea","themeService","scrollBarWidth","_currentRowHeight","_currentDeviceCellHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","_smoothScrollState","startTime","origin","_onRequestScrollLines","offsetWidth","_handleScroll","_activeBuffer","onBufferActivate","activeBuffer","_renderDimensions","_handleThemeChange","onChangeColors","backgroundColor","background","_refresh","immediate","device","dpr","offsetHeight","newBufferHeight","round","scrollTop","offsetParent","diff","_smoothScroll","_isDisposed","percent","_smoothScrollPercent","_clearSmoothScrollState","smoothScrollDuration","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","scrollHeight","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","getBufferElements","startLine","endLine","cursorElement","currentLine","bufferElements","isWrapped","translateToString","div","DOM_DELTA_PIXEL","floor","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","pageY","_screenElement","_decorationElements","_altBufferIsActive","_dimensionsChanged","_container","_doRefreshDecorations","_queueRefresh","onDecorationRegistered","onDecorationRemoved","decoration","_removeDecoration","_renderDecoration","_refreshStyle","_refreshXPosition","_createElement","layer","marker","display","onRenderEmitter","onDispose","delete","anchor","right","_zones","_zonePool","_zonePoolIndex","_linePadding","full","center","zones","addDecoration","overviewRulerOptions","z","_lineIntersectsZone","_lineAdjacentToZone","_addLineToZone","startBufferLine","endBufferLine","setPadding","padding","zone","drawHeight","drawWidth","drawX","_width","_coreBrowseService","_colorZoneStore","ColorZoneStore","_shouldUpdateDimensions","_shouldUpdateAnchor","_lastKnownBufferLength","_canvas","_refreshCanvasDimensions","parentElement","insertBefore","ctx","getContext","_ctx","_registerDecorationListeners","_registerBufferChangeListeners","_registerDimensionChangeListeners","normal","_refreshDrawHeightConstants","_refreshColorZonePadding","_containerHeight","clientHeight","_refreshDrawConstants","outerWidth","innerWidth","ceil","pixelsPerLine","nonFullHeight","_refreshDecorations","clearRect","lineWidth","_renderColorZone","fillStyle","fillRect","updateCanvasDimensions","updateAnchor","_isComposing","_textarea","_coreService","_isSendingComposition","_compositionPosition","_dataAlreadySent","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","currentCompositionPosition","input","substring","oldValue","newValue","DEL","dontRecurse","fontFamily","fontSize","compositionViewBounds","ICoreService","getCoordsRelativeToElement","rect","elementStyle","getComputedStyle","leftPadding","parseInt","getPropertyValue","topPadding","colCount","hasValidCharSize","cssCellWidth","cssCellHeight","isSelection","moveToRequestedRow","startY","targetY","bufferService","applicationCursor","wrappedRowsForRow","rowsToMove","wrappedRows","direction","verticalDirection","wrappedRowsCount","repeat","currentRow","lineWraps","startCol","endCol","forward","currentCol","bufferStr","mod","count","str","rpt","targetX","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","TERMINAL_CLASS_PREFIX","ROW_CONTAINER_CLASS","FG_CLASS_PREFIX","BG_CLASS_PREFIX","FOCUS_CLASS","SELECTION_CLASS","nextTerminalId","_linkifier2","instantiationService","_terminalClass","_refreshRowElements","_selectionContainer","createRenderDimensions","_updateDimensions","onOptionChange","_handleOptionsChanged","_injectCss","_rowFactory","DomRendererRowFactory","_handleLinkHover","_handleLinkLeave","_widthCache","_themeStyleElement","_dimensionsStyleElement","WidthCache","setFont","fontWeight","fontWeightBold","_setDefaultSpacing","letterSpacing","overflow","styles","_terminalSelector","foreground","multiplyOpacity","cursor","cursorAccent","cursorWidth","selectionBackgroundOpaque","selectionInactiveBackgroundOpaque","c","INVERTED_DEFAULT_COLOR","opaque","spacing","defaultSpacing","handleDevicePixelRatioChange","handleCharSizeChanged","renderRows","replaceChildren","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","documentFragment","isXFlipped","_createSelectionElement","middleRowsCount","colStart","colEnd","cursorAbsoluteY","cursorBlink","cursorStyle","cursorInactiveStyle","rowElement","createRow","_setCellUnderline","enabled","maxY","bufferline","IInstantiationService","_workCell","_columnSelectMode","_selectionStart","_selectionEnd","isCursorRow","widthCache","linkStart","linkEnd","elements","joinedRanges","getJoinedCharacters","charElement","getNoBgTrimmedLength","cellAmount","oldBg","oldFg","oldExt","oldLinkHover","oldSpacing","oldIsInSelection","classes","hasHover","isJoined","lastCharX","JoinedCellData","isInSelection","_isCellInSelection","isCursorCell","isLinkHover","isDecorated","forEachDecorationAtCell","d","chars","getChars","WHITESPACE_CELL_CHAR","isUnderline","isOverline","isBold","isItalic","selectionForeground","ext","isCursorHidden","isFocused","isDim","isInvisible","underlineStyle","isUnderlineColorDefault","isUnderlineColorRGB","textDecorationColor","AttributeData","getUnderlineColor","join","drawBoldTextInBrightColors","isStrikethrough","textDecoration","getFgColor","fgColorMode","getFgColorMode","getBgColor","bgColorMode","getBgColorMode","isInverse","temp","temp2","bgOverride","fgOverride","resolvedBg","isTop","backgroundColorRGB","foregroundColorRGB","_addStyle","padStart","_applyMinimumContrast","className","minimumContrastRatio","excludeFromContrastRatioDemands","getCode","cache","_getContrastCache","adjustedColor","ratio","ensureContrastRatio","halfContrastCache","contrastCache","padChar","_flat","Float32Array","_font","_fontSize","_weight","_weightBold","_measureElements","whiteSpace","fontKerning","regular","bold","italic","fontStyle","boldItalic","body","_holey","fill","font","weight","weightBold","cp","_measure","variant","DIM_OPACITY","TEXT_BASELINE","isLegacyEdge","isPowerlineGlyph","codepoint","isBoxOrBlockGlyph","isSelectAllActive","selectionStartLength","finalSelectionStart","areSelectionValuesReversed","finalSelectionEnd","startPlusLength","handleTrim","_onCharSizeChange","onCharSizeChange","_measureStrategy","DomMeasureStrategy","onMultipleOptionChange","_parentElement","_result","_measureElement","geometry","Number","firstCell","content","combinedData","isCombined","setFromCharData","getAsCharData","_characterJoiners","_nextCharacterJoinerId","joiner","id","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","getFg","rangeAttrBG","getBg","_getJoinedRanges","startIndex","endIndex","allJoinedRanges","error","joinerRanges","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","getString","newRange","inRange","_isFocused","_cachedIsFocused","hasFocus","queueMicrotask","_renderer","decorationService","coreBrowserService","_pausedResizeTask","DebouncedIdleTask","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onDimensionsChange","_onRenderedViewportChange","_onRefreshRequest","onRefreshRequest","_renderDebouncer","RenderDebouncer","_fullRefresh","observer","IntersectionObserver","_handleIntersectionChange","threshold","observe","disconnect","entry","isIntersecting","intersectionRatio","flush","isRedrawOnly","_fireOnCanvasResize","renderer","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","RegExp","_linkifier","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_oldHasSelection","_oldSelectionStart","_oldSelectionEnd","_onLinuxMouseSelection","_onRedrawRequest","_mouseMoveListener","_mouseUpListener","onUserInput","_trimListener","onTrim","_handleTrim","_handleBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","lineText","startRowEndCol","isLinuxMouseSelection","_isClickInSelection","_getMouseBufferCoords","_areCoordsInSelection","isCellInSelection","_selectWordAtCursor","allowWhitespaceOnlySelection","getRangeLength","_selectWordAt","_getMouseEventScrollAmount","offset","terminalHeight","macOptionClickForcesSelection","timeStamp","_handleIncrementalClick","detail","_handleSingleClick","_handleDoubleClick","_handleTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","setInterval","_dragScroll","clearInterval","hasWidth","_selectLineAt","previousSelectionEnd","_selectToWordAt","timeElapsed","altClickMovesCursor","coordinates","moveToCellSequence","_fireEventIfSelectionChanged","_fireOnSelectionChange","_convertViewportColToCharacterIndex","charIndex","_getWordAt","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","slice","trim","getCodePoint","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","wordSeparator","wrappedRange","getWrappedRangeForLine","first","last","createDecorator","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_ANSI_COLORS","freeze","r","g","b","toCss","toRgba","_colors","_contrastCache","ColorContrastCache","_halfContrastCache","_onChangeColors","selectionBackgroundTransparent","blend","selectionInactiveBackgroundTransparent","_updateRestoreColors","_setTheme","theme","parseColor","selectionBackground","selectionInactiveBackground","NULL_COLOR","isOpaque","opacity","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","extendedAnsi","colorCount","slot","_restoreColor","_restoreColors","cssString","fallback","CircularList","_maxLength","onDeleteEmitter","onDelete","onInsertEmitter","onInsert","onTrimEmitter","_array","Array","_startIndex","_length","maxLength","newMaxLength","newArray","_getCyclicIndex","newLength","recycle","isFull","deleteCount","items","countToTrim","trimStart","shiftElements","expandListBy","clone","val","depth","clonedObject","isArray","$r","$g","$b","$a","rgb","toPaddedHex","s","contrastRatio","l1","l2","toChannels","fgR","fgG","fgB","bgR","bgG","bgB","rgbaColor","factor","$ctx","$litmusColor","isNode","willReadFrequently","globalCompositeOperation","createLinearGradient","match","rgbaMatch","parseFloat","getImageData","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","increaseLuminance","bgL","fgL","resultA","resultARatio","resultB","hasWriteSyncWarnHappened","_onScrollApi","_windowsWrappingHeuristics","_onBinary","onBinary","_onData","onData","_onLineFeed","_onResize","_onWriteParsed","onWriteParsed","InstantiationService","OptionsService","BufferService","LogService","ILogService","CoreService","CoreMouseService","ICoreMouseService","unicodeService","UnicodeService","IUnicodeService","_charsetService","CharsetService","ICharsetService","OscLinkService","InputHandler","onRequestScrollToBottom","_writeBuffer","handleUserInput","_handleWindowsPtyOptionChange","markRangeDirty","scrollBottom","WriteBuffer","promiseResult","parse","write","writeSync","maxSubsequentCalls","LogLevelEnum","WARN","isNaN","MINIMUM_COLS","MINIMUM_ROWS","scroll","eraseAttr","scrollPages","pageCount","scrollToTop","scrollToLine","scrollAmount","registerEscHandler","registerDcsHandler","registerCsiHandler","registerOscHandler","windowsPty","buildNumber","backend","windowsMode","_enableWindowsWrappingHeuristics","disposables","updateWindowsModeWrappedState","final","_listeners","_disposed","_event","arg1","arg2","queue","call","clearListeners","from","to","GLEVEL","MAX_PARSEBUFFER_LENGTH","paramToWindowOption","n","opts","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","$temp","getAttrData","_curAttrData","_coreMouseService","_unicodeService","_parser","EscapeSequenceParser","_parseBuffer","Uint32Array","_stringDecoder","StringToUtf32","_utf8Decoder","Utf8ToUtf32","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestSendFocus","_onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onColor","_parseStack","paused","cursorStartX","cursorStartY","decodedLength","_specialColors","_dirtyRowTracker","DirtyRowTracker","setCsiHandlerFallback","params","identifier","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","code","setOscHandlerFallback","setDcsHandlerFallback","payload","setPrintHandler","print","insertChars","intermediates","scrollLeft","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","selectProtected","requestMode","setExecuteHandler","BEL","bell","LF","lineFeed","VT","FF","carriageReturn","BS","backspace","HT","tab","SO","shiftOut","SI","shiftIn","C1","IND","NEL","nextLine","HTS","tabSet","OscHandler","setTitle","setIconName","setOrReportIndexedColor","setHyperlink","setOrReportFgColor","setOrReportBgColor","setOrReportCursorColor","restoreIndexedColor","restoreFgColor","restoreBgColor","restoreCursorColor","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","CHARSETS","selectCharset","screenAlignmentPattern","setErrorHandler","DcsHandler","requestStatusString","_preserveStack","_logSlowResolvingAsync","p","Promise","race","res","rej","catch","err","_getCurrentLinkId","wasPaused","DEBUG","prototype","split","clearRange","len","decode","subarray","chWidth","charset","wraparoundMode","wraparound","insertMode","modes","curAttr","bufferRow","markDirty","setCellFromCodePoint","wcwidth","ch","stringFromCodePoint","addLineToLink","_eraseAttrData","insertCells","getNullCell","NULL_CELL_CODE","NULL_CELL_WIDTH","addCodepointToCell","precedingCodepoint","convertEol","reverseWraparound","_restrictCursor","originalX","nextStop","maxCol","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","respectProtect","replaceCells","_resetBufferLine","clearMarkers","scrollBackSize","scrollBottomRowsOffset","scrollBottomAbsolute","deleteCells","_is","term","termName","setgCharset","DEFAULT_CHARSET","applicationKeypad","activeEncoding","activateAltBuffer","activateNormalBuffer","dm","mouseProtocol","mouseEncoding","cs","b2v","m","_updateAttrColor","mode","c1","c2","c3","fromColorRGB","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","underlineColor","_processUnderline","updateExtended","_processSGR0","l","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","bottom","second","_savedCharset","slots","idx","spec","exec","isValidColorIndex","args","_createHyperlink","_finishHyperlink","parsedParams","idParamIndex","findIndex","startsWith","registerLink","_setOrReportSpecialColor","collectAndFlag","scrollRegionHeight","level","yOffset","markAllDirty","f","isProtected","_disposables","unregister","_value","array","_data","third","fourth","navigator","userAgent","platform","isSafari","majorVersion","isIpad","isIphone","_getKey","insert","_search","getKeyIterator","forEachByKey","values","mid","midKey","TaskQueue","_tasks","_i","enqueue","task","_start","_idleCallback","_cancelCallback","_requestCallback","_process","deadline","taskDuration","longestTask","lastDeadlineRemaining","timeRemaining","deadlineRemaining","PriorityTaskQueue","_createDeadline","duration","IdleTaskQueue","requestIdleCallback","cancelIdleCallback","_queue","lastChar","CHAR_DATA_CODE_INDEX","WHITESPACE_CELL_CODE","ExtendedAttrs","newObj","isBlink","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","isEmpty","getUnderlineColorMode","isUnderlineColorPalette","getUnderlineStyle","_urlId","_ext","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","fromCharData","NULL_CELL_CHAR","_whitespaceCell","WHITESPACE_CELL_WIDTH","_isClearing","_memoryCleanupQueue","_memoryCleanupPosition","_cols","_rows","_getCorrectBufferLength","setupTabStops","getWhitespaceCell","BufferLine","relativeY","correctBufferLength","scrollback","fillViewportRows","fillAttr","newCols","newRows","nullCell","dirtyMemoryLines","addToY","amountToTrim","_isReflowEnabled","_reflow","_batchedMemoryCleanup","normalRun","counted","cleanupMemory","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","newLine","destLineIndex","destCol","srcLineIndex","srcCol","cellsToCopy","copyCellsFrom","wrappedLinesIndex","getWrappedLineTrimmedLength","setCell","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","lineIndex","trimRight","tabStopWidth","Marker","_removeMarker","$startIndex","fillCellData","_combined","_extendedAttrs","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","codePoint","eAttrs","byteLength","uint32Cells","keys","extKeys","copyFrom","src","applyInReverse","srcData","srcCombinedKeys","bufferCols","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","BufferSet","_onBufferActivate","_normal","Buffer","_alt","inactiveBuffer","obj","combined","DEFAULT_COLOR","DEFAULT_ATTR","DEFAULT_EXT","_id","isDisposed","_nextId","_onDispose","disposable","C","NUL","SOH","STX","EOT","ENQ","ACK","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","FS","GS","RS","US","SP","PAD","HOP","BPH","NBH","SSA","ESA","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","OSC","PM","APC","KEYCODE_KEY_MAPPINGS","applicationCursorMode","modifiers","keyMapping","keyString","toUpperCase","toLowerCase","_interim","startPos","interim","Uint8Array","byte1","byte2","byte3","byte4","discardInterim","tmp","missing","fourStop","BMP_COMBINING","HIGH_COMBINING","table","version","num","ucs","bisearch","_action","_callbacks","_pendingData","_bufferOffset","_isSyncWriting","_syncCalls","_didUserInput","chunk","cb","_innerWrite","lastTime","continuation","resolve","then","RGB_REX","HASH_REX","pad","bits","s2","low","base","adv","PAYLOAD_LIMIT","EMPTY_HANDLERS","_handlers","create","_active","_ident","_handlerFb","_stack","loopPosition","fallThrough","registerHandler","handlerList","handlerIndex","clearHandler","setHandlerFallback","unhook","hook","put","utf32ToString","success","handlerResult","EMPTY_PARAMS","Params","addParam","_handler","_params","_hitLimit","ret","TransitionTable","setDefault","next","addMany","codes","NON_ASCII_PRINTABLE","VT500_TRANSITION_TABLE","blueprint","apply","unused","PRINTABLES","EXECUTABLES","states","_transitions","handlers","handlerPos","transition","chunkPos","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","OscParser","_dcsParser","DcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","collect","abort","addSubParam","addDigit","handlersEsc","jj","_state","_put","MAX_VALUE","fromArray","k","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","newParams","getSubParamsAll","store","cur","_addons","instance","loadAddon","terminal","loadedAddon","_wrappedAddonDispose","_buffer","init","viewportY","baseY","getLine","BufferLineApiView","_line","getCell","startColumn","endColumn","BufferNamespaceApi","_core","_onBufferChange","onBufferChange","BufferApiView","_alternate","alternate","addCsiHandler","addDcsHandler","addEscHandler","addOscHandler","provider","versions","activeVersion","isUserScrolling","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","oldYdisp","glevel","_charsets","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","SGR_PIXELS","_protocols","_encodings","_activeProtocol","_activeEncoding","_lastEvent","_onProtocolChange","name","addProtocol","addEncoding","encoding","_equalEvents","report","triggerBinaryEvent","down","up","drag","move","e1","e2","pixels","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_onRequestScrollToBottom","wasUserInput","disableStdin","$xmin","$xmax","_decorations","SortedList","_onDecorationRegistered","_onDecorationRemoved","Decoration","markerDispose","getDecorationsAtCell","xmin","xmax","_cachedBg","_cachedFg","foregroundColor","ServiceCollection","_entries","service","_services","getService","ctor","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","optionsKeyToLogLevel","trace","TRACE","info","INFO","ERROR","off","OFF","traceLogger","_logLevel","_updateLogLevel","_evalLazyOptionalParams","optionalParams","_log","message","logger","log","_target","descriptor","fn","JSON","stringify","DEFAULT_OPTIONS","customGlyphs","allowProposedApi","allowTransparency","FONT_WEIGHT_OPTIONS","_onOptionChange","defaultOptions","_sanitizeAndValidateOption","_setupOptions","eventKey","getter","propName","setter","desc","defineProperty","isCursorStyle","_entriesWithId","_dataByLinkId","_removeMarkerFromLink","castData","_getEntryIdKey","linkId","every","linkData","DI_TARGET","DI_DEPENDENCIES","serviceRegistry","decorator","arguments","storeServiceDependency","_providers","_onChange","onChange","defaultProvider","UnicodeV6","_activeProvider","getStringCellWidth","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","CONSTRUCTOR_ONLY_OPTIONS","_addonManager","AddonManager","_publicOptions","_checkReadonlyOptions","_checkProposedApi","parser","ParserApi","unicode","UnicodeApi","mouseTrackingMode","applicationCursorKeysMode","applicationKeypadMode","originMode","reverseWraparoundMode","sendFocusMode","columns","_verifyIntegers","_verifyPositiveIntegers","writeln","addon","strings","Infinity"],"sourceRoot":""}
\ No newline at end of file