From 5f7ea5b79d2588ce22a8d20480fa1572129e136d Mon Sep 17 00:00:00 2001 From: Commander1024 Date: Mon, 24 Aug 2026 19:45:36 +0200 Subject: [PATCH] Add authenticated WebSocket serial terminal - dirty commit with front- and backend issues --- README.md | 50 +- sdkconfig.defaults | 3 + src/CMakeLists.txt | 3 + src/web_assets_data.c | 5851 ++++++++++++++++++++++++ src/web_assets_data.h | 17 + src/web_console.c | 89 +- src/web_serial_transport.c | 1632 +++++++ src/web_serial_transport.h | 128 + src/web_server.c | 218 +- src/web_server.h | 3 + src/web_ui.c | 511 +++ src/web_ui.h | 30 + web_assets/SOURCES.md | 29 + web_assets/addon-fit.LICENSE | 19 + web_assets/addon-fit.js | 2 + web_assets/addon-fit.js.gz | Bin 0 -> 641 bytes web_assets/generate_embedded_assets.py | 64 + web_assets/xterm.LICENSE | 21 + web_assets/xterm.css | 218 + web_assets/xterm.css.gz | Bin 0 -> 2071 bytes web_assets/xterm.js | 2 + web_assets/xterm.js.gz | Bin 0 -> 67234 bytes 22 files changed, 8845 insertions(+), 45 deletions(-) create mode 100644 src/web_assets_data.c create mode 100644 src/web_assets_data.h create mode 100644 src/web_serial_transport.c create mode 100644 src/web_serial_transport.h create mode 100644 src/web_ui.c create mode 100644 src/web_ui.h create mode 100644 web_assets/SOURCES.md create mode 100644 web_assets/addon-fit.LICENSE create mode 100644 web_assets/addon-fit.js create mode 100644 web_assets/addon-fit.js.gz create mode 100644 web_assets/generate_embedded_assets.py create mode 100644 web_assets/xterm.LICENSE create mode 100644 web_assets/xterm.css create mode 100644 web_assets/xterm.css.gz create mode 100644 web_assets/xterm.js create mode 100644 web_assets/xterm.js.gz diff --git a/README.md b/README.md index d16c842..e367875 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Universal wireless serial adaptor firmware for the ESP32-S3. - 8 MB octal PSRAM - Adafruit MAX3243 full-pinout RS-232 breakout, product 5988 -The firmware has completed **Phase 0 hardware characterization**, the **Phase 1 serial-core foundation**, the **Phase 2 transport-neutral session broker**, native USB CDC-ACM, and the **Phase 4 Wi-Fi foundation**. The current Phase 5A foundation adds authenticated HTTPS with a persistent device-specific identity and physical-console recovery. WebSocket/xterm.js serial transport is deliberately deferred to the next web phase. The MAX3243 diagnostics and recovery consoles remain available. No electrical test starts automatically; UART1 starts when requested explicitly or when a host opens native USB CDC. +The firmware has completed **Phase 0 hardware characterization**, the **Phase 1 serial-core foundation**, the **Phase 2 transport-neutral session broker**, native USB CDC-ACM, the **Phase 4 Wi-Fi foundation**, and the **Phase 5 authenticated HTTPS web terminal**. Phase 5B adds an offline xterm.js interface and bounded WebSocket transport to the persistent HTTPS identity and recovery foundation from Phase 5A. The MAX3243 diagnostics and recovery consoles remain available. No electrical test starts automatically; UART1 starts when requested explicitly or when a native USB or authenticated web-terminal session opens. ## Hardware wiring @@ -273,16 +273,22 @@ Wi-Fi credentials currently reside as plaintext in the application-owned `wifi_a 8. Test `wifi stop`, `wifi start`, and `wifi reconnect` while confirming UART0 and native USB serial operation remain unaffected. 9. If available, test a WPA3-only profile and a wrong password, then inspect the disconnect reason and counters. -### Phase 5A authenticated HTTPS foundation +### Phase 5 authenticated HTTPS web terminal -One ESP-IDF HTTPS server listens on TCP port 443 across whichever AP and station interfaces are active. There is no plaintext port 80 listener. This slice intentionally exposes only: +One ESP-IDF HTTPS server listens on TCP port 443 across whichever AP and station interfaces are active. There is no plaintext port 80 listener. Phase 5A established persistent authentication, certificate management, and recovery; Phase 5B adds these local-only browser resources and transport endpoints: ```text -GET / -GET /api/status +GET / +GET /api/status +POST /api/ws-ticket +WSS /ws/serial?ticket= +GET /assets/xterm.css +GET /assets/xterm.js +GET /assets/addon-fit.js +GET /assets/app.js ``` -Both endpoints require HTTP Basic authentication over TLS. `/` is a small self-contained status landing page; `/api/status` returns JSON containing uptime plus non-secret Wi-Fi, serial-service, broker, native-USB, and HTTPS state/counters. No WebSocket, xterm.js terminal, or web broker client exists in Phase 5A. +The page, status API, assets, and ticket endpoint require HTTP Basic authentication over TLS. `/` is now a responsive xterm.js serial workspace; `/api/status` returns JSON containing uptime plus non-secret Wi-Fi, serial-service, broker, native-USB, HTTPS, and WebSocket state/counters. xterm.js and FitAddon are pinned, vendored, compressed, and served by the ESP32 itself, so the terminal works while connected only to the fallback AP and never depends on a CDN. On first boot, the device generates and persists: @@ -332,7 +338,37 @@ openssl s_client -connect 192.168.4.1:443 -servername esp32-sak-device.local +#include + +extern const uint8_t web_asset_xterm_js_gz[]; +extern const size_t web_asset_xterm_js_gz_size; + +extern const uint8_t web_asset_xterm_css_gz[]; +extern const size_t web_asset_xterm_css_gz_size; + +extern const uint8_t web_asset_addon_fit_js_gz[]; +extern const size_t web_asset_addon_fit_js_gz_size; + diff --git a/src/web_console.c b/src/web_console.c index 3a7b90f..b602342 100644 --- a/src/web_console.c +++ b/src/web_console.c @@ -10,6 +10,7 @@ #include "esp_console.h" #include "secure_random.h" #include "web_security.h" +#include "web_serial_transport.h" #include "web_server.h" static void print_usage(void) @@ -57,7 +58,37 @@ static int show_status(void) printf("Authentication material unavailable: %s; use 'web reset --force' to replace it.\n", esp_err_to_name(security_error)); } - printf("Endpoints: GET / and GET /api/status (authentication required)\n"); + printf("Endpoints: GET /, GET /api/status, POST /api/ws-ticket, WSS /ws/serial\n"); + + web_serial_transport_snapshot_t transport; + esp_err_t transport_error = web_serial_transport_get_snapshot(&transport); + if (transport_error != ESP_OK) { + printf("WebSocket serial transport unavailable: %s\n", + esp_err_to_name(snapshot.serial_transport_error)); + return 0; + } + + printf("WebSocket serial: attached=%s sessions=%" PRIu32 "/%u tickets=%" PRIu32 "\n", + transport.server_attached ? "yes" : "no", + transport.active_sessions, + WEB_SERIAL_TRANSPORT_MAX_SESSIONS, + transport.active_tickets); + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + const web_serial_transport_session_snapshot_t *session = + &transport.sessions[index]; + if (!session->active) { + continue; + } + printf(" slot=%u fd=%d generation=%" PRIu32 " broker=%" PRIu32 + " role=%s tx-pending=%s closing=%s\n", + (unsigned int)index, + session->socket_fd, + session->generation, + session->broker_client_id, + session->writer ? "writer" : "observer", + session->tx_pending ? "yes" : "no", + session->close_requested ? "yes" : "no"); + } return 0; } @@ -76,10 +107,50 @@ static int show_counters(void) counter->starts, counter->start_failures, counter->stops); printf("Requests: total=%" PRIu64 " authenticated=%" PRIu64 " auth-failures=%" PRIu64 " root=%" PRIu64 - " status=%" PRIu64 " response-errors=%" PRIu64 "\n", + " status=%" PRIu64 " tickets=%" PRIu64 " assets=%" PRIu64 + " response-errors=%" PRIu64 "\n", counter->requests, counter->authenticated_requests, counter->authentication_failures, counter->root_requests, - counter->status_requests, counter->response_errors); + counter->status_requests, counter->ticket_requests, + counter->asset_requests, counter->response_errors); + + web_serial_transport_snapshot_t transport; + error = web_serial_transport_get_snapshot(&transport); + if (error != ESP_OK) { + printf("WebSocket serial counters unavailable: %s\n", esp_err_to_name(error)); + return 0; + } + const web_serial_transport_counters_t *websocket = &transport.counters; + printf("Tickets: issued=%" PRIu64 " consumed=%" PRIu64 + " rejected=%" PRIu64 " expired=%" PRIu64 "\n", + websocket->tickets_issued, websocket->tickets_consumed, + websocket->tickets_rejected, websocket->tickets_expired); + printf("WebSocket sessions: connect=%" PRIu64 " failures=%" PRIu64 + " disconnect=%" PRIu64 " service-start-failures=%" PRIu64 + " broker-failures=%" PRIu64 "\n", + websocket->connections, websocket->connection_failures, + websocket->disconnections, websocket->service_start_failures, + websocket->broker_failures); + printf("WebSocket RX: frames-ok=%" PRIu64 " frames-rejected=%" PRIu64 + " bytes-ok=%" PRIu64 " bytes-rejected=%" PRIu64 "\n", + websocket->rx_ws_frames_accepted, + websocket->rx_ws_frames_rejected, + websocket->rx_ws_bytes_accepted, + websocket->rx_ws_bytes_rejected); + printf("WebSocket TX: binary-frames=%" PRIu64 " binary-bytes=%" PRIu64 + " control-frames=%" PRIu64 " control-bytes=%" PRIu64 "\n", + websocket->tx_binary_frames, websocket->tx_binary_bytes, + websocket->tx_control_frames, websocket->tx_control_bytes); + printf("WebSocket control: writer-requests=%" PRIu64 + " grants=%" PRIu64 " denials=%" PRIu64 + " releases=%" PRIu64 " revocations=%" PRIu64 "\n", + websocket->writer_requests, websocket->writer_grants, + websocket->writer_denials, websocket->writer_releases, + websocket->writer_revocations); + printf("WebSocket failures: send=%" PRIu64 " queue=%" PRIu64 + " protocol=%" PRIu64 " closes=%" PRIu64 "\n", + websocket->send_failures, websocket->queue_failures, + websocket->protocol_errors, websocket->close_requests); return 0; } @@ -160,7 +231,12 @@ static int rotate_credentials(void) return 1; } + esp_err_t revoke_error = web_serial_transport_revoke_sessions(); printf("Web credentials rotated and persisted. Existing Basic credentials are now invalid.\n"); + if (revoke_error != ESP_OK && revoke_error != ESP_ERR_INVALID_STATE) { + printf("Warning: existing WebSocket sessions could not be revoked: %s\n", + esp_err_to_name(revoke_error)); + } printf("Username: %.*s\nPassword: %.*s\n", (int)credentials.username_length, credentials.username, (int)credentials.password_length, credentials.password); @@ -247,11 +323,14 @@ static int command_web(int argc, char **argv) } if (argc == 2 && strcmp(argv[1], "clear-counters") == 0) { esp_err_t error = web_server_clear_counters(); + if (error == ESP_OK) { + error = web_serial_transport_clear_counters(); + } if (error != ESP_OK) { - printf("Could not clear HTTPS counters: %s\n", esp_err_to_name(error)); + printf("Could not clear web counters: %s\n", esp_err_to_name(error)); return 1; } - printf("HTTPS counters cleared.\n"); + printf("HTTPS and WebSocket counters cleared.\n"); return 0; } if (argc == 3 && strcmp(argv[1], "credentials") == 0 && diff --git a/src/web_serial_transport.c b/src/web_serial_transport.c new file mode 100644 index 0000000..f333938 --- /dev/null +++ b/src/web_serial_transport.c @@ -0,0 +1,1632 @@ +/* SPDX-License-Identifier: GPL-3.0-only */ +/* Authenticated, bounded WebSocket transport for the serial session broker. */ + +#include "web_serial_transport.h" + +#include +#include +#include + +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "mbedtls/sha256.h" +#include "sdkconfig.h" +#include "secure_random.h" +#include "serial_service.h" +#include "web_security.h" + +#if !defined(CONFIG_HTTPD_WS_SUPPORT) || !CONFIG_HTTPD_WS_SUPPORT +#error "web_serial_transport requires CONFIG_HTTPD_WS_SUPPORT" +#endif + +#define WEB_SERIAL_RANDOM_BYTES 24U +#define WEB_SERIAL_SHA256_BYTES 32U +#define WEB_SERIAL_QUERY_CAPACITY 48U +#define WEB_SERIAL_HOST_CAPACITY 128U +#define WEB_SERIAL_ORIGIN_CAPACITY (sizeof("https://") + WEB_SERIAL_HOST_CAPACITY) +#define WEB_SERIAL_TICKET_RESPONSE_CAPACITY 96U +#define WEB_SERIAL_TASK_STACK_SIZE 6144U +#define WEB_SERIAL_TASK_PRIORITY 7U +#define WEB_SERIAL_POLL_MS 5U +#define WEB_SERIAL_DETACH_TIMEOUT_US 1000000LL + +_Static_assert(WEB_SERIAL_TRANSPORT_TICKET_LENGTH == + (WEB_SERIAL_RANDOM_BYTES * 4U) / 3U, + "24 random bytes must encode as 32 unpadded Base64URL bytes"); +_Static_assert(WEB_SERIAL_TRANSPORT_TX_PAYLOAD_SIZE <= 512U, + "WebSocket TX buffers must remain bounded to 512 bytes"); + +typedef enum { + WEB_SERIAL_SLOT_FREE = 0, + WEB_SERIAL_SLOT_RESERVED, + WEB_SERIAL_SLOT_ACTIVE, + WEB_SERIAL_SLOT_CLOSING, +} web_serial_slot_state_t; + +typedef struct { + uint8_t digest[WEB_SERIAL_SHA256_BYTES]; + int64_t expires_at_us; + uint32_t material_generation; + bool active; +} web_serial_ticket_t; + +struct web_serial_slot; + +typedef struct { + struct web_serial_slot *slot; + httpd_handle_t server; + int socket_fd; + uint32_t generation; +} web_serial_work_t; + +typedef struct web_serial_slot { + web_serial_slot_state_t state; + httpd_handle_t server; + int socket_fd; + uint32_t generation; + session_broker_client_id_t broker_client_id; + bool writer; + bool hello_pending; + bool work_pending; + bool close_requested; + bool close_triggered; + int64_t close_retry_at_us; + bool disconnect_busy; + httpd_ws_type_t tx_type; + size_t tx_length; + uint8_t rx_data[WEB_SERIAL_TRANSPORT_MAX_RX_PAYLOAD]; + uint8_t tx_data[WEB_SERIAL_TRANSPORT_TX_PAYLOAD_SIZE]; + web_serial_work_t work; +} web_serial_slot_t; + +static portMUX_TYPE s_lock = portMUX_INITIALIZER_UNLOCKED; +static bool s_initialized; +static httpd_handle_t s_server; +static TaskHandle_t s_transport_task; +static StaticTask_t s_transport_task_storage; +static StackType_t + s_transport_task_stack[WEB_SERIAL_TASK_STACK_SIZE / sizeof(StackType_t)]; +static web_serial_ticket_t s_tickets[WEB_SERIAL_TRANSPORT_MAX_TICKETS]; +static web_serial_slot_t s_slots[WEB_SERIAL_TRANSPORT_MAX_SESSIONS]; +static web_serial_transport_counters_t s_counters; +static uint32_t s_httpd_close_operations; +static uint32_t s_inflight_handlers; + +static TickType_t milliseconds_to_ticks(uint32_t milliseconds) +{ + TickType_t ticks = pdMS_TO_TICKS(milliseconds); + return (milliseconds > 0U && ticks == 0U) ? 1U : ticks; +} + +static int64_t monotonic_time_us(void) +{ + return esp_timer_get_time(); +} + +static void notify_transport_task(void) +{ + TaskHandle_t task; + taskENTER_CRITICAL(&s_lock); + task = s_transport_task; + taskEXIT_CRITICAL(&s_lock); + if (task != NULL) { + xTaskNotifyGive(task); + } +} + +static void add_counter(uint64_t *counter, uint64_t amount) +{ + taskENTER_CRITICAL(&s_lock); + *counter += amount; + taskEXIT_CRITICAL(&s_lock); +} + +static uint32_t next_generation(uint32_t generation) +{ + ++generation; + return generation == 0U ? 1U : generation; +} + +static bool slot_pointer_valid(const web_serial_slot_t *slot) +{ + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + if (slot == &s_slots[index]) { + return true; + } + } + return false; +} + +static void clear_ticket_locked(web_serial_ticket_t *ticket) +{ + secure_wipe(ticket->digest, sizeof(ticket->digest)); + ticket->expires_at_us = 0; + ticket->material_generation = 0U; + ticket->active = false; +} + +static void clear_all_tickets_locked(void) +{ + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; ++index) { + clear_ticket_locked(&s_tickets[index]); + } +} + +static void purge_tickets_locked(int64_t now_us, uint32_t material_generation, + bool check_generation) +{ + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; ++index) { + web_serial_ticket_t *ticket = &s_tickets[index]; + if (!ticket->active) { + continue; + } + if (ticket->expires_at_us <= now_us) { + clear_ticket_locked(ticket); + ++s_counters.tickets_expired; + } else if (check_generation && + ticket->material_generation != material_generation) { + clear_ticket_locked(ticket); + } + } +} + +static bool constant_time_equal(const uint8_t *left, const uint8_t *right, + size_t length) +{ + uint8_t difference = 0U; + for (size_t index = 0U; index < length; ++index) { + difference |= left[index] ^ right[index]; + } + return difference == 0U; +} + +static void encode_base64url_24(const uint8_t input[WEB_SERIAL_RANDOM_BYTES], + char output[WEB_SERIAL_TRANSPORT_TICKET_CAPACITY]) +{ + static const char alphabet[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + + size_t output_offset = 0U; + for (size_t input_offset = 0U; input_offset < WEB_SERIAL_RANDOM_BYTES; + input_offset += 3U) { + uint32_t value = ((uint32_t)input[input_offset] << 16U) | + ((uint32_t)input[input_offset + 1U] << 8U) | + input[input_offset + 2U]; + output[output_offset++] = alphabet[(value >> 18U) & 0x3fU]; + output[output_offset++] = alphabet[(value >> 12U) & 0x3fU]; + output[output_offset++] = alphabet[(value >> 6U) & 0x3fU]; + output[output_offset++] = alphabet[value & 0x3fU]; + } + output[output_offset] = '\0'; +} + +static bool base64url_character(char value) +{ + return (value >= 'A' && value <= 'Z') || + (value >= 'a' && value <= 'z') || + (value >= '0' && value <= '9') || value == '-' || value == '_'; +} + +static esp_err_t current_material_generation(uint32_t *generation) +{ + web_security_certificate_metadata_t metadata; + esp_err_t result = web_security_get_certificate_metadata(&metadata); + if (result == ESP_OK) { + *generation = metadata.material_generation; + } + secure_wipe(&metadata, sizeof(metadata)); + return result; +} + +static esp_err_t sha256_ticket(const char *ticket, + uint8_t digest[WEB_SERIAL_SHA256_BYTES]) +{ + return mbedtls_sha256((const unsigned char *)ticket, + WEB_SERIAL_TRANSPORT_TICKET_LENGTH, + digest, 0) == 0 + ? ESP_OK + : ESP_FAIL; +} + +static esp_err_t extract_ticket_query(httpd_req_t *request, + char ticket[WEB_SERIAL_TRANSPORT_TICKET_CAPACITY]) +{ + char query[WEB_SERIAL_QUERY_CAPACITY] = {0}; + const char prefix[] = WEB_SERIAL_TRANSPORT_TICKET_QUERY_KEY "="; + size_t query_length = httpd_req_get_url_query_len(request); + esp_err_t result = ESP_ERR_INVALID_ARG; + + if (query_length == 0U || query_length >= sizeof(query) || + httpd_req_get_url_query_str(request, query, sizeof(query)) != ESP_OK) { + goto cleanup; + } + + size_t prefix_length = sizeof(prefix) - 1U; + if (query_length != prefix_length + WEB_SERIAL_TRANSPORT_TICKET_LENGTH || + memcmp(query, prefix, prefix_length) != 0) { + goto cleanup; + } + + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_TICKET_LENGTH; ++index) { + char value = query[prefix_length + index]; + if (!base64url_character(value)) { + goto cleanup; + } + ticket[index] = value; + } + ticket[WEB_SERIAL_TRANSPORT_TICKET_LENGTH] = '\0'; + result = ESP_OK; + +cleanup: + secure_wipe(query, sizeof(query)); + return result; +} + +static esp_err_t validate_origin(httpd_req_t *request) +{ + char origin[WEB_SERIAL_ORIGIN_CAPACITY] = {0}; + char host[WEB_SERIAL_HOST_CAPACITY] = {0}; + char expected[WEB_SERIAL_ORIGIN_CAPACITY] = {0}; + + esp_err_t result = httpd_req_get_hdr_value_str( + request, "Origin", origin, sizeof(origin)); + if (result == ESP_ERR_NOT_FOUND) { + return ESP_OK; + } + if (result != ESP_OK) { + return ESP_ERR_INVALID_ARG; + } + + size_t host_length = httpd_req_get_hdr_value_len(request, "Host"); + if (host_length == 0U || host_length >= sizeof(host) || + httpd_req_get_hdr_value_str(request, "Host", host, sizeof(host)) != ESP_OK) { + secure_wipe(origin, sizeof(origin)); + return ESP_ERR_INVALID_ARG; + } + + int written = snprintf(expected, sizeof(expected), "https://%s", host); + bool matches = written > 0 && (size_t)written < sizeof(expected) && + strcmp(origin, expected) == 0; + secure_wipe(origin, sizeof(origin)); + secure_wipe(host, sizeof(host)); + secure_wipe(expected, sizeof(expected)); + return matches ? ESP_OK : ESP_ERR_INVALID_ARG; +} + +static esp_err_t consume_ticket(const char *ticket, bool *consumed) +{ + uint8_t digest[WEB_SERIAL_SHA256_BYTES] = {0}; + uint32_t generation = 0U; + *consumed = false; + + esp_err_t result = current_material_generation(&generation); + if (result == ESP_OK) { + result = sha256_ticket(ticket, digest); + } + if (result != ESP_OK) { + secure_wipe(digest, sizeof(digest)); + add_counter(&s_counters.tickets_rejected, 1U); + return result; + } + + int64_t now_us = monotonic_time_us(); + size_t matching_index = WEB_SERIAL_TRANSPORT_MAX_TICKETS; + size_t matching_count = 0U; + + taskENTER_CRITICAL(&s_lock); + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; ++index) { + web_serial_ticket_t *entry = &s_tickets[index]; + bool digest_matches = + constant_time_equal(entry->digest, digest, sizeof(digest)); + if (entry->active && digest_matches) { + matching_index = index; + ++matching_count; + } + } + + purge_tickets_locked(now_us, generation, true); + if (matching_count == 1U && + matching_index < WEB_SERIAL_TRANSPORT_MAX_TICKETS) { + web_serial_ticket_t *entry = &s_tickets[matching_index]; + if (entry->active && entry->expires_at_us > now_us && + entry->material_generation == generation) { + clear_ticket_locked(entry); + ++s_counters.tickets_consumed; + *consumed = true; + } + } + if (!*consumed) { + /* A defensive duplicate can never become a repeatedly usable ticket. */ + if (matching_count > 1U) { + for (size_t index = 0U; + index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; ++index) { + web_serial_ticket_t *entry = &s_tickets[index]; + if (entry->active && constant_time_equal( + entry->digest, digest, + sizeof(digest))) { + clear_ticket_locked(entry); + } + } + } + ++s_counters.tickets_rejected; + } + taskEXIT_CRITICAL(&s_lock); + + secure_wipe(digest, sizeof(digest)); + return ESP_OK; +} + +static web_serial_slot_t *reserve_slot(httpd_handle_t server, int socket_fd, + uint32_t *generation) +{ + web_serial_slot_t *selected = NULL; + + taskENTER_CRITICAL(&s_lock); + if (s_initialized && s_server == server) { + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; + ++index) { + web_serial_slot_t *slot = &s_slots[index]; + if (slot->state != WEB_SERIAL_SLOT_FREE) { + continue; + } + slot->generation = next_generation(slot->generation); + slot->state = WEB_SERIAL_SLOT_RESERVED; + slot->server = server; + slot->socket_fd = socket_fd; + slot->broker_client_id = SESSION_BROKER_NO_CLIENT; + slot->writer = false; + slot->hello_pending = false; + slot->work_pending = false; + slot->close_requested = false; + slot->close_triggered = false; + slot->close_retry_at_us = 0; + slot->disconnect_busy = false; + slot->tx_length = 0U; + selected = slot; + *generation = slot->generation; + break; + } + } + taskEXIT_CRITICAL(&s_lock); + return selected; +} + +static void make_slot_free_locked(web_serial_slot_t *slot) +{ + slot->state = WEB_SERIAL_SLOT_FREE; + slot->server = NULL; + slot->socket_fd = -1; + slot->broker_client_id = SESSION_BROKER_NO_CLIENT; + slot->writer = false; + slot->hello_pending = false; + slot->work_pending = false; + slot->close_requested = false; + slot->close_triggered = false; + slot->close_retry_at_us = 0; + slot->disconnect_busy = false; + slot->tx_length = 0U; +} + +static void release_reserved_slot(web_serial_slot_t *slot, uint32_t generation) +{ + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_RESERVED && + slot->generation == generation) { + make_slot_free_locked(slot); + } + taskEXIT_CRITICAL(&s_lock); +} + +static void close_unpublished_broker_session(web_serial_slot_t *slot, + uint32_t generation, + session_broker_client_id_t client_id) +{ + esp_err_t result = session_broker_disconnect(client_id); + + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_RESERVED && + slot->generation == generation) { + if (result == ESP_OK || result == ESP_ERR_NOT_FOUND) { + make_slot_free_locked(slot); + } else { + slot->state = WEB_SERIAL_SLOT_CLOSING; + slot->broker_client_id = client_id; + ++s_counters.broker_failures; + } + } + taskEXIT_CRITICAL(&s_lock); + if (result != ESP_OK && result != ESP_ERR_NOT_FOUND) { + notify_transport_task(); + } +} + +static void request_handler_close(web_serial_slot_t *slot, uint32_t generation) +{ + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && + (slot->state == WEB_SERIAL_SLOT_ACTIVE || + slot->state == WEB_SERIAL_SLOT_CLOSING)) { + slot->close_requested = true; + if (!slot->close_triggered) { + /* Returning ESP_FAIL closes this request; do not also queue a close. */ + slot->close_triggered = true; + ++s_counters.close_requests; + } + } + taskEXIT_CRITICAL(&s_lock); +} + +static esp_err_t reject_protocol_frame(web_serial_slot_t *slot, + uint32_t generation, size_t payload_length) +{ + taskENTER_CRITICAL(&s_lock); + ++s_counters.rx_ws_frames_rejected; + s_counters.rx_ws_bytes_rejected += payload_length; + ++s_counters.protocol_errors; + taskEXIT_CRITICAL(&s_lock); + request_handler_close(slot, generation); + return ESP_FAIL; +} + +static void web_serial_session_free(void *context) +{ + web_serial_slot_t *slot = context; + if (!slot_pointer_valid(slot)) { + return; + } + + bool notify = false; + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_ACTIVE) { + slot->state = WEB_SERIAL_SLOT_CLOSING; + slot->writer = false; + slot->hello_pending = false; + slot->close_requested = false; + slot->close_triggered = true; + slot->close_retry_at_us = 0; + ++s_counters.disconnections; + notify = true; + } + taskEXIT_CRITICAL(&s_lock); + + if (notify) { + notify_transport_task(); + } +} + +static esp_err_t send_plain_bad_request(httpd_req_t *request) +{ + static const char message[] = "WebSocket upgrade required.\n"; + esp_err_t result = httpd_resp_set_status(request, "400 Bad Request"); + if (result == ESP_OK) { + result = httpd_resp_set_type(request, "text/plain; charset=utf-8"); + } + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "Cache-Control", "no-store"); + } + if (result == ESP_OK) { + result = httpd_resp_send(request, message, sizeof(message) - 1U); + } + return result; +} + +static esp_err_t connect_websocket(httpd_req_t *request, int socket_fd) +{ + char ticket[WEB_SERIAL_TRANSPORT_TICKET_CAPACITY] = {0}; + uint32_t slot_generation = 0U; + web_serial_slot_t *slot = NULL; + bool consumed = false; + esp_err_t result; + + if (validate_origin(request) != ESP_OK || + extract_ticket_query(request, ticket) != ESP_OK) { + add_counter(&s_counters.tickets_rejected, 1U); + result = ESP_FAIL; + goto cleanup; + } + + slot = reserve_slot(request->handle, socket_fd, &slot_generation); + if (slot == NULL) { + add_counter(&s_counters.connection_failures, 1U); + result = ESP_FAIL; + goto cleanup; + } + + result = consume_ticket(ticket, &consumed); + if (result != ESP_OK || !consumed) { + release_reserved_slot(slot, slot_generation); + result = ESP_FAIL; + goto cleanup; + } + + if (!serial_service_is_running()) { + result = serial_service_start(); + /* Another permanent transport may have won the start race. */ + if (result != ESP_OK && serial_service_is_running()) { + result = ESP_OK; + } + if (result != ESP_OK) { + add_counter(&s_counters.service_start_failures, 1U); + add_counter(&s_counters.connection_failures, 1U); + release_reserved_slot(slot, slot_generation); + result = ESP_FAIL; + goto cleanup; + } + } + + size_t slot_index = (size_t)(slot - s_slots); + char client_name[SESSION_BROKER_CLIENT_NAME_MAX + 1U]; + int written = snprintf(client_name, sizeof(client_name), + "web-%u-%" PRIu32, + (unsigned int)slot_index, slot_generation); + if (written <= 0 || (size_t)written >= sizeof(client_name)) { + add_counter(&s_counters.connection_failures, 1U); + release_reserved_slot(slot, slot_generation); + result = ESP_FAIL; + goto cleanup; + } + + session_broker_client_id_t client_id = SESSION_BROKER_NO_CLIENT; + result = session_broker_connect(SESSION_BROKER_CLIENT_WEB, + client_name, &client_id); + if (result != ESP_OK) { + add_counter(&s_counters.connection_failures, 1U); + add_counter(&s_counters.broker_failures, 1U); + release_reserved_slot(slot, slot_generation); + result = ESP_FAIL; + goto cleanup; + } + + add_counter(&s_counters.writer_requests, 1U); + result = session_broker_request_writer(client_id); + bool writer = result == ESP_OK; + if (writer) { + add_counter(&s_counters.writer_grants, 1U); + } else if (result == ESP_ERR_INVALID_STATE) { + add_counter(&s_counters.writer_denials, 1U); + } else { + add_counter(&s_counters.connection_failures, 1U); + add_counter(&s_counters.broker_failures, 1U); + close_unpublished_broker_session(slot, slot_generation, client_id); + result = ESP_FAIL; + goto cleanup; + } + + bool activated = false; + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_RESERVED && + slot->generation == slot_generation && + s_server == request->handle) { + slot->state = WEB_SERIAL_SLOT_ACTIVE; + slot->broker_client_id = client_id; + slot->writer = writer; + slot->hello_pending = true; + ++s_counters.connections; + activated = true; + } + taskEXIT_CRITICAL(&s_lock); + + if (!activated) { + add_counter(&s_counters.connection_failures, 1U); + close_unpublished_broker_session(slot, slot_generation, client_id); + result = ESP_FAIL; + goto cleanup; + } + + /* Static context is published only after service and broker setup succeed. */ + request->sess_ctx = slot; + request->free_ctx = web_serial_session_free; + notify_transport_task(); + result = ESP_OK; + +cleanup: + secure_wipe(ticket, sizeof(ticket)); + return result; +} + +static bool capture_active_session(httpd_req_t *request, web_serial_slot_t **slot_out, + uint32_t *generation, + session_broker_client_id_t *client_id) +{ + web_serial_slot_t *slot = request->sess_ctx; + int socket_fd = httpd_req_to_sockfd(request); + if (!slot_pointer_valid(slot) || socket_fd < 0) { + return false; + } + + bool valid; + taskENTER_CRITICAL(&s_lock); + valid = slot->state == WEB_SERIAL_SLOT_ACTIVE && + s_server == request->handle && + slot->server == request->handle && + slot->socket_fd == socket_fd && + slot->broker_client_id != SESSION_BROKER_NO_CLIENT; + if (valid) { + *slot_out = slot; + *generation = slot->generation; + *client_id = slot->broker_client_id; + } + taskEXIT_CRITICAL(&s_lock); + return valid; +} + +static void account_accepted_frame(size_t accepted, size_t rejected, + bool complete) +{ + taskENTER_CRITICAL(&s_lock); + s_counters.rx_ws_bytes_accepted += accepted; + s_counters.rx_ws_bytes_rejected += rejected; + if (complete) { + ++s_counters.rx_ws_frames_accepted; + } else { + ++s_counters.rx_ws_frames_rejected; + } + taskEXIT_CRITICAL(&s_lock); +} + +static esp_err_t process_binary_frame(web_serial_slot_t *slot, + uint32_t generation, + session_broker_client_id_t client_id, + const uint8_t *payload, size_t length) +{ + size_t accepted = 0U; + esp_err_t result = session_broker_write(client_id, payload, length, &accepted); + if (accepted > length) { + accepted = 0U; + result = ESP_FAIL; + } + + account_accepted_frame(accepted, length - accepted, + result == ESP_OK && accepted == length); + if (result == ESP_ERR_NOT_FOUND) { + add_counter(&s_counters.broker_failures, 1U); + request_handler_close(slot, generation); + return ESP_FAIL; + } + if (result != ESP_OK && result != ESP_ERR_INVALID_STATE && + result != ESP_ERR_TIMEOUT) { + add_counter(&s_counters.broker_failures, 1U); + } + return ESP_OK; +} + +static esp_err_t process_text_frame(web_serial_slot_t *slot, + uint32_t generation, + session_broker_client_id_t client_id, + const uint8_t *payload, size_t length) +{ + static const char request_writer[] = "request-writer"; + static const char release_writer[] = "release-writer"; + esp_err_t result; + + if (length == sizeof(request_writer) - 1U && + memcmp(payload, request_writer, length) == 0) { + bool was_writer; + taskENTER_CRITICAL(&s_lock); + was_writer = slot->generation == generation && slot->writer; + ++s_counters.writer_requests; + taskEXIT_CRITICAL(&s_lock); + + result = session_broker_request_writer(client_id); + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && result == ESP_OK) { + slot->writer = true; + } + if (result == ESP_OK && !was_writer) { + ++s_counters.writer_grants; + } else if (result == ESP_ERR_INVALID_STATE) { + ++s_counters.writer_denials; + } + taskEXIT_CRITICAL(&s_lock); + + account_accepted_frame(length, 0U, true); + if (result == ESP_ERR_NOT_FOUND) { + add_counter(&s_counters.broker_failures, 1U); + request_handler_close(slot, generation); + return ESP_FAIL; + } + return ESP_OK; + } + + if (length == sizeof(release_writer) - 1U && + memcmp(payload, release_writer, length) == 0) { + result = session_broker_release_writer(client_id); + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && result == ESP_OK) { + slot->writer = false; + ++s_counters.writer_releases; + } + taskEXIT_CRITICAL(&s_lock); + + account_accepted_frame(length, 0U, true); + if (result == ESP_ERR_NOT_FOUND) { + add_counter(&s_counters.broker_failures, 1U); + request_handler_close(slot, generation); + return ESP_FAIL; + } + return ESP_OK; + } + + return reject_protocol_frame(slot, generation, length); +} + +static esp_err_t process_websocket_frame(httpd_req_t *request) +{ + web_serial_slot_t *slot = NULL; + uint32_t generation = 0U; + session_broker_client_id_t client_id = SESSION_BROKER_NO_CLIENT; + if (!capture_active_session(request, &slot, &generation, &client_id)) { + add_counter(&s_counters.protocol_errors, 1U); + return ESP_FAIL; + } + + int socket_fd = httpd_req_to_sockfd(request); + if (httpd_ws_get_fd_info(request->handle, socket_fd) != + HTTPD_WS_CLIENT_WEBSOCKET) { + return reject_protocol_frame(slot, generation, 0U); + } + + httpd_ws_frame_t frame = {0}; + esp_err_t result = httpd_ws_recv_frame(request, &frame, 0U); + if (result != ESP_OK) { + return reject_protocol_frame(slot, generation, frame.len); + } + if (!frame.final || frame.type == HTTPD_WS_TYPE_CONTINUE || + frame.len > WEB_SERIAL_TRANSPORT_MAX_RX_PAYLOAD || + (frame.type != HTTPD_WS_TYPE_BINARY && + frame.type != HTTPD_WS_TYPE_TEXT)) { + return reject_protocol_frame(slot, generation, frame.len); + } + + frame.payload = slot->rx_data; + result = httpd_ws_recv_frame(request, &frame, sizeof(slot->rx_data)); + if (result != ESP_OK) { + return reject_protocol_frame(slot, generation, frame.len); + } + + if (frame.type == HTTPD_WS_TYPE_BINARY) { + return process_binary_frame(slot, generation, client_id, + slot->rx_data, frame.len); + } + return process_text_frame(slot, generation, client_id, + slot->rx_data, frame.len); +} + +static void finish_closing_slot_locked(web_serial_slot_t *slot) +{ + if (slot->state == WEB_SERIAL_SLOT_CLOSING && + slot->broker_client_id == SESSION_BROKER_NO_CLIENT && + !slot->work_pending) { + make_slot_free_locked(slot); + } +} + +static void web_serial_send_work(void *argument) +{ + web_serial_work_t *work = argument; + web_serial_slot_t *slot = work != NULL ? work->slot : NULL; + if (!slot_pointer_valid(slot)) { + return; + } + + httpd_handle_t server; + int socket_fd; + uint32_t generation; + httpd_ws_type_t type; + size_t length; + bool valid; + + taskENTER_CRITICAL(&s_lock); + valid = slot->work_pending && work == &slot->work && + work->generation == slot->generation && + work->server == slot->server && + work->socket_fd == slot->socket_fd; + server = work->server; + socket_fd = work->socket_fd; + generation = work->generation; + type = slot->tx_type; + length = slot->tx_length; + taskEXIT_CRITICAL(&s_lock); + if (!valid) { + return; + } + + esp_err_t result = ESP_FAIL; + void *current_context = httpd_sess_get_ctx(server, socket_fd); + if (current_context == slot && + httpd_ws_get_fd_info(server, socket_fd) == + HTTPD_WS_CLIENT_WEBSOCKET) { + httpd_ws_frame_t frame = { + .final = true, + .fragmented = false, + .type = type, + .payload = slot->tx_data, + .len = length, + }; + result = httpd_ws_send_frame_async(server, socket_fd, &frame); + if (result == ESP_OK) { + (void)httpd_sess_update_lru_counter(server, socket_fd); + } + } + + taskENTER_CRITICAL(&s_lock); + if (slot->work_pending && slot->generation == generation && + work == &slot->work) { + slot->work_pending = false; + slot->tx_length = 0U; + if (result == ESP_OK) { + if (type == HTTPD_WS_TYPE_BINARY) { + ++s_counters.tx_binary_frames; + s_counters.tx_binary_bytes += length; + } else { + ++s_counters.tx_control_frames; + s_counters.tx_control_bytes += length; + } + } else { + ++s_counters.send_failures; + slot->close_requested = true; + } + finish_closing_slot_locked(slot); + } + taskEXIT_CRITICAL(&s_lock); + notify_transport_task(); +} + +static esp_err_t queue_slot_frame(web_serial_slot_t *slot, uint32_t generation, + httpd_ws_type_t type, size_t length) +{ + httpd_handle_t server; + bool prepared = false; + + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_ACTIVE && + slot->generation == generation && !slot->work_pending && + !slot->close_requested && slot->server == s_server && + length <= sizeof(slot->tx_data)) { + slot->tx_type = type; + slot->tx_length = length; + slot->work.slot = slot; + slot->work.server = slot->server; + slot->work.socket_fd = slot->socket_fd; + slot->work.generation = generation; + slot->work_pending = true; + server = slot->server; + prepared = true; + } else { + server = NULL; + } + taskEXIT_CRITICAL(&s_lock); + + if (!prepared) { + return ESP_ERR_INVALID_STATE; + } + +#if defined(CONFIG_HTTPD_QUEUE_WORK_BLOCKING) && CONFIG_HTTPD_QUEUE_WORK_BLOCKING + esp_err_t result = ESP_ERR_NOT_SUPPORTED; +#else + esp_err_t result = httpd_queue_work(server, web_serial_send_work, + &slot->work); +#endif + if (result != ESP_OK) { + taskENTER_CRITICAL(&s_lock); + if (slot->work_pending && slot->generation == generation) { + slot->work_pending = false; + slot->tx_length = 0U; + slot->close_requested = true; + ++s_counters.queue_failures; + } + taskEXIT_CRITICAL(&s_lock); + notify_transport_task(); + } + return result; +} + +static const char *writer_event_name(session_broker_event_type_t type) +{ + switch (type) { + case SESSION_BROKER_EVENT_WRITER_GRANTED: + return "granted"; + case SESSION_BROKER_EVENT_WRITER_RELEASED: + return "released"; + case SESSION_BROKER_EVENT_WRITER_REVOKED: + return "revoked"; + case SESSION_BROKER_EVENT_WRITER_DENIED: + return "denied"; + default: + return NULL; + } +} + +static bool prepare_hello(web_serial_slot_t *slot, uint32_t generation, + session_broker_client_id_t client_id) +{ + session_broker_client_id_t writer_id = session_broker_get_writer_id(); + bool writer = writer_id == client_id; + int written = snprintf( + (char *)slot->tx_data, sizeof(slot->tx_data), + "{\"type\":\"hello\",\"clientId\":%" PRIu32 + ",\"role\":\"%s\",\"writerId\":%" PRIu32 "}", + client_id, writer ? "writer" : "observer", writer_id); + if (written <= 0 || (size_t)written >= sizeof(slot->tx_data)) { + return false; + } + + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && + slot->state == WEB_SERIAL_SLOT_ACTIVE) { + slot->writer = writer; + slot->hello_pending = false; + } + taskEXIT_CRITICAL(&s_lock); + return queue_slot_frame(slot, generation, HTTPD_WS_TYPE_TEXT, + (size_t)written) == ESP_OK; +} + +static bool prepare_writer_event(web_serial_slot_t *slot, uint32_t generation, + session_broker_client_id_t client_id) +{ + session_broker_event_t event; + for (size_t count = 0U; count < SESSION_BROKER_EVENT_QUEUE_LENGTH; ++count) { + esp_err_t result = session_broker_pop_event(client_id, &event); + if (result == ESP_ERR_TIMEOUT) { + return false; + } + if (result != ESP_OK) { + if (result == ESP_ERR_NOT_FOUND) { + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation) { + slot->close_requested = true; + ++s_counters.broker_failures; + } + taskEXIT_CRITICAL(&s_lock); + } + return false; + } + + session_broker_client_id_t writer_id = session_broker_get_writer_id(); + bool writer = writer_id == client_id; + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && + slot->state == WEB_SERIAL_SLOT_ACTIVE) { + slot->writer = writer; + if (event.type == SESSION_BROKER_EVENT_WRITER_REVOKED && + event.client_id == client_id) { + ++s_counters.writer_revocations; + } + } + taskEXIT_CRITICAL(&s_lock); + + const char *event_name = writer_event_name(event.type); + if (event_name == NULL) { + continue; + } + + int written = snprintf( + (char *)slot->tx_data, sizeof(slot->tx_data), + "{\"type\":\"writer\",\"event\":\"%s\"," + "\"sequence\":%" PRIu64 ",\"clientId\":%" PRIu32 + ",\"role\":\"%s\",\"writerId\":%" PRIu32 "}", + event_name, event.sequence, event.client_id, + writer ? "writer" : "observer", writer_id); + if (written <= 0 || (size_t)written >= sizeof(slot->tx_data)) { + taskENTER_CRITICAL(&s_lock); + ++s_counters.protocol_errors; + if (slot->generation == generation) { + slot->close_requested = true; + } + taskEXIT_CRITICAL(&s_lock); + return false; + } + return queue_slot_frame(slot, generation, HTTPD_WS_TYPE_TEXT, + (size_t)written) == ESP_OK; + } + return false; +} + +static bool prepare_writer_sync(web_serial_slot_t *slot, uint32_t generation, + session_broker_client_id_t client_id) +{ + session_broker_client_id_t writer_id = session_broker_get_writer_id(); + bool writer = writer_id == client_id; + bool changed = false; + + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && + slot->state == WEB_SERIAL_SLOT_ACTIVE && slot->writer != writer) { + slot->writer = writer; + changed = true; + } + taskEXIT_CRITICAL(&s_lock); + if (!changed) { + return false; + } + + int written = snprintf( + (char *)slot->tx_data, sizeof(slot->tx_data), + "{\"type\":\"writer\",\"event\":\"sync\",\"sequence\":0," + "\"clientId\":%" PRIu32 ",\"role\":\"%s\",\"writerId\":%" PRIu32 "}", + client_id, writer ? "writer" : "observer", writer_id); + if (written <= 0 || (size_t)written >= sizeof(slot->tx_data)) { + add_counter(&s_counters.protocol_errors, 1U); + return false; + } + return queue_slot_frame(slot, generation, HTTPD_WS_TYPE_TEXT, + (size_t)written) == ESP_OK; +} + +static void drain_binary_output(web_serial_slot_t *slot, uint32_t generation, + session_broker_client_id_t client_id) +{ + size_t received = 0U; + esp_err_t result = session_broker_read(client_id, slot->tx_data, + sizeof(slot->tx_data), &received); + if (result == ESP_OK && received > 0U) { + (void)queue_slot_frame(slot, generation, HTTPD_WS_TYPE_BINARY, received); + } else if (result == ESP_ERR_NOT_FOUND) { + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation) { + slot->close_requested = true; + ++s_counters.broker_failures; + } + taskEXIT_CRITICAL(&s_lock); + } else if (result != ESP_OK && result != ESP_ERR_TIMEOUT) { + add_counter(&s_counters.broker_failures, 1U); + } +} + +static void process_close_request(web_serial_slot_t *slot) +{ + httpd_handle_t server = NULL; + int socket_fd = -1; + uint32_t generation = 0U; + int64_t now_us = monotonic_time_us(); + + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_ACTIVE && slot->close_requested && + !slot->close_triggered && slot->close_retry_at_us <= now_us && + slot->server != NULL && slot->server == s_server) { + slot->close_triggered = true; + server = slot->server; + socket_fd = slot->socket_fd; + generation = slot->generation; + ++s_counters.close_requests; + ++s_httpd_close_operations; + } + taskEXIT_CRITICAL(&s_lock); + + if (server == NULL) { + return; + } + + esp_err_t result = httpd_sess_trigger_close(server, socket_fd); + bool session_gone = false; + if (result != ESP_OK) { + session_gone = result == ESP_ERR_NOT_FOUND || + httpd_sess_get_ctx(server, socket_fd) != slot; + } + + taskENTER_CRITICAL(&s_lock); + if (result != ESP_OK && slot->generation == generation && + slot->state == WEB_SERIAL_SLOT_ACTIVE) { + ++s_counters.queue_failures; + if (session_gone) { + slot->state = WEB_SERIAL_SLOT_CLOSING; + slot->writer = false; + slot->hello_pending = false; + slot->work_pending = false; + slot->tx_length = 0U; + ++s_counters.disconnections; + } else { + /* The nonblocking HTTPD control queue was full; retry later. */ + slot->close_triggered = false; + slot->close_retry_at_us = now_us + 100000LL; + } + } + if (s_httpd_close_operations > 0U) { + --s_httpd_close_operations; + } + taskEXIT_CRITICAL(&s_lock); + notify_transport_task(); +} + +static void process_broker_disconnect(web_serial_slot_t *slot) +{ + session_broker_client_id_t client_id = SESSION_BROKER_NO_CLIENT; + uint32_t generation = 0U; + + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_CLOSING && !slot->disconnect_busy && + slot->broker_client_id != SESSION_BROKER_NO_CLIENT) { + slot->disconnect_busy = true; + client_id = slot->broker_client_id; + generation = slot->generation; + } + taskEXIT_CRITICAL(&s_lock); + + if (client_id == SESSION_BROKER_NO_CLIENT) { + return; + } + + esp_err_t result = session_broker_disconnect(client_id); + taskENTER_CRITICAL(&s_lock); + if (slot->state == WEB_SERIAL_SLOT_CLOSING && + slot->generation == generation && slot->broker_client_id == client_id) { + slot->disconnect_busy = false; + if (result == ESP_OK || result == ESP_ERR_NOT_FOUND) { + slot->broker_client_id = SESSION_BROKER_NO_CLIENT; + } else { + ++s_counters.broker_failures; + } + finish_closing_slot_locked(slot); + } + taskEXIT_CRITICAL(&s_lock); +} + +static void process_active_output(web_serial_slot_t *slot) +{ + uint32_t generation; + session_broker_client_id_t client_id; + bool active; + bool hello_pending; + + taskENTER_CRITICAL(&s_lock); + active = slot->state == WEB_SERIAL_SLOT_ACTIVE && + !slot->work_pending && !slot->close_requested && + slot->server == s_server; + generation = slot->generation; + client_id = slot->broker_client_id; + hello_pending = slot->hello_pending; + taskEXIT_CRITICAL(&s_lock); + if (!active || client_id == SESSION_BROKER_NO_CLIENT) { + return; + } + + if (hello_pending) { + if (!prepare_hello(slot, generation, client_id)) { + taskENTER_CRITICAL(&s_lock); + if (slot->generation == generation && + slot->state == WEB_SERIAL_SLOT_ACTIVE && + !slot->work_pending) { + slot->close_requested = true; + } + taskEXIT_CRITICAL(&s_lock); + } + return; + } + if (prepare_writer_event(slot, generation, client_id)) { + return; + } + if (prepare_writer_sync(slot, generation, client_id)) { + return; + } + + taskENTER_CRITICAL(&s_lock); + active = slot->state == WEB_SERIAL_SLOT_ACTIVE && + slot->generation == generation && !slot->work_pending && + !slot->close_requested; + taskEXIT_CRITICAL(&s_lock); + if (active) { + drain_binary_output(slot, generation, client_id); + } +} + +static void transport_task(void *context) +{ + (void)context; + for (;;) { + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; + ++index) { + web_serial_slot_t *slot = &s_slots[index]; + process_close_request(slot); + process_broker_disconnect(slot); + process_active_output(slot); + } + (void)ulTaskNotifyTake(pdTRUE, + milliseconds_to_ticks(WEB_SERIAL_POLL_MS)); + } +} + +esp_err_t web_serial_transport_init(void) +{ +#if defined(CONFIG_HTTPD_QUEUE_WORK_BLOCKING) && CONFIG_HTTPD_QUEUE_WORK_BLOCKING + return ESP_ERR_NOT_SUPPORTED; +#else + taskENTER_CRITICAL(&s_lock); + if (s_initialized || s_transport_task != NULL) { + taskEXIT_CRITICAL(&s_lock); + return ESP_ERR_INVALID_STATE; + } + memset(s_tickets, 0, sizeof(s_tickets)); + memset(s_slots, 0, sizeof(s_slots)); + memset(&s_counters, 0, sizeof(s_counters)); + s_server = NULL; + s_httpd_close_operations = 0U; + s_inflight_handlers = 0U; + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + s_slots[index].socket_fd = -1; + } + taskEXIT_CRITICAL(&s_lock); + + TaskHandle_t task = xTaskCreateStatic( + transport_task, "web_serial", WEB_SERIAL_TASK_STACK_SIZE, NULL, + WEB_SERIAL_TASK_PRIORITY, s_transport_task_stack, + &s_transport_task_storage); + if (task == NULL) { + return ESP_ERR_NO_MEM; + } + + taskENTER_CRITICAL(&s_lock); + s_transport_task = task; + s_initialized = true; + taskEXIT_CRITICAL(&s_lock); + return ESP_OK; +#endif +} + +esp_err_t web_serial_transport_attach_server(httpd_handle_t server) +{ + if (server == NULL) { + return ESP_ERR_INVALID_ARG; + } + + esp_err_t result = ESP_OK; + taskENTER_CRITICAL(&s_lock); + if (!s_initialized) { + result = ESP_ERR_INVALID_STATE; + } else if (s_server != NULL) { + result = ESP_ERR_INVALID_STATE; + } else { + clear_all_tickets_locked(); + s_server = server; + } + taskEXIT_CRITICAL(&s_lock); + if (result == ESP_OK) { + notify_transport_task(); + } + return result; +} + +esp_err_t web_serial_transport_detach_server(httpd_handle_t server) +{ + if (server == NULL) { + return ESP_ERR_INVALID_ARG; + } + + esp_err_t result = ESP_OK; + taskENTER_CRITICAL(&s_lock); + if (!s_initialized || s_server != server) { + result = ESP_ERR_INVALID_STATE; + } else { + /* + * Revoke broker access before touching HTTPD. This keeps a failed server + * stop from retaining a writer lease or accepting post-detach input. + * Reserved generations remain owned by their in-progress handler, which + * observes the cleared server and disconnects unpublished broker state. + */ + s_server = NULL; + clear_all_tickets_locked(); + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; + ++index) { + web_serial_slot_t *slot = &s_slots[index]; + if (slot->server != server) { + continue; + } + /* Queued work validates this flag before touching the socket. */ + slot->work_pending = false; + slot->tx_length = 0U; + if (slot->state == WEB_SERIAL_SLOT_ACTIVE) { + slot->state = WEB_SERIAL_SLOT_CLOSING; + slot->writer = false; + slot->hello_pending = false; + slot->close_requested = false; + slot->close_triggered = true; + slot->close_retry_at_us = 0; + ++s_counters.disconnections; + } + } + } + taskEXIT_CRITICAL(&s_lock); + if (result == ESP_OK) { + notify_transport_task(); + /* + * No admitted handler or broker writer may outlive detach. HTTPD sends + * can finish later, but their static buffers cannot be reused until the + * server itself has stopped. + */ + int64_t detach_deadline = + monotonic_time_us() + WEB_SERIAL_DETACH_TIMEOUT_US; + for (;;) { + bool broker_sessions_gone = true; + taskENTER_CRITICAL(&s_lock); + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; + ++index) { + const web_serial_slot_t *slot = &s_slots[index]; + if (slot->server == server && + slot->broker_client_id != SESSION_BROKER_NO_CLIENT) { + broker_sessions_gone = false; + break; + } + } + bool operations_done = s_httpd_close_operations == 0U && + s_inflight_handlers == 0U; + bool quiescent = operations_done && broker_sessions_gone; + taskEXIT_CRITICAL(&s_lock); + if (quiescent) { + break; + } + if (operations_done && monotonic_time_us() >= detach_deadline) { + session_broker_client_id_t writer_id = + session_broker_get_writer_id(); + bool web_writer = false; + taskENTER_CRITICAL(&s_lock); + for (size_t index = 0U; + index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + const web_serial_slot_t *slot = &s_slots[index]; + if (slot->server == server && + slot->broker_client_id == writer_id) { + web_writer = writer_id != SESSION_BROKER_NO_CLIENT; + break; + } + } + taskEXIT_CRITICAL(&s_lock); + if (web_writer) { + (void)session_broker_force_writer(SESSION_BROKER_NO_CLIENT); + } + result = ESP_ERR_TIMEOUT; + break; + } + notify_transport_task(); + vTaskDelay(milliseconds_to_ticks(1U)); + } + } + return result; +} + +esp_err_t web_serial_transport_mint_ticket(char *ticket, size_t capacity) +{ + if (ticket == NULL || capacity < WEB_SERIAL_TRANSPORT_TICKET_CAPACITY) { + return ESP_ERR_INVALID_ARG; + } + ticket[0] = '\0'; + + uint8_t random_bytes[WEB_SERIAL_RANDOM_BYTES] = {0}; + uint8_t digest[WEB_SERIAL_SHA256_BYTES] = {0}; + uint32_t generation = 0U; + esp_err_t result = current_material_generation(&generation); + if (result == ESP_OK) { + result = secure_random_fill(random_bytes, sizeof(random_bytes)); + } + if (result == ESP_OK) { + encode_base64url_24(random_bytes, ticket); + result = sha256_ticket(ticket, digest); + } + if (result != ESP_OK) { + ticket[0] = '\0'; + goto cleanup; + } + + int64_t now_us = monotonic_time_us(); + bool stored = false; + taskENTER_CRITICAL(&s_lock); + if (s_initialized && s_server != NULL) { + purge_tickets_locked(now_us, generation, true); + size_t selected = WEB_SERIAL_TRANSPORT_MAX_TICKETS; + int64_t oldest_expiry = INT64_MAX; + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; + ++index) { + web_serial_ticket_t *entry = &s_tickets[index]; + if (!entry->active) { + selected = index; + break; + } + if (entry->expires_at_us < oldest_expiry) { + oldest_expiry = entry->expires_at_us; + selected = index; + } + } + if (selected < WEB_SERIAL_TRANSPORT_MAX_TICKETS) { + web_serial_ticket_t *entry = &s_tickets[selected]; + clear_ticket_locked(entry); + memcpy(entry->digest, digest, sizeof(entry->digest)); + entry->expires_at_us = + now_us + (int64_t)WEB_SERIAL_TRANSPORT_TICKET_LIFETIME_SECONDS * + 1000000LL; + entry->material_generation = generation; + entry->active = true; + ++s_counters.tickets_issued; + stored = true; + } + } + taskEXIT_CRITICAL(&s_lock); + + if (!stored) { + ticket[0] = '\0'; + result = ESP_ERR_NO_MEM; + } + +cleanup: + secure_wipe(random_bytes, sizeof(random_bytes)); + secure_wipe(digest, sizeof(digest)); + return result; +} + +esp_err_t web_serial_transport_handle_authenticated_ticket_request( + httpd_req_t *request) +{ + if (request == NULL) { + return ESP_ERR_INVALID_ARG; + } + if (request->method != HTTP_POST || request->content_len != 0U || + validate_origin(request) != ESP_OK) { + return ESP_ERR_INVALID_ARG; + } + + bool attached_request; + taskENTER_CRITICAL(&s_lock); + attached_request = s_initialized && s_server == request->handle; + taskEXIT_CRITICAL(&s_lock); + if (!attached_request) { + return ESP_ERR_INVALID_STATE; + } + + char ticket[WEB_SERIAL_TRANSPORT_TICKET_CAPACITY] = {0}; + char response[WEB_SERIAL_TICKET_RESPONSE_CAPACITY]; + esp_err_t result = web_serial_transport_mint_ticket(ticket, sizeof(ticket)); + if (result != ESP_OK) { + secure_wipe(ticket, sizeof(ticket)); + return result; + } + + int written = snprintf( + response, sizeof(response), + "{\"ticket\":\"%s\",\"expiresIn\":%u}\n", ticket, + (unsigned int)WEB_SERIAL_TRANSPORT_TICKET_LIFETIME_SECONDS); + if (written <= 0 || (size_t)written >= sizeof(response)) { + secure_wipe(ticket, sizeof(ticket)); + secure_wipe(response, sizeof(response)); + return ESP_FAIL; + } + + result = httpd_resp_set_type(request, "application/json; charset=utf-8"); + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "Cache-Control", "no-store"); + } + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "X-Content-Type-Options", "nosniff"); + } + if (result == ESP_OK) { + result = httpd_resp_send(request, response, written); + } + secure_wipe(ticket, sizeof(ticket)); + secure_wipe(response, sizeof(response)); + return result; +} + +esp_err_t web_serial_transport_ws_handler(httpd_req_t *request) +{ + if (request == NULL || request->handle == NULL) { + return ESP_ERR_INVALID_ARG; + } + + int socket_fd = httpd_req_to_sockfd(request); + if (socket_fd < 0) { + return ESP_FAIL; + } + + httpd_ws_client_info_t info = + httpd_ws_get_fd_info(request->handle, socket_fd); + if (info == HTTPD_WS_CLIENT_HTTP) { + (void)send_plain_bad_request(request); + add_counter(&s_counters.protocol_errors, 1U); + return ESP_FAIL; + } + if (info != HTTPD_WS_CLIENT_WEBSOCKET) { + return ESP_FAIL; + } + + taskENTER_CRITICAL(&s_lock); + bool admitted = s_initialized && s_server == request->handle; + if (admitted) { + ++s_inflight_handlers; + } + taskEXIT_CRITICAL(&s_lock); + if (!admitted) { + return ESP_FAIL; + } + + esp_err_t result; + if (request->sess_ctx == NULL) { + /* IDF has already sent 101; authentication failures must only close. */ + result = connect_websocket(request, socket_fd); + } else { + result = process_websocket_frame(request); + } + + taskENTER_CRITICAL(&s_lock); + if (s_inflight_handlers > 0U) { + --s_inflight_handlers; + } + taskEXIT_CRITICAL(&s_lock); + return result; +} + +esp_err_t web_serial_transport_get_snapshot( + web_serial_transport_snapshot_t *snapshot) +{ + if (snapshot == NULL) { + return ESP_ERR_INVALID_ARG; + } + + uint32_t generation = 0U; + bool have_generation = current_material_generation(&generation) == ESP_OK; + int64_t now_us = monotonic_time_us(); + + taskENTER_CRITICAL(&s_lock); + if (!s_initialized) { + taskEXIT_CRITICAL(&s_lock); + return ESP_ERR_INVALID_STATE; + } + purge_tickets_locked(now_us, generation, have_generation); + memset(snapshot, 0, sizeof(*snapshot)); + snapshot->initialized = true; + snapshot->server_attached = s_server != NULL; + snapshot->counters = s_counters; + + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_TICKETS; ++index) { + if (s_tickets[index].active) { + ++snapshot->active_tickets; + } + } + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + const web_serial_slot_t *slot = &s_slots[index]; + web_serial_transport_session_snapshot_t *session = + &snapshot->sessions[index]; + if (slot->state != WEB_SERIAL_SLOT_ACTIVE) { + session->socket_fd = -1; + continue; + } + session->active = true; + session->writer = slot->writer; + session->tx_pending = slot->work_pending; + session->close_requested = slot->close_requested; + session->socket_fd = slot->socket_fd; + session->generation = slot->generation; + session->broker_client_id = slot->broker_client_id; + ++snapshot->active_sessions; + } + taskEXIT_CRITICAL(&s_lock); + return ESP_OK; +} + +esp_err_t web_serial_transport_clear_counters(void) +{ + taskENTER_CRITICAL(&s_lock); + if (!s_initialized) { + taskEXIT_CRITICAL(&s_lock); + return ESP_ERR_INVALID_STATE; + } + memset(&s_counters, 0, sizeof(s_counters)); + taskEXIT_CRITICAL(&s_lock); + return ESP_OK; +} + +esp_err_t web_serial_transport_revoke_sessions(void) +{ + taskENTER_CRITICAL(&s_lock); + if (!s_initialized) { + taskEXIT_CRITICAL(&s_lock); + return ESP_ERR_INVALID_STATE; + } + + clear_all_tickets_locked(); + for (size_t index = 0U; index < WEB_SERIAL_TRANSPORT_MAX_SESSIONS; ++index) { + web_serial_slot_t *slot = &s_slots[index]; + if (slot->state == WEB_SERIAL_SLOT_ACTIVE) { + slot->close_requested = true; + } + } + taskEXIT_CRITICAL(&s_lock); + notify_transport_task(); + return ESP_OK; +} diff --git a/src/web_serial_transport.h b/src/web_serial_transport.h new file mode 100644 index 0000000..00bf361 --- /dev/null +++ b/src/web_serial_transport.h @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: GPL-3.0-only */ +/* Authenticated, bounded WebSocket transport for the serial session broker. */ + +#pragma once + +#include +#include +#include + +#include "esp_err.h" +#include "esp_http_server.h" +#include "session_broker.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define WEB_SERIAL_TRANSPORT_MAX_SESSIONS 2U +#define WEB_SERIAL_TRANSPORT_MAX_TICKETS 4U +#define WEB_SERIAL_TRANSPORT_TICKET_LENGTH 32U +#define WEB_SERIAL_TRANSPORT_TICKET_CAPACITY \ + (WEB_SERIAL_TRANSPORT_TICKET_LENGTH + 1U) +#define WEB_SERIAL_TRANSPORT_TICKET_LIFETIME_SECONDS 30U +#define WEB_SERIAL_TRANSPORT_MAX_RX_PAYLOAD 1024U +#define WEB_SERIAL_TRANSPORT_TX_PAYLOAD_SIZE 512U + +#define WEB_SERIAL_TRANSPORT_TICKET_URI "/api/ws-ticket" +#define WEB_SERIAL_TRANSPORT_WS_URI "/ws/serial" +#define WEB_SERIAL_TRANSPORT_TICKET_QUERY_KEY "ticket" + +typedef struct { + uint64_t tickets_issued; + uint64_t tickets_consumed; + uint64_t tickets_rejected; + uint64_t tickets_expired; + + uint64_t connections; + uint64_t connection_failures; + uint64_t disconnections; + uint64_t service_start_failures; + uint64_t broker_failures; + + uint64_t writer_requests; + uint64_t writer_grants; + uint64_t writer_denials; + uint64_t writer_releases; + uint64_t writer_revocations; + + uint64_t rx_ws_frames_accepted; + uint64_t rx_ws_frames_rejected; + uint64_t rx_ws_bytes_accepted; + uint64_t rx_ws_bytes_rejected; + + uint64_t tx_binary_frames; + uint64_t tx_binary_bytes; + uint64_t tx_control_frames; + uint64_t tx_control_bytes; + uint64_t send_failures; + uint64_t queue_failures; + uint64_t protocol_errors; + uint64_t close_requests; +} web_serial_transport_counters_t; + +typedef struct { + bool active; + bool writer; + bool tx_pending; + bool close_requested; + int socket_fd; + uint32_t generation; + session_broker_client_id_t broker_client_id; +} web_serial_transport_session_snapshot_t; + +typedef struct { + bool initialized; + bool server_attached; + uint32_t active_sessions; + uint32_t active_tickets; + web_serial_transport_session_snapshot_t + sessions[WEB_SERIAL_TRANSPORT_MAX_SESSIONS]; + web_serial_transport_counters_t counters; +} web_serial_transport_snapshot_t; + +/* + * Allocate no per-session heap objects and start the permanent transport task. + * CONFIG_HTTPD_WS_SUPPORT must be enabled. CONFIG_HTTPD_QUEUE_WORK_BLOCKING must + * be disabled because that IDF mode can wait forever inside httpd_queue_work(). + */ +esp_err_t web_serial_transport_init(void); + +/* Attach after httpd start; detach as part of stopping that same server. */ +esp_err_t web_serial_transport_attach_server(httpd_handle_t server); +esp_err_t web_serial_transport_detach_server(httpd_handle_t server); + +/* + * Mint a one-time bearer ticket for an already-authenticated caller. The output + * is exactly 32 Base64URL characters plus a terminator and expires after 30 + * monotonic seconds. Never log or persist the returned value. + */ +esp_err_t web_serial_transport_mint_ticket(char *ticket, size_t capacity); + +/* + * Convenience POST response helper for /api/ws-ticket. Authentication is + * intentionally outside this module: call this only after Basic authentication + * has already succeeded. Register it as HTTP_POST, not as a public handler. + */ +esp_err_t web_serial_transport_handle_authenticated_ticket_request( + httpd_req_t *request); + +/* + * Handler for /ws/serial. Register as HTTP_GET with is_websocket=true and + * handle_ws_control_frames=false. The initial upgraded GET authenticates the + * ticket; later invocations process one complete data frame. + */ +esp_err_t web_serial_transport_ws_handler(httpd_req_t *request); + +esp_err_t web_serial_transport_get_snapshot( + web_serial_transport_snapshot_t *snapshot); + +/* Clearing counters does not alter tickets, sessions, ownership, or queued data. */ +esp_err_t web_serial_transport_clear_counters(void); + +/* Invalidate outstanding tickets and close authenticated web serial sessions. */ +esp_err_t web_serial_transport_revoke_sessions(void); + +#ifdef __cplusplus +} +#endif diff --git a/src/web_server.c b/src/web_server.c index f163ea9..6fe34a6 100644 --- a/src/web_server.c +++ b/src/web_server.c @@ -21,28 +21,24 @@ #include "session_broker.h" #include "usb_cdc_transport.h" #include "web_security.h" +#include "web_serial_transport.h" +#include "web_ui.h" #include "wifi_manager.h" #define WEB_SERVER_PORT 443U #define WEB_SERVER_MAX_AUTHORIZATION 128U #define WEB_SERVER_MAX_BASIC_DECODED 64U -#define WEB_SERVER_STATUS_JSON_CAPACITY 2304U - -static const char s_index_html[] = - "" - "" - "ESP32 Serial Swiss Army Knife" - "" - "

ESP32 Serial Swiss Army Knife

" - "

Authenticated HTTPS is operational. Interactive web serial access is not enabled yet.

" - "

JSON status

"; +#define WEB_SERVER_STATUS_JSON_CAPACITY 3072U static SemaphoreHandle_t s_server_mutex; static httpd_handle_t s_server; static bool s_initialized; static bool s_transitioning; +static bool s_serial_transport_init_attempted; +static bool s_serial_transport_initialized; +static bool s_serial_transport_attached; static esp_err_t s_last_error = ESP_ERR_INVALID_STATE; +static esp_err_t s_serial_transport_error = ESP_ERR_INVALID_STATE; static web_server_counters_t s_counters; static esp_err_t ensure_mutex(void) @@ -167,33 +163,62 @@ static esp_err_t authorize_or_respond(httpd_req_t *request, bool *authorized) return *authorized ? ESP_OK : send_authentication_required(request); } -static esp_err_t root_handler(httpd_req_t *request) +static esp_err_t send_authenticated_ui(httpd_req_t *request, + web_ui_resource_t resource, + uint64_t *counter) { bool authorized = false; esp_err_t error = authorize_or_respond(request, &authorized); if (error != ESP_OK || !authorized) { return error; } - increment_counter(&s_counters.root_requests); + increment_counter(counter); - error = httpd_resp_set_type(request, "text/html; charset=utf-8"); - if (error == ESP_OK) { - error = set_common_headers(request); - } - if (error == ESP_OK) { - error = httpd_resp_set_hdr( - request, "Content-Security-Policy", - "default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; frame-ancestors 'none'"); - } - if (error == ESP_OK) { - error = httpd_resp_send(request, s_index_html, HTTPD_RESP_USE_STRLEN); - } + error = web_ui_send_response(request, resource); if (error != ESP_OK) { increment_counter(&s_counters.response_errors); } return error; } +static esp_err_t root_handler(httpd_req_t *request) +{ + return send_authenticated_ui(request, WEB_UI_RESOURCE_INDEX, + &s_counters.root_requests); +} + +static esp_err_t asset_handler(httpd_req_t *request) +{ + web_ui_resource_t resource = (web_ui_resource_t)(uintptr_t)request->user_ctx; + return send_authenticated_ui(request, resource, &s_counters.asset_requests); +} + +static esp_err_t ticket_handler(httpd_req_t *request) +{ + bool authorized = false; + esp_err_t error = authorize_or_respond(request, &authorized); + if (error != ESP_OK || !authorized) { + return error; + } + increment_counter(&s_counters.ticket_requests); + if (request->content_len != 0U) { + return send_plain_error(request, "400 Bad Request", + "Ticket requests must have an empty body.\n"); + } + + error = web_serial_transport_handle_authenticated_ticket_request(request); + if (error == ESP_OK) { + return ESP_OK; + } + if (error == ESP_ERR_INVALID_ARG) { + return send_plain_error(request, "400 Bad Request", + "Invalid web-terminal ticket request.\n"); + } + increment_counter(&s_counters.response_errors); + return send_plain_error(request, "503 Service Unavailable", + "Web terminal transport unavailable.\n"); +} + static const char *safe_string(const char *value) { return value != NULL ? value : "unknown"; @@ -242,6 +267,7 @@ static esp_err_t status_handler(httpd_req_t *request) session_broker_global_snapshot_t broker = {0}; usb_cdc_transport_snapshot_t usb = {0}; web_server_snapshot_t web = {0}; + web_serial_transport_snapshot_t web_serial = {0}; web_security_certificate_metadata_t certificate = {0}; char ipv4[16] = {0}; char fingerprint[WEB_SECURITY_SHA256_LENGTH * 3U] = {0}; @@ -253,6 +279,8 @@ static esp_err_t status_handler(httpd_req_t *request) bool broker_available = session_broker_get_global_snapshot(&broker) == ESP_OK; bool usb_available = usb_cdc_transport_get_snapshot(&usb) == ESP_OK; bool web_available = web_server_get_snapshot(&web) == ESP_OK; + bool web_serial_available = + web_serial_transport_get_snapshot(&web_serial) == ESP_OK; bool certificate_available = web_security_get_certificate_metadata(&certificate) == ESP_OK; @@ -278,7 +306,10 @@ static esp_err_t status_handler(httpd_req_t *request) " \"usb\":{\"available\":%s,\"attached\":%s,\"host_open\":%s,\"writer\":%s},\n" " \"https\":{\"running\":%s,\"requests\":%" PRIu64 "," "\"authenticated_requests\":%" PRIu64 ",\"authentication_failures\":%" PRIu64 "," - "\"certificate_sha256\":\"%s\"}\n" + "\"certificate_sha256\":\"%s\"},\n" + " \"websocket\":{\"available\":%s,\"sessions\":%" PRIu32 "," + "\"active_tickets\":%" PRIu32 ",\"rx_bytes\":%" PRIu64 "," + "\"rx_rejected\":%" PRIu64 ",\"tx_bytes\":%" PRIu64 "}\n" "}\n", (uint64_t)(esp_timer_get_time() / 1000), wifi_available ? "true" : "false", @@ -309,7 +340,16 @@ static esp_err_t status_handler(httpd_req_t *request) web_available ? web.counters.requests : 0U, web_available ? web.counters.authenticated_requests : 0U, web_available ? web.counters.authentication_failures : 0U, - fingerprint); + fingerprint, + web_serial_available ? "true" : "false", + web_serial_available ? web_serial.active_sessions : 0U, + web_serial_available ? web_serial.active_tickets : 0U, + web_serial_available ? web_serial.counters.rx_ws_bytes_accepted : 0U, + web_serial_available ? web_serial.counters.rx_ws_bytes_rejected : 0U, + web_serial_available + ? web_serial.counters.tx_binary_bytes + + web_serial.counters.tx_control_bytes + : 0U); if (written < 0 || (size_t)written >= sizeof(response)) { return send_plain_error(request, "500 Internal Server Error", @@ -342,18 +382,93 @@ static const httpd_uri_t s_status_uri = { .user_ctx = NULL, }; +static const httpd_uri_t s_ticket_uri = { + .uri = WEB_SERIAL_TRANSPORT_TICKET_URI, + .method = HTTP_POST, + .handler = ticket_handler, + .user_ctx = NULL, +}; + +static const httpd_uri_t s_websocket_uri = { + .uri = WEB_SERIAL_TRANSPORT_WS_URI, + .method = HTTP_GET, + .handler = web_serial_transport_ws_handler, + .user_ctx = NULL, + .is_websocket = true, + .handle_ws_control_frames = false, +}; + +static const httpd_uri_t s_xterm_js_uri = { + .uri = "/assets/xterm.js", + .method = HTTP_GET, + .handler = asset_handler, + .user_ctx = (void *)(uintptr_t)WEB_UI_RESOURCE_XTERM_JS, +}; + +static const httpd_uri_t s_xterm_css_uri = { + .uri = "/assets/xterm.css", + .method = HTTP_GET, + .handler = asset_handler, + .user_ctx = (void *)(uintptr_t)WEB_UI_RESOURCE_XTERM_CSS, +}; + +static const httpd_uri_t s_addon_fit_js_uri = { + .uri = "/assets/addon-fit.js", + .method = HTTP_GET, + .handler = asset_handler, + .user_ctx = (void *)(uintptr_t)WEB_UI_RESOURCE_ADDON_FIT_JS, +}; + +static const httpd_uri_t s_app_js_uri = { + .uri = "/assets/app.js", + .method = HTTP_GET, + .handler = asset_handler, + .user_ctx = (void *)(uintptr_t)WEB_UI_RESOURCE_APP_JS, +}; + +static const httpd_uri_t *const s_uri_handlers[] = { + &s_root_uri, + &s_status_uri, + &s_ticket_uri, + &s_websocket_uri, + &s_xterm_js_uri, + &s_xterm_css_uri, + &s_addon_fit_js_uri, + &s_app_js_uri, +}; + esp_err_t web_server_init(void) { esp_err_t error = ensure_mutex(); if (error != ESP_OK) { return error; } + + bool initialize_serial_transport = false; xSemaphoreTake(s_server_mutex, portMAX_DELAY); + if (!s_serial_transport_init_attempted) { + s_serial_transport_init_attempted = true; + initialize_serial_transport = true; + } + xSemaphoreGive(s_server_mutex); + + esp_err_t serial_transport_error = ESP_OK; + if (initialize_serial_transport) { + serial_transport_error = web_serial_transport_init(); + } + + xSemaphoreTake(s_server_mutex, portMAX_DELAY); + if (initialize_serial_transport) { + s_serial_transport_error = serial_transport_error; + s_serial_transport_initialized = serial_transport_error == ESP_OK; + } s_initialized = true; if (s_last_error == ESP_ERR_INVALID_STATE) { s_last_error = ESP_OK; } xSemaphoreGive(s_server_mutex); + + /* The Phase 5A HTTPS recovery surface remains available if WebSocket setup fails. */ return ESP_OK; } @@ -364,12 +479,14 @@ esp_err_t web_server_start(void) return error; } + bool serial_transport_ready; xSemaphoreTake(s_server_mutex, portMAX_DELAY); if (s_server != NULL || s_transitioning) { xSemaphoreGive(s_server_mutex); return ESP_ERR_INVALID_STATE; } s_transitioning = true; + serial_transport_ready = s_serial_transport_initialized; xSemaphoreGive(s_server_mutex); uint8_t certificate[WEB_SECURITY_CERTIFICATE_DER_CAPACITY] = {0}; @@ -383,9 +500,13 @@ esp_err_t web_server_start(void) private_key, sizeof(private_key), &private_key_length); if (error == ESP_OK) { httpd_ssl_config_t config = HTTPD_SSL_CONFIG_DEFAULT(); - config.httpd.max_open_sockets = 2; - config.httpd.max_uri_handlers = 2; + /* Two browser terminals retain room for parallel assets and status fetches. */ + config.httpd.max_open_sockets = 6; + config.httpd.max_uri_handlers = + sizeof(s_uri_handlers) / sizeof(s_uri_handlers[0]); config.httpd.lru_purge_enable = true; + config.httpd.recv_wait_timeout = 1; + config.httpd.send_wait_timeout = 1; config.servercert = certificate; config.servercert_len = certificate_length; config.prvtkey_pem = private_key; @@ -397,11 +518,18 @@ esp_err_t web_server_start(void) secure_wipe(certificate, sizeof(certificate)); secure_wipe(private_key, sizeof(private_key)); - if (error == ESP_OK) { - error = httpd_register_uri_handler(server, &s_root_uri); + for (size_t index = 0U; + error == ESP_OK && + index < sizeof(s_uri_handlers) / sizeof(s_uri_handlers[0]); + ++index) { + error = httpd_register_uri_handler(server, s_uri_handlers[index]); } - if (error == ESP_OK) { - error = httpd_register_uri_handler(server, &s_status_uri); + + bool serial_transport_attached = false; + esp_err_t attach_error = s_serial_transport_error; + if (error == ESP_OK && serial_transport_ready) { + attach_error = web_serial_transport_attach_server(server); + serial_transport_attached = attach_error == ESP_OK; } if (error != ESP_OK && server != NULL) { (void)httpd_ssl_stop(server); @@ -411,6 +539,8 @@ esp_err_t web_server_start(void) xSemaphoreTake(s_server_mutex, portMAX_DELAY); s_transitioning = false; s_last_error = error; + s_serial_transport_error = attach_error; + s_serial_transport_attached = serial_transport_attached; if (error == ESP_OK) { s_server = server; ++s_counters.starts; @@ -433,14 +563,35 @@ esp_err_t web_server_stop(void) return ESP_ERR_INVALID_STATE; } httpd_handle_t server = s_server; + bool serial_transport_attached = s_serial_transport_attached; + esp_err_t serial_transport_error = s_serial_transport_error; s_transitioning = true; xSemaphoreGive(s_server_mutex); + if (serial_transport_attached) { + esp_err_t detach_error = web_serial_transport_detach_server(server); + if (detach_error != ESP_OK && detach_error != ESP_ERR_TIMEOUT) { + xSemaphoreTake(s_server_mutex, portMAX_DELAY); + s_transitioning = false; + s_last_error = detach_error; + s_serial_transport_error = detach_error; + xSemaphoreGive(s_server_mutex); + return detach_error; + } + serial_transport_error = detach_error; + } + esp_err_t error = httpd_ssl_stop(server); + if (error != ESP_OK && serial_transport_attached) { + /* Stay detached: old HTTPD work may still be reading static TX storage. */ + serial_transport_error = ESP_ERR_INVALID_STATE; + } xSemaphoreTake(s_server_mutex, portMAX_DELAY); s_transitioning = false; s_last_error = error; + s_serial_transport_error = serial_transport_error; + s_serial_transport_attached = false; if (error == ESP_OK) { s_server = NULL; ++s_counters.stops; @@ -465,6 +616,7 @@ esp_err_t web_server_get_snapshot(web_server_snapshot_t *snapshot) snapshot->transitioning = s_transitioning; snapshot->port = WEB_SERVER_PORT; snapshot->last_error = s_last_error; + snapshot->serial_transport_error = s_serial_transport_error; snapshot->counters = s_counters; xSemaphoreGive(s_server_mutex); return ESP_OK; diff --git a/src/web_server.h b/src/web_server.h index 7bfec52..9bbc1c6 100644 --- a/src/web_server.h +++ b/src/web_server.h @@ -21,6 +21,8 @@ typedef struct { uint64_t authentication_failures; uint64_t root_requests; uint64_t status_requests; + uint64_t ticket_requests; + uint64_t asset_requests; uint64_t response_errors; } web_server_counters_t; @@ -30,6 +32,7 @@ typedef struct { bool transitioning; uint16_t port; esp_err_t last_error; + esp_err_t serial_transport_error; web_server_counters_t counters; } web_server_snapshot_t; diff --git a/src/web_ui.c b/src/web_ui.c new file mode 100644 index 0000000..db60ed8 --- /dev/null +++ b/src/web_ui.c @@ -0,0 +1,511 @@ +/* SPDX-License-Identifier: GPL-3.0-only */ +/* Offline browser UI response helpers for authenticated HTTPS routes. */ + +#include "web_ui.h" + +#include +#include +#include + +#include "web_assets_data.h" + +#define WEB_UI_DOCUMENT_CACHE_CONTROL "private, max-age=300" +#define WEB_UI_ASSET_CACHE_CONTROL "private, max-age=604800" + +static const char s_index_html[] = + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "ESP32 Serial Console\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "
\n" + "
\n" + "
SAK
" + "

ESP32 Serial Console

Secure local serial workspace

\n" + "Connecting\n" + "
\n" + "
\n" + "
\n" + "
Role" + "Observer
\n" + "
Broker client" + "
\n" + "
Active writer" + "None
\n" + "
Broker clients" + "
\n" + "
Wi-Fi" + "Loading…
\n" + "
Serial" + "Loading…
\n" + "
\n" + "
\n" + "
\n" + "\n" + "\n" + "\n" + "
\n" + "

" + "Observer mode — terminal input is disabled.

\n" + "

" + "Requesting a one-time connection ticket…

\n" + "
\n" + "
\n" + "
\n" + "
Live serial stream" + "Binary, unmodified device output
\n" + "
\n" + "
\n" + "
\n" + "\n" + "\n"; + +static const char s_app_js[] = + "(() => {\n" + "'use strict';\n" + "const element = (id) => document.getElementById(id);\n" + "const connectionStatus = element('connection-status');\n" + "const roleStatus = element('role-status');\n" + "const clientIdField = element('client-id');\n" + "const writerIdField = element('writer-id');\n" + "const brokerClientsField = element('broker-clients');\n" + "const wifiSummary = element('wifi-summary');\n" + "const serialSummary = element('serial-summary');\n" + "const inputState = element('input-state');\n" + "const connectionDetail = element('connection-detail');\n" + "const requestControl = element('request-control');\n" + "const releaseControl = element('release-control');\n" + "const reconnectButton = element('reconnect');\n" + "const terminalHost = element('terminal');\n" + "const terminal = new Terminal({\n" + " allowProposedApi: false, convertEol: false, cursorBlink: true, disableStdin: true,\n" + " fontFamily: '\"SFMono-Regular\",Consolas,\"Liberation Mono\",monospace',\n" + " fontSize: 14, scrollback: 5000, theme: {\n" + " background: '#080c12', foreground: '#dce7f5', cursor: '#55c2ff',\n" + " selectionBackground: '#285173', black: '#18202b', red: '#ff6b7a',\n" + " green: '#52d68b', yellow: '#ffc857', blue: '#55aaff',\n" + " magenta: '#c792ea', cyan: '#55d6be', white: '#e8eef8'\n" + " }\n" + "});\n" + "const fitAddon = new FitAddon.FitAddon();\n" + "terminal.loadAddon(fitAddon);\n" + "terminal.open(terminalHost);\n" + "const encoder = new TextEncoder();\n" + "let socket = null;\n" + "let ticketAbort = null;\n" + "let reconnectTimer = null;\n" + "let reconnectDelay = 1000;\n" + "let connectionGeneration = 0;\n" + "let role = 'observer';\n" + "let clientId = null;\n" + "let writerId = 0;\n" + "let unloading = false;\n" + "let fitFrame = 0;\n" + "let statusInFlight = false;\n" + "let statusTimer = null;\n" + "const setBadge = (target, text, tone) => {\n" + " target.textContent = text;\n" + " target.dataset.tone = tone;\n" + "};\n" + "const validId = (value) => Number.isSafeInteger(value) && value >= 0;\n" + "const displayId = (value, noneText) => validId(value) && value !== 0 ? String(value) : noneText;\n" + "const socketOpen = () => socket !== null && socket.readyState === WebSocket.OPEN;\n" + "const updateControls = () => {\n" + " const writer = role === 'writer';\n" + " terminal.options.disableStdin = !writer;\n" + " requestControl.disabled = !socketOpen() || writer;\n" + " releaseControl.disabled = !socketOpen() || !writer;\n" + " inputState.dataset.enabled = writer ? 'true' : 'false';\n" + " inputState.textContent = writer\n" + " ? 'Writer mode — terminal input is enabled.'\n" + " : 'Observer mode — terminal input is disabled.';\n" + " setBadge(roleStatus, writer ? 'Writer' : 'Observer', writer ? 'good' : 'warn');\n" + "};\n" + "const setRole = (nextRole) => {\n" + " role = nextRole === 'writer' ? 'writer' : 'observer';\n" + " updateControls();\n" + "};\n" + "const setConnection = (text, tone, detail) => {\n" + " setBadge(connectionStatus, text, tone);\n" + " connectionDetail.textContent = detail;\n" + " updateControls();\n" + "};\n" + "const clearReconnectTimer = () => {\n" + " if (reconnectTimer !== null) {\n" + " window.clearTimeout(reconnectTimer);\n" + " reconnectTimer = null;\n" + " }\n" + "};\n" + "const scheduleReconnect = () => {\n" + " if (unloading || reconnectTimer !== null) return;\n" + " const delay = reconnectDelay;\n" + " reconnectDelay = Math.min(reconnectDelay * 2, 10000);\n" + " setConnection('Disconnected', 'bad', `Reconnecting in ${Math.ceil(delay / 1000)} second(s)…`);\n" + " reconnectTimer = window.setTimeout(() => {\n" + " reconnectTimer = null;\n" + " connect();\n" + " }, delay);\n" + "};\n" + "const acceptBrokerMessage = (message) => {\n" + " if (message === null || typeof message !== 'object') return;\n" + " if (message.type !== 'hello' && message.type !== 'writer') return;\n" + " if (message.role !== 'writer' && message.role !== 'observer') return;\n" + " if (!validId(message.writerId)) return;\n" + " if (message.type === 'hello') {\n" + " if (!validId(message.clientId) || message.clientId === 0) return;\n" + " clientId = message.clientId;\n" + " clientIdField.textContent = String(clientId);\n" + " reconnectDelay = 1000;\n" + " }\n" + " writerId = message.writerId;\n" + " writerIdField.textContent = displayId(writerId, 'None');\n" + " setRole(message.role);\n" + "};\n" + "const handleSocketMessage = (event) => {\n" + " if (typeof event.data === 'string') {\n" + " try {\n" + " acceptBrokerMessage(JSON.parse(event.data));\n" + " } catch (_) {\n" + " setConnection('Protocol error', 'bad', 'The device sent an invalid control message.');\n" + " }\n" + " return;\n" + " }\n" + " if (event.data instanceof ArrayBuffer) {\n" + " terminal.write(new Uint8Array(event.data));\n" + " }\n" + "};\n" + "async function requestTicket(signal) {\n" + " const response = await fetch('/api/ws-ticket', {\n" + " method: 'POST', credentials: 'same-origin', cache: 'no-store', signal\n" + " });\n" + " if (!response.ok) throw new Error('ticket request failed');\n" + " const payload = await response.json();\n" + " if (payload === null || typeof payload !== 'object' ||\n" + " typeof payload.ticket !== 'string' || !/^[A-Za-z0-9_-]{32}$/.test(payload.ticket)) {\n" + " throw new Error('invalid ticket response');\n" + " }\n" + " const ticket = payload.ticket;\n" + " payload.ticket = '';\n" + " return ticket;\n" + "}\n" + "async function connect() {\n" + " if (unloading) return;\n" + " clearReconnectTimer();\n" + " const generation = ++connectionGeneration;\n" + " if (ticketAbort !== null) ticketAbort.abort();\n" + " ticketAbort = new AbortController();\n" + " if (socket !== null) {\n" + " const previous = socket;\n" + " socket = null;\n" + " previous.close();\n" + " }\n" + " clientId = null;\n" + " clientIdField.textContent = '—';\n" + " setRole('observer');\n" + " setConnection('Connecting', 'warn', 'Requesting a one-time connection ticket…');\n" + " try {\n" + " const ticket = await requestTicket(ticketAbort.signal);\n" + " if (unloading || generation !== connectionGeneration) return;\n" + " ticketAbort = null;\n" + " const url = new URL('/ws/serial', window.location.origin);\n" + " url.protocol = 'wss:';\n" + " url.searchParams.set('ticket', ticket);\n" + " const nextSocket = new WebSocket(url.toString());\n" + " url.search = '';\n" + " nextSocket.binaryType = 'arraybuffer';\n" + " socket = nextSocket;\n" + " nextSocket.addEventListener('open', () => {\n" + " if (socket !== nextSocket) return;\n" + " setConnection('Connected', 'good', 'Connected; waiting for broker role information.');\n" + " });\n" + " nextSocket.addEventListener('message', (event) => {\n" + " if (socket === nextSocket) handleSocketMessage(event);\n" + " });\n" + " nextSocket.addEventListener('error', () => {\n" + " if (socket === nextSocket) {\n" + " setConnection('Connection error', 'bad', 'The WebSocket connection failed.');\n" + " }\n" + " });\n" + " nextSocket.addEventListener('close', () => {\n" + " if (socket !== nextSocket) return;\n" + " socket = null;\n" + " clientId = null;\n" + " clientIdField.textContent = '—';\n" + " setRole('observer');\n" + " scheduleReconnect();\n" + " });\n" + " } catch (error) {\n" + " if (generation !== connectionGeneration || unloading || error.name === 'AbortError') return;\n" + " ticketAbort = null;\n" + " scheduleReconnect();\n" + " }\n" + "}\n" + "terminal.onData((data) => {\n" + " if (role !== 'writer' || !socketOpen()) return;\n" + " const bytes = encoder.encode(data);\n" + " for (let offset = 0; offset < bytes.length; offset += 1024) {\n" + " socket.send(bytes.subarray(offset, Math.min(offset + 1024, bytes.length)));\n" + " }\n" + "});\n" + "requestControl.addEventListener('click', () => {\n" + " if (role !== 'writer' && socketOpen()) socket.send('request-writer');\n" + "});\n" + "releaseControl.addEventListener('click', () => {\n" + " if (role === 'writer' && socketOpen()) socket.send('release-writer');\n" + "});\n" + "reconnectButton.addEventListener('click', () => {\n" + " reconnectDelay = 1000;\n" + " connect();\n" + "});\n" + "const scheduleFit = () => {\n" + " if (fitFrame !== 0) return;\n" + " fitFrame = window.requestAnimationFrame(() => {\n" + " fitFrame = 0;\n" + " try { fitAddon.fit(); } catch (_) {}\n" + " });\n" + "};\n" + "if ('ResizeObserver' in window) new ResizeObserver(scheduleFit).observe(terminalHost);\n" + "window.addEventListener('resize', scheduleFit);\n" + "const textValue = (value, fallback) => typeof value === 'string' && value.length > 0 ? value : fallback;\n" + "const updateStatus = (status) => {\n" + " const wifi = status !== null && typeof status === 'object' ? status.wifi : null;\n" + " if (wifi && wifi.available) {\n" + " const parts = [textValue(wifi.state, 'unknown')];\n" + " if (typeof wifi.sta_ipv4 === 'string' && wifi.sta_ipv4 !== '0.0.0.0') parts.push(wifi.sta_ipv4);\n" + " if (Number.isFinite(wifi.rssi)) parts.push(`${wifi.rssi} dBm`);\n" + " if (Number.isFinite(wifi.channel) && wifi.channel > 0) parts.push(`channel ${wifi.channel}`);\n" + " if (wifi.ap_running && Number.isFinite(wifi.ap_clients)) parts.push(`AP clients ${wifi.ap_clients}`);\n" + " wifiSummary.textContent = parts.join(' · ');\n" + " } else {\n" + " wifiSummary.textContent = 'Unavailable';\n" + " }\n" + " const serial = status !== null && typeof status === 'object' ? status.serial : null;\n" + " if (serial && typeof serial === 'object') {\n" + " const parts = [serial.running ? 'Running' : 'Stopped'];\n" + " if (serial.config_available) {\n" + " if (Number.isFinite(serial.baud)) parts.push(`${serial.baud} baud`);\n" + " parts.push(`${textValue(serial.data_bits, '?')} data`);\n" + " parts.push(`${textValue(serial.parity, '?')} parity`);\n" + " parts.push(`${textValue(serial.stop_bits, '?')} stop`);\n" + " parts.push(`${textValue(serial.flow, '?')} flow`);\n" + " }\n" + " serialSummary.textContent = parts.join(' · ');\n" + " } else {\n" + " serialSummary.textContent = 'Unavailable';\n" + " }\n" + " const broker = status !== null && typeof status === 'object' ? status.broker : null;\n" + " if (broker && broker.available) {\n" + " brokerClientsField.textContent = validId(broker.clients) ? String(broker.clients) : '—';\n" + " if (validId(broker.writer)) {\n" + " writerId = broker.writer;\n" + " writerIdField.textContent = displayId(writerId, 'None');\n" + " }\n" + " } else {\n" + " brokerClientsField.textContent = '—';\n" + " }\n" + "};\n" + "async function pollStatus() {\n" + " if (unloading || statusInFlight) return;\n" + " statusInFlight = true;\n" + " try {\n" + " const response = await fetch('/api/status', {credentials: 'same-origin', cache: 'no-store'});\n" + " if (!response.ok) throw new Error('status request failed');\n" + " updateStatus(await response.json());\n" + " } catch (_) {\n" + " wifiSummary.textContent = 'Unavailable';\n" + " serialSummary.textContent = 'Unavailable';\n" + " brokerClientsField.textContent = '—';\n" + " } finally {\n" + " statusInFlight = false;\n" + " }\n" + "}\n" + "const shutdown = () => {\n" + " if (unloading) return;\n" + " unloading = true;\n" + " ++connectionGeneration;\n" + " clearReconnectTimer();\n" + " if (statusTimer !== null) window.clearInterval(statusTimer);\n" + " if (ticketAbort !== null) ticketAbort.abort();\n" + " if (socket !== null) socket.close();\n" + " socket = null;\n" + "};\n" + "window.addEventListener('pagehide', shutdown, {once: true});\n" + "updateControls();\n" + "scheduleFit();\n" + "pollStatus();\n" + "statusTimer = window.setInterval(pollStatus, 5000);\n" + "connect();\n" + "})();\n"; + +typedef struct { + const char *content_type; + const char *cache_control; + const char *content_encoding; + const uint8_t *data; + size_t length; + bool content_security_policy; +} web_ui_response_t; + +static esp_err_t describe_resource(web_ui_resource_t resource, + web_ui_response_t *response) +{ + response->cache_control = WEB_UI_ASSET_CACHE_CONTROL; + response->content_encoding = NULL; + response->content_security_policy = false; + + switch (resource) { + case WEB_UI_RESOURCE_INDEX: + response->content_type = "text/html; charset=utf-8"; + response->cache_control = WEB_UI_DOCUMENT_CACHE_CONTROL; + response->data = (const uint8_t *)s_index_html; + response->length = sizeof(s_index_html) - 1U; + response->content_security_policy = true; + return ESP_OK; + case WEB_UI_RESOURCE_XTERM_JS: + response->content_type = "text/javascript; charset=utf-8"; + response->content_encoding = "gzip"; + response->data = web_asset_xterm_js_gz; + response->length = web_asset_xterm_js_gz_size; + return ESP_OK; + case WEB_UI_RESOURCE_XTERM_CSS: + response->content_type = "text/css; charset=utf-8"; + response->content_encoding = "gzip"; + response->data = web_asset_xterm_css_gz; + response->length = web_asset_xterm_css_gz_size; + return ESP_OK; + case WEB_UI_RESOURCE_ADDON_FIT_JS: + response->content_type = "text/javascript; charset=utf-8"; + response->content_encoding = "gzip"; + response->data = web_asset_addon_fit_js_gz; + response->length = web_asset_addon_fit_js_gz_size; + return ESP_OK; + case WEB_UI_RESOURCE_APP_JS: + response->content_type = "text/javascript; charset=utf-8"; + response->cache_control = WEB_UI_DOCUMENT_CACHE_CONTROL; + response->data = (const uint8_t *)s_app_js; + response->length = sizeof(s_app_js) - 1U; + return ESP_OK; + default: + return ESP_ERR_INVALID_ARG; + } +} + +static esp_err_t set_response_headers(httpd_req_t *request, + const web_ui_response_t *response) +{ + esp_err_t result = httpd_resp_set_type(request, response->content_type); + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "Cache-Control", + response->cache_control); + } + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "X-Content-Type-Options", + "nosniff"); + } + if (result == ESP_OK) { + result = httpd_resp_set_hdr(request, "Referrer-Policy", "no-referrer"); + } + if (result == ESP_OK && response->content_encoding != NULL) { + result = httpd_resp_set_hdr(request, "Content-Encoding", + response->content_encoding); + } + if (result == ESP_OK && response->content_security_policy) { + result = httpd_resp_set_hdr( + request, "Content-Security-Policy", + "default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; " + "connect-src 'self'; base-uri 'none'; form-action 'none'; " + "frame-ancestors 'none'"); + } + return result; +} + +esp_err_t web_ui_send_response(httpd_req_t *request, + web_ui_resource_t resource) +{ + if (request == NULL) { + return ESP_ERR_INVALID_ARG; + } + + web_ui_response_t response = {0}; + esp_err_t result = describe_resource(resource, &response); + if (result == ESP_OK) { + result = set_response_headers(request, &response); + } + if (result == ESP_OK) { + result = httpd_resp_send(request, (const char *)response.data, + (ssize_t)response.length); + } + return result; +} diff --git a/src/web_ui.h b/src/web_ui.h new file mode 100644 index 0000000..675c205 --- /dev/null +++ b/src/web_ui.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-3.0-only */ +/* Offline browser UI response helpers for authenticated HTTPS routes. */ + +#pragma once + +#include "esp_err.h" +#include "esp_http_server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + WEB_UI_RESOURCE_INDEX = 0, + WEB_UI_RESOURCE_XTERM_JS, + WEB_UI_RESOURCE_XTERM_CSS, + WEB_UI_RESOURCE_ADDON_FIT_JS, + WEB_UI_RESOURCE_APP_JS, +} web_ui_resource_t; + +/* + * Send one UI resource after the caller has authenticated the request. + * This module deliberately performs no authentication or URI dispatch. + */ +esp_err_t web_ui_send_response(httpd_req_t *request, + web_ui_resource_t resource); + +#ifdef __cplusplus +} +#endif diff --git a/web_assets/SOURCES.md b/web_assets/SOURCES.md new file mode 100644 index 0000000..121a2ba --- /dev/null +++ b/web_assets/SOURCES.md @@ -0,0 +1,29 @@ +# Vendored web assets + +These browser distributions were downloaded from the exact-version npm packages via unpkg. + +| Package | Version | License | Local files | Upstream URLs | +| --- | --- | --- | --- | --- | +| `@xterm/xterm` | `5.5.0` | MIT (`xterm.LICENSE`) | `xterm.js`, `xterm.css` | , , | +| `@xterm/addon-fit` | `0.10.0` | MIT (`addon-fit.LICENSE`) | `addon-fit.js` | , | + +Package metadata: and . + +The `.gz` files are deterministic build artifacts generated from the corresponding JS/CSS files with `gzip -9 -n -c`. The `-n` option omits source names and timestamps. PlatformIO's ESP-IDF/SCons bridge cannot reliably compile ESP-IDF's generated `BUILD_DIR/*.S` files, so `generate_embedded_assets.py` converts the compressed files into the deterministic `src/web_assets_data.c` byte arrays used by the firmware: + +```sh +python3 web_assets/generate_embedded_assets.py +``` + +## SHA-256 verification + +| File | SHA-256 | +| --- | --- | +| `xterm.js` | `1f991ac3b4b283ebf96e60ae23a00a52765dd3a2e46fa6fdda9f1aab032f7495` | +| `xterm.css` | `ba8e6985669488981ccf40c0cefe3aba80722cb6c92de7ad628b0bd717faf2b6` | +| `addon-fit.js` | `bdaefa370b1bfc42ee88d46fe6072400902a4d4b2d45cd93438dda9b23c97089` | +| `xterm.LICENSE` | `b569f629d00f2626a8100df2a1798210535621e42164dfd426a6fe5aac7b0ccd` | +| `addon-fit.LICENSE` | `e256f01188af527e4d06d21d06fbf785ae9c50d4b328bf03cbe0ba7f0aa4228f` | +| `xterm.js.gz` | `042c744ad77ddeda439cc095a70a9b29c62eca541b18cd0d3ac80081cc492f50` | +| `xterm.css.gz` | `876ead49256d30169786511ff27300116634d21951e46f373d19191928d385f3` | +| `addon-fit.js.gz` | `163634a1eb3c4d7ec77faeb1bd60255872f2558e5c28756bfabb48cc00feafc5` | diff --git a/web_assets/addon-fit.LICENSE b/web_assets/addon-fit.LICENSE new file mode 100644 index 0000000..8f17892 --- /dev/null +++ b/web_assets/addon-fit.LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019, The xterm.js authors (https://github.com/xtermjs/xterm.js) + +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/web_assets/addon-fit.js b/web_assets/addon-fit.js new file mode 100644 index 0000000..0388971 --- /dev/null +++ b/web_assets/addon-fit.js @@ -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=addon-fit.js.map \ No newline at end of file diff --git a/web_assets/addon-fit.js.gz b/web_assets/addon-fit.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..b2c2511356c3550e4a7170d7da394305f2cc3866 GIT binary patch literal 641 zcmV-{0)G7;iwFP!000021C>-wkJB&^z4I&DAXTBU#6(GI=97Fl`)-uqS-pq+1^BQ%jY8A4qTk5kpPbeH0i085Q>^l-Fh<0$QFO}gaB zk7L;)H5QVdF$8kXy9}dI&l^};Z`jl|LAJ1(BtTR8K)iw3VbM@^kwg0rSSUjU3WU}2Rz!3*v~`1sO(-}&@lB4K$bekQc#L* zWQNPS?pc>0Zdb7| z4d5G7lq-bn3bzW#Sq+E{_XY@4iHK{Q1xNpN>2f!$Sp9)*HDfa%!o9+WCf z_UyiAFXDEaD`PAXlm5JTW#I}O@XsIO)#P-NXyZTXZx)0 str: + lines = [] + for offset in range(0, len(data), 12): + chunk = data[offset : offset + 12] + lines.append(" " + ", ".join(f"0x{value:02x}" for value in chunk) + ",") + return "\n".join(lines) + + +def main() -> None: + header = """/* SPDX-License-Identifier: GPL-3.0-only */ +/* Generated web-asset data declarations. */ + +#pragma once + +#include +#include + +""" + source = """/* SPDX-License-Identifier: MIT */ +/* + * Deterministically generated from the vendored MIT-licensed gzip files in + * web_assets/. See web_assets/SOURCES.md and the accompanying license files. + * Regenerate with: python3 web_assets/generate_embedded_assets.py + */ + +#include "web_assets_data.h" + +""" + + for filename, symbol in ASSETS: + data = (ASSET_DIR / filename).read_bytes() + header += f"extern const uint8_t {symbol}[];\n" + header += f"extern const size_t {symbol}_size;\n\n" + source += ( + f"const uint8_t {symbol}[] __attribute__((aligned(4))) = {{\n" + f"{format_array(data)}\n" + "};\n" + f"const size_t {symbol}_size = sizeof({symbol});\n\n" + ) + + HEADER_PATH.write_text(header, encoding="utf-8", newline="\n") + SOURCE_PATH.write_text(source, encoding="utf-8", newline="\n") + + +if __name__ == "__main__": + main() diff --git a/web_assets/xterm.LICENSE b/web_assets/xterm.LICENSE new file mode 100644 index 0000000..4472336 --- /dev/null +++ b/web_assets/xterm.LICENSE @@ -0,0 +1,21 @@ +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/web_assets/xterm.css b/web_assets/xterm.css new file mode 100644 index 0000000..e97b643 --- /dev/null +++ b/web_assets/xterm.css @@ -0,0 +1,218 @@ +/** + * 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:not(.debug), +.xterm .xterm-message { + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: 0; + z-index: 10; + color: transparent; + pointer-events: none; +} + +.xterm .xterm-accessibility-tree:not(.debug) *::selection { + color: transparent; +} + +.xterm .xterm-accessibility-tree { + user-select: text; + white-space: pre; +} + +.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/web_assets/xterm.css.gz b/web_assets/xterm.css.gz new file mode 100644 index 0000000000000000000000000000000000000000..55832bb7dc42ac9f1a8f7441ae6181197cd46364 GIT binary patch literal 2071 zcmV+y2ed(~GZS|2~2!AI!I#hViI#K3uU0oRvTpJ9@4 zcr{#Q&1Vg)Fo{&U37s?rdr^bpnyV#`n+F+Od-&&51G!175tmeW{SVT`F${f zfrxmn`2|rY#w>KZ)tU>F6w_uTvsRQmKewECy7I5Iybnl=Yub9iQ=zqxIS36XfKT6G zu2^n(+yIosLCzpbn40qj7zr$Yg9TR_3FOo;k&Ao|3?kH>_~B)fASW$nX2lf8`!O)B zWh5A~gjhyJ#&g3AiJXa)YdAOPrVnFB@!`VCi8)J&p~!)bt5aB^d9pC%Iio~GY#Mke zN{g5@sg6^T2`7ZeOLr4LWL;=9g%oZ;CSx(9Pj2m76w_4bqye!Y?$g5Hrlw8nw+30$ zk_t3Wt#ZgjpaItCwT|{030jbIjdPc#omC>UZF_{(YF4Nm1#?RlOLU)=`^+OlJ47*) zX)0G_V)dy~`j#q0M%GBWS*i(7cRuZs)DHf3CqXzQd%EFpGQwp8%^gi@ z>Zf4rH=r{L#^jm)D7?3pl6R3Pw0w|s=$DMh^V!)Oh616l<+ z#QYLDCdnJ-q{kn!~yx1&Re?LP`5ETd^s*MW1nj5>bklJEE8!bo?=$5?P zM{rXfDv!v~#zN2CwwGz|*wKnlUxYby{8yz$bB4IB8*bIME2kQwEyjZHkwE$3B|Ien zbhp=Pv#FLT0&J-ScDFWMmj7E9(N76%e|iGF{#s#9#V;$gA@E8t@aSffuoCJcmSaYt zOR;lE6;lMHs`v%>zQtj-Sa7C*x`SLa-D%5yI&p3Ia?}`)!ho>HDx+9T&8IeCYUS3; z44bFOH_U^3g6f(H^($u_Rsv;O1^K9A%4Y_90c|i-8fbHY+BM=hEQJ=+lvmmx^RHa6 zNSL=;31Zs@@1OX?v;7dPL~N3Jm2fJqdRcqO`%(uC9u!|6}9!1RZ=PHc9j8@L90X5WRb^h`1$hExhIk- zmFmy^e!twnVPcW8x6PV67N(=t);_;FX;qU&1O?8xTJSWL(aV8!CKBrDYiEQxgk$)< z92o=+sDBhf+0kHKO;xH&8Xqu6*9A2zs4ZZ!{ZSn7l2^H=_Ei-`50xw#-fZDrT%zP@ zr>U*%EHnFZKc}bC7@67So+Dh{eLo7V$0$m)c?aAMs&t4W+V5@Pimh#t+PbZhye9K# zDEBhXG(>NMqQ%9WzzEf0%h%Vpua%ZiMbDX{4 zIqJqv7`9J$`mfvFU zkfnQI&w0+3eWFJxzSr%$k-nXyoYRz_4pFYy^6eeE&xa)%a>i-OF9#`^eaLT7R-_bt+H+yv zqpi+2y;<%3m~(3hhcrLR>iQ(B6W%|{@zY6;N279--{*HUJQ}T|9KW3Acp{4Q-Ovj+ z3D(#=ITlJQ!`;~oryCrqlCLRnILhh!H0(KhXDH*R8iaqjIs54lBK?0N_Ag_5@NkH* zJ#a1k*Db(W-zLY=IO(Y(t=ncz^^YGPGPYaKI~`?5-(9iSHzx+V{{n#h>zKC{005n; B`CtG5 literal 0 HcmV?d00001 diff --git a/web_assets/xterm.js b/web_assets/xterm.js new file mode 100644 index 0000000..7ca75f8 --- /dev/null +++ b/web_assets/xterm.js @@ -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]}}(globalThis,(()=>(()=>{"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(9924),a=i(844),h=i(4725),c=i(2585),l=i(3656);let d=t.AccessibilityManager=class extends a.Disposable{constructor(e,t,i,s){super(),this._terminal=e,this._coreBrowserService=i,this._renderService=s,this._rowColumns=new WeakMap,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=this._coreBrowserService.mainDocument.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=this._coreBrowserService.mainDocument.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;ethis._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=this._coreBrowserService.mainDocument.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new o.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.register((0,l.addDisposableDomListener)(document,"selectionchange",(()=>this._handleSelectionChange()))),this.register(this._coreBrowserService.onDprChange((()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,a.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_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.lines.get(i.ydisp+r),t=[],n=e?.translateToString(!0,void 0,void 0,t)||"",o=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===n.length?(a.innerText=" ",this._rowColumns.set(a,[0,1])):(a.textContent=n,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",o),a.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()}_handleSelectionChange(){if(0===this._rowElements.length)return;const e=document.getSelection();if(!e)return;if(e.isCollapsed)return void(this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection());if(!e.anchorNode||!e.focusNode)return void console.error("anchorNode and/or focusNode are null");let t={node:e.anchorNode,offset:e.anchorOffset},i={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(i.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===i.node&&t.offset>i.offset)&&([t,i]=[i,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;const s=this._rowElements.slice(-1)[0];if(i.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(i={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(i.node))return;const r=({node:e,offset:t})=>{const i=e instanceof Text?e.parentNode:e;let s=parseInt(i?.getAttribute("aria-posinset"),10)-1;if(isNaN(s))return console.warn("row is invalid. Race condition?"),null;const r=this._rowColumns.get(i);if(!r)return console.warn("columns is null. Race condition?"),null;let n=t=this._terminal.cols&&(++s,n=0),{row:s,column:n}},n=r(t),o=r(i);if(n&&o){if(n.row>o.row||n.row===o.row&&n.column>=o.column)throw new Error("invalid range");this._terminal.select(n.column,n.row,(o.row-n.row)*this._terminal.cols-n.column+o.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;ee;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=this._coreBrowserService.mainDocument.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{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"[200~"+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))}}}},3551: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.Linkifier=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585),c=i(4725);let l=t.Linkifier=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseService=t,this._renderService=i,this._bufferService=s,this._linkProviderService=r,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._activeProviderReplies?.clear()}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0}))),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){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e{e?.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let i=!1;for(const[s,r]of this._linkProviderService.linkProviders.entries())if(t){const t=this._activeProviderReplies?.get(s);t&&(i=this._checkLinkProviderResult(s,e,i))}else r.provideLinks(e.y,(t=>{if(this._isMouseOut)return;const r=t?.map((e=>({link:e})));this._activeProviderReplies?.set(s,r),i=this._checkLinkProviderResult(s,e,i),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;se?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){if(!this._activeProviderReplies)return i;const s=this._activeProviderReplies.get(e);let r=!1;for(let t=0;tthis._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!i)for(let e=0;ethis._linkAtPosition(e.link,t)));if(s){i=!0,this._handleNewLink(s);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!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._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._lastMouseEvent)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:()=>this._currentLink?.state?.decorations.pointerCursor,set:e=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",e))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:t=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),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)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){this._currentLink?.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){this._currentLink?.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.Linkifier=l=s([r(1,c.IMouseService),r(2,c.IRenderService),r(3,h.IBufferService),r(4,c.ILinkProviderService)],l)},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){const i=this._bufferService.buffer.lines.get(e-1);if(!i)return void t(void 0);const s=[],r=this._optionsService.rawOptions.linkHandler,o=new n.CellData,a=i.getTrimmedLength();let c=-1,l=-1,d=!1;for(let t=0;tr?r.activate(e,t,n):h(0,t),hover:(e,t)=>r?.hover?.(e,t,n),leave:(e,t)=>r?.leave?.(e,t,n)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,c=o.extended.urlId):(l=-1,c=-1)}}t(s)}};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.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._renderCallback=e,this._coreBrowserService=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._coreBrowserService.window.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._coreBrowserService.window.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=[]}}},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(3551),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),w=i(8969),y=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=i(779);class P extends w.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 y.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new y.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new y.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new y.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new y.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new y.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new y.EventEmitter),this._onBlur=this.register(new y.EventEmitter),this._onA11yCharEmitter=this.register(new y.EventEmitter),this._onA11yTabEmitter=this.register(new y.EventEmitter),this._onWillOpen=this.register(new y.EventEmitter),this._setup(),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this._linkProviderService=this._instantiationService.createInstance(O.LinkProviderService),this._instantiationService.setService(S.ILinkProviderService,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),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,y.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,y.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.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.channels.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.channels.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.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.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){if(!e)throw new Error("Terminal requires a parent element.");if(e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this.element?.ownerDocument.defaultView&&this._coreBrowserService)return void(this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView));this._document=e.ownerDocument,this.options.documentOverride&&this.options.documentOverride instanceof Document&&(this._document=this.optionsService.rawOptions.documentOverride),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 t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),t.appendChild(this._viewportElement),this._viewportScrollArea=this._document.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this.register((0,r.addDisposableDomListener)(this.screenElement,"mousemove",(e=>this.updateCursorStyle(e)))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement),this.textarea=this._document.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.register(this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??"undefined"!=typeof window?window.document:null)),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=this._document.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._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.linkifier=this.register(this._instantiationService.createInstance(n.Linkifier,this.screenElement)),this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch{}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),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.linkifier)),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.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,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}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(e._customWheelEventHandler&&!1===e._customWheelEventHandler(t))return!1;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||(s.mouseup=n.mouseup):(this._document.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._customWheelEventHandler&&!1===this._customWheelEventHandler(e))return!1;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{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){this._renderService?.refreshRows(e,t)}updateCursorStyle(e){this._selectionService?.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){1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):this.viewport?.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this._customWheelEventHandler=e}registerLinkProvider(e){return this._linkProviderService.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(){this._selectionService?.clearSelection()}selectAll(){this._selectionService?.selectAll()}selectLines(e,t){this._selectionService?.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){this._charSizeService?.measure(),this.viewport?.syncScrollArea(!0)}clear(){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{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._renderDimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderDimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderDimensions.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&&i0&&(i=e),s=""}}return{bufferElements:r,cursorElement:i}}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(4725),o=i(844),a=i(2585);let h=t.BufferDecorationRenderer=class extends o.Disposable{constructor(e,t,i,s,r){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=i,this._decorationService=s,this._renderService=r,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(this._coreBrowserService.onDprChange((()=>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,o.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){const t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer","top"===e?.options?.layer),t.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,t.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",t.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",t.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const i=e.options.x??0;return i&&i>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_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){if(!t)return;const i=e.options.x??0;"right"===(e.options.anchor||"left")?t.style.right=i?i*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=i?i*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,n.ICoreBrowserService),r(3,a.IDecorationService),r(4,n.IRenderService)],h)},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=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(4725),a=i(844),h=i(2585),c={full:0,left:0,center:0,right:0},l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=t.OverviewRulerRenderer=class extends a.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,h){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowserService=h,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),this._viewportElement.parentElement?.insertBefore(this._canvas,this._viewportElement);const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,a.toDisposable)((()=>{this._canvas?.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(this._coreBrowserService.onDprChange((()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);l.full=this._canvas.width,l.left=e,l.center=t,l.right=e,this._refreshDrawHeightConstants(),d.full=0,d.left=0,d.center=l.left,d.right=l.left+l.center}_refreshDrawHeightConstants(){c.full=Math.round(2*this._coreBrowserService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);c.left=t,c.center=t,c.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.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._coreBrowserService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowserService.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(d[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-c[e.position||"full"]/2),l[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+c[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,o.IRenderService),r(5,h.IOptionsService),r(6,o.ICoreBrowserService)],_)},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.lengththis.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=0&&et?"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;s0?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&&he?"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(6052),l=i(4725),d=i(8055),_=i(8460),u=i(844),f=i(2585),v="xterm-dom-renderer-owner-",p="xterm-rows",g="xterm-fg-",m="xterm-bg-",S="xterm-focus",C="xterm-selection";let b=1,w=t.DomRenderer=class extends u.Disposable{constructor(e,t,i,s,r,a,l,d,f,g,m,S,w){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=l,this._charSizeService=f,this._optionsService=g,this._bufferService=m,this._coreBrowserService=S,this._themeService=w,this._terminalClass=b++,this._rowElements=[],this._selectionRenderModel=(0,c.createSelectionRenderModel)(),this.onRequestRedraw=this.register(new _.EventEmitter).event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add(p),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=this._document.createElement("div"),this._selectionContainer.classList.add(C),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=d.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(v+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,u.toDisposable)((()=>{this._element.classList.remove(v+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(this._document,this._helperContainer),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=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${p} 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=this._document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${p} { 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} .${p} .xterm-dim { color: ${d.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;}`;const i=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,r=`blink_block_${this._terminalClass}`;t+=`@keyframes ${i} { 50% { border-bottom-style: hidden; }}`,t+=`@keyframes ${s} { 50% { box-shadow: none; }}`,t+=`@keyframes ${r} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${g}${i} { color: ${s.css}; }${this._terminalSelector} .${g}${i}.xterm-dim { color: ${d.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${m}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${m}${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=this._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(),this.handleSelectionChanged(this._selectionRenderModel.selectionStart,this._selectionRenderModel.selectionEnd,this._selectionRenderModel.columnSelectMode)}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(S),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add(S),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;this._selectionRenderModel.update(this._terminal,e,t,i);const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,n=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow;if(n>=this._bufferService.rows||o<0)return;const a=this._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=this._document.createElement("div"),n=t*this.dimensions.css.cell.width;let o=this.dimensions.css.cell.width*(i-t);return n+o>this.dimensions.css.canvas.width&&(o=this.dimensions.css.canvas.width-n),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${n}px`,r.style.width=`${o}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`.${v}${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=w=s([r(7,f.IInstantiationService),r(8,l.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,l.ICoreBrowserService),r(12,l.IThemeService)],w)},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&&b0&&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(w&&(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){I.isInvisible()?y+=o.WHITESPACE_CELL_CHAR:y+=N,w++;continue}w&&(C.textContent=y),C=this._document.createElement("span"),w=0,y=""}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&&this._coreService.isCursorInitialized)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"),y=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===y&&(y=" "),!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")," "===y&&(y=" ")),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.channels.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.channels.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,G)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=y:w++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&w&&(C.textContent=y),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(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,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=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t=i[0]&&e=i[0])}};function v(e,t,i){for(;e.length{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e,t){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.classList.add("xterm-width-cache-measure-container"),this._container.setAttribute("aria-hidden","true"),this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const i=e.createElement("span");i.classList.add("xterm-char-measure-element");const s=e.createElement("span");s.classList.add("xterm-char-measure-element"),s.style.fontWeight="bold";const r=e.createElement("span");r.classList.add("xterm-char-measure-element"),r.style.fontStyle="italic";const n=e.createElement("span");n.classList.add("xterm-char-measure-element"),n.style.fontWeight="bold",n.style.fontStyle="italic",this._measureElements=[i,s,r,n],this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),this._container.appendChild(n),t.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){if(-9999!==this._flat[s])return this._flat[s];const t=this._measure(e,0);return t>0&&(this._flat[s]=t),t}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),n>0&&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}function s(e){return e>=128512&&e<=128591||e>=127744&&e<=128511||e>=128640&&e<=128767||e>=9728&&e<=9983||e>=9984&&e<=10175||e>=65024&&e<=65039||e>=129280&&e<=129535||e>=127462&&e<=127487}Object.defineProperty(t,"__esModule",{value:!0}),t.computeNextVariantOffset=t.createRenderDimensions=t.treatGlyphAsBackgroundColor=t.allowRescaling=t.isEmoji=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.isEmoji=s,t.allowRescaling=function(e,t,r,n){return 1===t&&r>Math.ceil(1.5*n)&&void 0!==e&&e>255&&!s(e)&&!i(e)&&!function(e){return 57344<=e&&e<=63743}(e)},t.treatGlyphAsBackgroundColor=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}}}},t.computeNextVariantOffset=function(e,t,i=0){return(e-(2*Math.round(t)-i))%(2*Math.round(t))}},6052:(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=e.buffers.active.ydisp,n=t[1]-r,o=i[1]-r,a=Math.max(n,0),h=Math.min(o,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=n,this.viewportEndRow=o,this.viewportCappedStartRow=a,this.viewportCappedEndRow=h,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.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i=this.startCol&&t=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},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;try{this._measureStrategy=this.register(new d(this._optionsService))}catch{this._measureStrategy=this.register(new l(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 extends a.Disposable{constructor(){super(...arguments),this._result={width:0,height:0}}_validateAndSet(e,t){void 0!==e&&e>0&&void 0!==t&&t>0&&(this._result.width=e,this._result.height=t)}}class l extends c{constructor(e,t,i){super(),this._document=e,this._parentElement=t,this._optionsService=i,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(){return this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`,this._validateAndSet(Number(this._measureElement.offsetWidth)/32,Number(this._measureElement.offsetHeight)),this._result}}class d extends c{constructor(e){super(),this._optionsService=e,this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");const t=this._ctx.measureText("W");if(!("width"in t&&"fontBoundingBoxAscent"in t&&"fontBoundingBoxDescent"in t))throw new Error("Required font metrics not supported")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;const e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),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;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0;const s=i(844),r=i(8460),n=i(3656);class o extends s.Disposable{constructor(e,t,i){super(),this._textarea=e,this._window=t,this.mainDocument=i,this._isFocused=!1,this._cachedIsFocused=void 0,this._screenDprMonitor=new a(this._window),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._onWindowChange=this.register(new r.EventEmitter),this.onWindowChange=this._onWindowChange.event,this.register(this.onWindowChange((e=>this._screenDprMonitor.setWindow(e)))),this.register((0,r.forwardEvent)(this._screenDprMonitor.onDprChange,this._onDprChange)),this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get window(){return this._window}set window(e){this._window!==e&&(this._window=e,this._onWindowChange.fire(this._window))}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}}t.CoreBrowserService=o;class a extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this.register(new s.MutableDisposable),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this.register((0,s.toDisposable)((()=>this.clearListener())))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,n.addDisposableDomListener)(this._parentWindow,"resize",(()=>this._setDprAndFireIfDiffers()))}_setDprAndFireIfDiffers(){this._parentWindow.devicePixelRatio!==this._currentDevicePixelRatio&&this._onDprChange.fire(this._parentWindow.devicePixelRatio),this._updateDpr()}_updateDpr(){this._outerListener&&(this._resolutionMediaMatchList?.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._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._outerListener=void 0)}}},779:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(844);class r extends s.Disposable{constructor(){super(),this.linkProviders=[],this.register((0,s.toDisposable)((()=>this.linkProviders.length=0)))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{const t=this.linkProviders.indexOf(e);-1!==t&&this.linkProviders.splice(t,1)}}}}t.LinkProviderService=r},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(6193),o=i(4725),a=i(8460),h=i(844),c=i(7226),l=i(2585);let d=t.RenderService=class extends h.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,o,l,d){super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new h.MutableDisposable),this._pausedResizeTask=new c.DebouncedIdleTask,this._observerDisposable=this.register(new h.MutableDisposable),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 a.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new a.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new a.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new a.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new n.RenderDebouncer(((e,t)=>this._renderRows(e,t)),l),this.register(this._renderDebouncer),this.register(l.onDprChange((()=>this.handleDevicePixelRatioChange()))),this.register(o.onResize((()=>this._fullRefresh()))),this.register(o.buffers.onBufferActivate((()=>this._renderer.value?.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","rescaleOverlappingGlyphs"],(()=>{this.clear(),this.handleResize(o.cols,o.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(o.buffer.y,o.buffer.y,!0)))),this.register(d.onChangeColors((()=>this._fullRefresh()))),this._registerIntersectionObserver(l.window,t),this.register(l.onWindowChange((e=>this._registerIntersectionObserver(e,t))))}_registerIntersectionObserver(e,t){if("IntersectionObserver"in e){const i=new e.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});i.observe(t),this._observerDisposable.value=(0,h.toDisposable)((()=>i.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&&(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(){this._renderer.value&&(this._renderer.value.clearTextureAtlas?.(),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(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,t,i){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,this._renderer.value?.handleSelectionChanged(e,t,i)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};t.RenderService=d=s([r(2,l.IOptionsService),r(3,o.ICharSizeService),r(4,l.IDecorationService),r(5,l.IBufferService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],d)},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]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]=t[0]&&e[0]=t[0]}_selectWordAtCursor(e,t){const i=this._linkifier.currentLink?.link?.range;if(i)return this._model.selectionStart=[i.start.x-1,i.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const s=this._getMouseBufferCoords(e);return!!s&&(this._selectWordAt(s,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]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]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(;h1&&(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(;i1&&(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(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.ILinkProviderService=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"),t.ILinkProviderService=(0,s.createDecorator)("LinkProviderService")},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{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;ithis._length)for(let t=this._length;t=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;tthis._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{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)=>{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;let i=0,s=0,r=0,n=0;var o,a,h,c,l;function d(e){const t=e.toString(16);return t.length<2?"0"+t:t}function _(e,t){return e>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(o||(t.channels=o={})),function(e){function t(e,t){return n=Math.round(255*t),[i,s,r]=l.toChannels(e.rgba),{css:o.toCss(i,s,r,n),rgba:o.toRgba(i,s,r,n)}}e.blend=function(e,t){if(n=(255&t.rgba)/255,1===n)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=l.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=l.toChannels(t),{css:o.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return n=255&e.rgba,t(e,n*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(a||(t.color=a={})),function(e){let t,a;try{const e=document.createElement("canvas");e.width=1,e.height=1;const i=e.getContext("2d",{willReadFrequently:!0});i&&(t=i,t.globalCompositeOperation="copy",a=t.createLinearGradient(0,0,1,1))}catch{}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),n=parseInt(e.slice(4,5).repeat(2),16),o.toColor(i,s,r,n);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 h=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(h)return i=parseInt(h[1]),s=parseInt(h[2]),r=parseInt(h[3]),n=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),o.toColor(i,s,r,n);if(!t||!a)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=a,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[i,s,r,n]=t.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i,s,r,n),css:e}}}(h||(t.css=h={})),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}(c||(t.rgb=c={})),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,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l0||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)),l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function a(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,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l>>0}e.blend=function(e,t){if(n=(255&t)/255,1===n)return t;const a=t>>24&255,h=t>>16&255,c=t>>8&255,l=e>>24&255,d=e>>16&255,_=e>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),o.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=c.relativeLuminance(e>>8),n=c.relativeLuminance(i>>8);if(_(r,n)>8));if(o_(r,c.relativeLuminance(t>>8))?n:t}return n}const o=a(e,i,s),h=_(r,c.relativeLuminance(o>>8));if(h_(r,c.relativeLuminance(n>>8))?o:n}return o}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(l||(t.rgba=l={})),t.toPaddedHex=d,t.contrastRatio=_},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=>{this._onScrollApi?.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)}input(e,t=!0){this.coreService.triggerDataEvent(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.runAndSubscribe=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;tt.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(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(1480),g=i(6242),m=i(6351),S=i(5941),C={"(":0,")":1,"*":2,"+":3,"-":1,".":2},b=131072;function w(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 E=0;class k 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 L(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 g.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new g.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new g.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new g.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new g.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new g.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new g.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new g.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new g.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new g.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new g.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new g.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 m.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>b&&(n=this._parseStack.position+b)}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.lengthb)for(let t=n;t0&&2===f.getWidth(this._activeBuffer.x-1)&&f.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;ga)if(h){const e=f;let t=this._activeBuffer.x-m;for(this._activeBuffer.x=m,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),f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),m>0&&f instanceof l.BufferLine&&f.copyCellsFrom(e,t,0,m,!1);t=0;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}else if(d&&(f.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===f.getWidth(a-1)&&f.setCellFromCodepoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,u)),f.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x0&&0===f.getWidth(this._activeBuffer.x)&&!f.hasContent(this._activeBuffer.x)&&f.setCellFromCodepoint(this._activeBuffer.x,0,1,u),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=>!w(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new m.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new g.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(){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&&this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)?.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()),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.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.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.ythis._activeBuffer.scrollBottom||this._activeBuffer.y65535?2:1}let h=a;for(let e=1;e0||(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;te?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=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t5)&&(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=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(!w(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(D(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,S.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=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,S.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=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._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=k;let L=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){ethis.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(E=e,e=t,t=E),ethis.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function D(e){return 0<=e&&e<256}L=s([r(0,v.IBufferService)],L)},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){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.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){return this._data.get(e,t)?.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 process&&"title"in process;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])===e))do{yield this._array[i]}while(++i=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r0&&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._ir)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=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}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}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}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}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&&et.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._cols0&&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(r0&&(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.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._memoryCleanupPosition100)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=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&&l0&&(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;t0;)0===this.ybase?this.y0){const e=[],t=[];for(let e=0;e=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+10;);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?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t{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.linee.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>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){268435456&s.bg&&(this._extendedAttrs[e]=s.extended),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s.fg,this._data[3*e+2]=s.bg}addCodepointToCell(e,t,i){let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,o.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&s)+(0,o.stringFromCodePoint)(t),s&=-2097152,s|=2097152):s=t|1<<22,i&&(s&=-12582913,s|=i<<22),this._data[3*e+0]=s}insertCells(e,t,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;sthis.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&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2=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=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e,t,i,s){t=t??0,i=i??this.length,e&&(i=Math.min(i,this.getTrimmedLength())),s&&(s.length=0);let r="";for(;t>22||1}return s&&s.push(t),r}}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=a&&r0&&(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;oi(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;hc&&(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="",e.STX="",e.ETX="",e.EOT="",e.ENQ="",e.ACK="",e.BEL="",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="",e.SI="",e.DLE="",e.DC1="",e.DC2="",e.DC3="",e.DC4="",e.NAK="",e.SYN="",e.ETB="",e.CAN="",e.EM="",e.SUB="",e.ESC="",e.FS="",e.GS="",e.RS="",e.US="",e.SP=" ",e.DEL=""}(i||(t.C0=i={})),function(e){e.PAD="€",e.HOP="",e.BPH="‚",e.NBH="ƒ",e.IND="„",e.NEL="…",e.SSA="†",e.ESA="‡",e.HTS="ˆ",e.HTJ="‰",e.VTS="Š",e.PLD="‹",e.PLU="Œ",e.RI="",e.SS2="Ž",e.SS3="",e.DCS="",e.PU1="‘",e.PU2="’",e.STS="“",e.CCH="”",e.MW="•",e.SPA="–",e.EPA="—",e.SOS="˜",e.SGCI="™",e.SCI="š",e.CSI="›",e.ST="œ",e.OSC="",e.PM="ž",e.APC="Ÿ"}(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:o.key=e.ctrlKey?"\b":s.C0.DEL,e.altKey&&(o.key=s.C0.ESC+o.key);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=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;r65535?(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)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=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)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,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(1480),r=[[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]],n=[[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 o;t.UnicodeV6=class{constructor(){if(this.version="6",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;et[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),r=0===i&&0!==t;if(r){const e=s.UnicodeService.extractWidth(t);0===e?r=!1:e>i&&(i=e)}return s.UnicodeService.createPropertyValue(0,i,r)}}},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;rt)),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.precedingJoinState=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;ts||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.precedingJoinState=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.precedingJoinState=0,this.currentState=15&this._parseStack.transition}for(let i=o;i>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=t||(r=e[s])<32||r>126&&r=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.precedingJoinState=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(++i47&&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.precedingJoinState=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=t||(r=e[s])<32||r>127&&r{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(;t0&&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;i256)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>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>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{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?"":`${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${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=>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){let s=0,r=0;for(const n of this._decorations.getKeyIterator(t))s=n.options.x??0,r=s+(n.options.width??1),e>=s&&e{a=t.options.x??0,h=a+(t.options.width??1),e>=a&&e{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;tJSON.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,documentOverride:null,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:{},rescaleOverlappingGlyphs:!1,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={...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={...i},this._setupOptions(),this.register((0,r.toDisposable)((()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null})))}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=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){return this._dataByLinkId.get(e)?.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);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}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,i=0;const s=e.length;for(let r=0;r=s)return t+this.wcwidth(o);const i=e.charCodeAt(r);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(o,i);let h=n.extractWidth(a);n.extractShouldJoin(a)&&(h-=n.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},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={...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()}input(e,t=!0){this._core.input(e,t)}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}attachCustomWheelEventHandler(e){this._core.attachCustomWheelEventHandler(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){return this._checkProposedApi(),this._verifyPositiveIntegers(e.x??0,e.width??0,e.height??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/web_assets/xterm.js.gz b/web_assets/xterm.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..5eb1cbb68eb0bbff4dd70bb0de576642d6745f8b GIT binary patch literal 67234 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 literal 0 HcmV?d00001